58 lines
1.9 KiB
Rust
58 lines
1.9 KiB
Rust
use crate::renderer::context_element::IceResult;
|
|
use crate::renderer::context_element::IntoContextElement;
|
|
use std::borrow::Borrow;
|
|
use std::rc::Rc;
|
|
|
|
#[derive(Clone, Debug)]
|
|
pub enum BreadcrumbTreeElement<'a> {
|
|
// 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.
|
|
Owned(Rc<dyn IntoContextElement + 'a>),
|
|
Borrowed(&'a dyn IntoContextElement),
|
|
}
|
|
|
|
impl<'a> BreadcrumbTreeElement<'a> {
|
|
pub fn from_owned<I: 'a + IntoContextElement>(val: I) -> BreadcrumbTreeElement<'a> {
|
|
BreadcrumbTreeElement::Owned(Rc::new(val))
|
|
}
|
|
|
|
pub fn from_borrowed(val: &'a dyn IntoContextElement) -> BreadcrumbTreeElement<'a> {
|
|
BreadcrumbTreeElement::Borrowed(val)
|
|
}
|
|
}
|
|
|
|
impl<'a> From<&'a IceResult<'a>> for BreadcrumbTreeElement<'a> {
|
|
fn from(inp: &'a IceResult<'a>) -> Self {
|
|
match inp {
|
|
IceResult::Owned(rc_ce) => {
|
|
BreadcrumbTreeElement::from_borrowed(rc_ce.from_context_element())
|
|
}
|
|
IceResult::Borrowed(ce) => {
|
|
BreadcrumbTreeElement::from_borrowed(ce.from_context_element())
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<'a> From<IceResult<'a>> for BreadcrumbTreeElement<'a> {
|
|
fn from(inp: IceResult<'a>) -> Self {
|
|
match inp {
|
|
IceResult::Owned(rc_ce) => BreadcrumbTreeElement::Owned(rc_ce.into_rc_ice()),
|
|
IceResult::Borrowed(ce) => {
|
|
BreadcrumbTreeElement::from_borrowed(ce.from_context_element())
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<'a> Borrow<dyn IntoContextElement + 'a> for BreadcrumbTreeElement<'a> {
|
|
fn borrow(&self) -> &(dyn IntoContextElement + 'a) {
|
|
match self {
|
|
BreadcrumbTreeElement::Owned(ice) => ice.as_ref(),
|
|
BreadcrumbTreeElement::Borrowed(ice) => *ice,
|
|
}
|
|
}
|
|
}
|