2020-06-06 18:37:35 -04:00
|
|
|
use crate::renderer::context_element::IceResult;
|
2020-05-31 13:52:20 -04:00
|
|
|
use crate::renderer::context_element::IntoContextElement;
|
|
|
|
use std::borrow::Borrow;
|
2020-05-31 20:41:27 -04:00
|
|
|
use std::rc::Rc;
|
2020-05-31 13:52:20 -04:00
|
|
|
|
2020-05-31 18:14:26 -04:00
|
|
|
pub struct BreadcrumbTree<'a> {
|
|
|
|
parent: Option<&'a BreadcrumbTree<'a>>,
|
|
|
|
element: BreadcrumbTreeElement<'a>,
|
2020-05-31 13:52:20 -04:00
|
|
|
}
|
|
|
|
|
2020-05-31 20:41:27 -04:00
|
|
|
#[derive(Clone, Debug)]
|
2020-05-31 18:14:26 -04:00
|
|
|
pub enum BreadcrumbTreeElement<'a> {
|
2020-05-31 20:41:27 -04:00
|
|
|
// Using Rc so that when we need to create BreadcrumbTrees with
|
|
|
|
// the same BreadcrumbTreeElement but a different parent (for
|
|
|
|
// example, when inserting behind the tail), we don't need to the
|
|
|
|
// copy the already owned/malloc'd data.
|
2020-06-06 17:52:46 -04:00
|
|
|
Owned(Rc<dyn IntoContextElement + 'a>),
|
2020-05-31 17:25:41 -04:00
|
|
|
Borrowed(&'a dyn IntoContextElement),
|
2020-05-31 13:52:20 -04:00
|
|
|
}
|
|
|
|
|
2020-06-06 18:37:35 -04:00
|
|
|
impl<'a> From<&'a IceResult<'a>> for BreadcrumbTreeElement<'a> {
|
|
|
|
fn from(inp: &'a IceResult<'a>) -> Self {
|
|
|
|
match inp {
|
|
|
|
IceResult::Owned(rc_ce) => {
|
|
|
|
BreadcrumbTreeElement::Borrowed(rc_ce.from_context_element())
|
|
|
|
}
|
|
|
|
IceResult::Borrowed(ce) => BreadcrumbTreeElement::Borrowed(ce.from_context_element()),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-31 18:14:26 -04:00
|
|
|
impl<'a> BreadcrumbTree<'a> {
|
|
|
|
pub fn new(parent: Option<&'a BreadcrumbTree>, element: BreadcrumbTreeElement<'a>) -> Self {
|
|
|
|
BreadcrumbTree {
|
2020-05-31 17:32:06 -04:00
|
|
|
parent: parent,
|
|
|
|
element: element,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-31 18:14:26 -04:00
|
|
|
pub fn get_ice(&self) -> &dyn IntoContextElement {
|
|
|
|
self.element.borrow()
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn get_parent(&self) -> Option<&BreadcrumbTree> {
|
|
|
|
self.parent
|
|
|
|
}
|
|
|
|
|
2020-05-31 20:41:27 -04:00
|
|
|
pub fn get_element(&self) -> &BreadcrumbTreeElement<'a> {
|
|
|
|
&self.element
|
|
|
|
}
|
|
|
|
|
2020-05-31 16:02:30 -04:00
|
|
|
pub fn ice_iter(&'a self) -> impl Iterator<Item = &dyn IntoContextElement> {
|
|
|
|
self.breadcrumb_iter().map(|b| b.get_ice())
|
2020-05-31 14:29:59 -04:00
|
|
|
}
|
2020-05-31 15:58:29 -04:00
|
|
|
|
|
|
|
pub fn breadcrumb_iter(&'a self) -> BreadcrumbTreeIterator<'a> {
|
|
|
|
BreadcrumbTreeIterator(Some(self))
|
|
|
|
}
|
2020-05-31 20:41:27 -04:00
|
|
|
|
|
|
|
pub fn clone_to_new_parent(&self, parent: Option<&'a BreadcrumbTree>) -> Self {
|
|
|
|
// TODO: Maybe not needed anymore?
|
|
|
|
BreadcrumbTree {
|
|
|
|
parent: parent,
|
|
|
|
element: self.element.clone(),
|
|
|
|
}
|
|
|
|
}
|
2020-05-31 14:29:59 -04:00
|
|
|
}
|
|
|
|
|
2020-05-31 18:14:26 -04:00
|
|
|
impl<'a> Borrow<dyn IntoContextElement + 'a> for BreadcrumbTreeElement<'a> {
|
2020-05-31 13:52:20 -04:00
|
|
|
fn borrow(&self) -> &(dyn IntoContextElement + 'a) {
|
|
|
|
match self {
|
2020-05-31 18:14:26 -04:00
|
|
|
BreadcrumbTreeElement::Owned(ice) => ice.as_ref(),
|
|
|
|
BreadcrumbTreeElement::Borrowed(ice) => *ice,
|
2020-05-31 13:52:20 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-31 18:14:26 -04:00
|
|
|
impl<'a> IntoIterator for &'a BreadcrumbTree<'a> {
|
|
|
|
type Item = &'a BreadcrumbTree<'a>;
|
2020-05-31 15:58:29 -04:00
|
|
|
type IntoIter = BreadcrumbTreeIterator<'a>;
|
|
|
|
|
|
|
|
fn into_iter(self) -> BreadcrumbTreeIterator<'a> {
|
|
|
|
self.breadcrumb_iter()
|
|
|
|
}
|
|
|
|
}
|
2020-05-31 14:27:31 -04:00
|
|
|
|
2020-05-31 18:14:26 -04:00
|
|
|
pub struct BreadcrumbTreeIterator<'a>(Option<&'a BreadcrumbTree<'a>>);
|
2020-05-31 15:58:29 -04:00
|
|
|
|
|
|
|
impl<'a> Iterator for BreadcrumbTreeIterator<'a> {
|
2020-05-31 18:14:26 -04:00
|
|
|
type Item = &'a BreadcrumbTree<'a>;
|
2020-05-31 15:58:29 -04:00
|
|
|
|
|
|
|
fn next(&mut self) -> Option<Self::Item> {
|
|
|
|
let ret = self.0;
|
|
|
|
self.0 = self.0.map(|node| node.get_parent()).flatten();
|
|
|
|
ret
|
2020-05-31 14:27:31 -04:00
|
|
|
}
|
|
|
|
}
|