#![allow(dead_code)]
use crate::error::NodeError;
#[cfg(not(feature = "std"))]
use core::{
cell::RefCell,
fmt,
fmt::{Debug, Display},
iter::Iterator,
mem,
};
#[cfg(not(feature = "std"))]
use rclite::Rc;
use tracing::instrument;
#[cfg(not(feature = "std"))]
use alloc::{self, vec::Vec};
#[cfg(feature = "std")]
use std::{
cell::RefCell,
fmt,
fmt::{Debug, Display},
iter::Iterator,
mem,
rc::{Rc, Weak},
};
pub type NodeRef<T> = Rc<RefCell<Node<T>>>;
#[cfg(not(feature = "std"))]
pub type ParentRc<T> = Rc<T>;
#[cfg(feature = "std")]
pub type ParentRc<T> = Weak<T>;
pub type PrevNodeRef<T> = ParentRc<RefCell<Node<T>>>;
#[derive(Clone)]
#[repr(u8)]
pub enum Node<T> {
Leaf {
prev: Option<PrevNodeRef<T>>,
value: T,
},
Parent {
value: T,
prev: Option<PrevNodeRef<T>>,
next: Vec<NodeRef<T>>,
},
}
impl<T> Debug for Node<T>
where
T: Debug,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Leaf { value, .. } => f.debug_struct("Leaf").field("value", value).finish(),
Self::Parent { value, prev, next } => f
.debug_struct("Parent")
.field("value", value)
.field("prev", &prev.as_ref().map(|p| format!("{:p}", p)))
.field("next_count", &next.len()) .finish(),
}
}
}
impl<T> Display for Node<T>
where
T: Debug,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Leaf { value, .. } => write!(f, "Leaf({:?})", value),
Self::Parent { value, prev, next } => write!(
f,
"Parent(value = {:?}, prev = {}, children = {})",
value,
if prev.is_some() { "Some" } else { "None" },
next.len()
),
}
}
}
impl<T> Node<T>
where
T: Debug,
{
#[inline]
#[instrument(level = "trace")]
pub fn parent(value: T) -> NodeRef<T> {
Rc::new(RefCell::new(Node::Parent {
value,
prev: None,
next: vec![],
}))
}
#[inline]
#[instrument(level = "trace")]
pub fn leaf(value: T, prev: Option<NodeRef<T>>) -> NodeRef<T> {
Rc::new(RefCell::new(Node::Leaf {
value,
#[cfg(feature = "std")]
prev: prev.map(|p| Rc::downgrade(&p)),
#[cfg(not(feature = "std"))]
prev,
}))
}
#[inline]
#[instrument(level = "trace")]
pub fn upgrade(parent: &NodeRef<T>, node: &NodeRef<T>) -> Result<(), NodeError>
where
T: Debug + Default + Clone,
{
parent.borrow_mut().upgrade_inner(node)
}
fn upgrade_inner(&mut self, node: &NodeRef<T>) -> Result<(), NodeError>
where
T: Default + Clone,
{
match self {
Self::Leaf { value, prev } => {
let leaf_value = mem::take(value);
let prev = mem::take(prev);
*self = Self::Parent {
value: leaf_value,
prev,
next: vec![Rc::clone(node)],
};
Ok(())
}
_ => Err(NodeError::ParentUpgradeNotAllowed), }
}
#[inline]
#[instrument(level = "trace")]
pub fn downgrade(node: &NodeRef<T>) -> Result<(), NodeError>
where
T: Default + Debug,
{
node.borrow_mut().downgrade_inner()
}
fn downgrade_inner(&mut self) -> Result<(), NodeError>
where
T: Default,
{
match self {
Self::Parent { value, prev, next } => {
let children = next.len();
if children != 0 {
return Err(NodeError::IllegalDowngradeWithChildren(children));
}
if let Some(parent) = prev.take() {
let parent_value = mem::take(value);
*self = Self::Leaf {
prev: Some(parent),
value: parent_value,
};
Ok(())
} else {
Err(NodeError::RootDowngradeNotAllowed)
}
}
_ => Err(NodeError::DowngradeNotParent), }
}
}
impl<T> Node<T> {
#[inline]
pub fn is_root(&self) -> bool {
match self {
Self::Parent { prev, .. } => prev.is_none(),
_ => false,
}
}
#[inline]
pub fn expect_root(&self) -> Result<(), NodeError> {
if self.is_root() {
Ok(())
} else {
Err(NodeError::ExpectedARootNode)
}
}
#[inline]
pub fn is_leaf(&self) -> bool {
matches!(self, Self::Leaf { .. })
}
#[inline]
pub fn expect_leaf(&self) -> Result<(), NodeError> {
if self.is_leaf() {
Ok(())
} else {
Err(NodeError::ExpectedALeafNode)
}
}
#[inline]
pub fn has_children(&self) -> bool {
match self {
Self::Parent { next, .. } => !next.is_empty(),
Self::Leaf { .. } => false,
}
}
#[inline]
pub fn value(&self) -> &T {
match self {
Self::Parent { value, .. } => value,
Self::Leaf { value, .. } => value,
}
}
#[inline]
pub fn children(&self) -> &[NodeRef<T>] {
match self {
Self::Parent { next, .. } => next,
_ => &[],
}
}
#[inline]
pub fn expect_children(&self) -> Result<&[NodeRef<T>], NodeError> {
match self {
Self::Parent { next, .. } => {
if next.is_empty() {
Err(NodeError::ExpectedChildren)
} else {
Ok(next)
}
}
_ => Err(NodeError::ExpectedChildren),
}
}
#[inline]
pub fn prev(&self) -> Option<PrevNodeRef<T>> {
match self {
Self::Parent { prev, .. } => prev.clone(),
Self::Leaf { prev, .. } => prev.clone(),
}
}
#[inline]
pub fn expect_prev(&self) -> Result<PrevNodeRef<T>, NodeError> {
match self {
Self::Parent { prev, .. } => prev.clone().ok_or(NodeError::ParentNodeNotFound),
Self::Leaf { prev, .. } => prev.clone().ok_or(NodeError::ParentNodeNotFound),
}
}
}
impl<T> Node<T>
where
T: Debug + Default + Clone,
{
#[instrument(level = "info")]
pub fn insert(parent: &NodeRef<T>, value: T) -> Result<NodeRef<T>, NodeError> {
let node = Node::leaf(value, Some(Rc::clone(parent)));
Node::inner_insert(parent, &node)?;
Ok(node)
}
#[instrument(level = "info")]
#[cfg(feature = "std")]
pub fn insert_node(parent: &NodeRef<T>, node: &NodeRef<T>) -> Result<(), NodeError> {
let mut n = node.borrow_mut();
match &mut *n {
Node::Leaf { prev, .. } | Node::Parent { prev, .. } => {
*prev = Some(NodeRef::downgrade(parent));
}
}
Node::inner_insert(parent, node)?;
Ok(())
}
#[instrument(level = "info")]
#[cfg(not(feature = "std"))]
pub fn insert_node(parent: &NodeRef<T>, node: &NodeRef<T>) -> Result<(), NodeError> {
let mut n = node.borrow_mut();
match &mut *n {
Node::Leaf { prev, .. } | Node::Parent { prev, .. } => {
*prev = Some(NodeRef::clone(parent));
}
}
Node::inner_insert(parent, node)?;
Ok(())
}
fn inner_insert(parent: &NodeRef<T>, node: &NodeRef<T>) -> Result<(), NodeError> {
let mut p = parent.borrow_mut();
match &mut *p {
Node::Leaf { .. } => {
drop(p);
Node::upgrade(parent, node)?;
}
Node::Parent { next, .. } => {
next.push(Rc::clone(node));
}
}
Ok(())
}
#[instrument(level = "trace")]
pub fn pop(parent: &NodeRef<T>, child: &NodeRef<T>) -> Result<bool, NodeError>
where
T: Default + Clone + Copy,
{
parent.borrow_mut().inner_pop(child)
}
fn inner_pop(&mut self, child: &NodeRef<T>) -> Result<bool, NodeError>
where
T: Default + Clone + Copy,
{
match self {
Self::Leaf { .. } => Err(NodeError::NotAParent),
Self::Parent { next, prev, .. } => {
let position = next.iter().position(|c| Rc::ptr_eq(c, child));
if let Some(index) = position {
next.remove(index);
{
let mut c = child.borrow_mut();
match &mut *c {
Self::Parent { prev, .. } | Self::Leaf { prev, .. } => {
prev.take();
}
}
}
if next.is_empty() && prev.is_some() {
Node::downgrade_inner(self)?;
}
Ok(true)
} else {
Ok(false)
}
}
}
}
}
impl<T> From<Node<T>> for NodeRef<T> {
fn from(node: Node<T>) -> Self {
Rc::new(RefCell::new(node))
}
}
impl<T> Node<T> {
pub fn iter(node: NodeRef<T>) -> NodeIter<T> {
NodeIter::new(node)
}
}
pub struct NodeIter<T> {
queue: Vec<NodeRef<T>>,
}
impl<T> NodeIter<T> {
pub fn new(node: NodeRef<T>) -> NodeIter<T> {
let queue = vec![node];
NodeIter { queue }
}
}
impl<T> Iterator for NodeIter<T> {
type Item = NodeRef<T>;
fn next(&mut self) -> Option<Self::Item> {
if let Some(item) = self.queue.first().cloned() {
self.queue.remove(0);
if let Node::Parent { next, .. } = &*item.borrow() {
self.queue.extend(next.clone()); }
Some(item)
} else {
None
}
}
}