···11+use super::NodeId;
22+33+/// Describes the possible behaviors of the `Tree::insert` method.
44+pub enum InsertBehavior<'a> {
55+ /// Insert the `Node` as the root of the tree.
66+ ///
77+ /// If there is already a root `Node` in the tree, then that `Node` will
88+ /// be set as the first child as the new root `Node`.
99+ ///
1010+ /// ```
1111+ /// use sakura::*;
1212+ /// use sakura::InsertBehavior::*;
1313+ ///
1414+ /// let mut tree: Tree<i32> = Tree::new();
1515+ /// let root_node = Node::new(1);
1616+ ///
1717+ /// tree.insert(root_node, AsRoot).unwrap();
1818+ ///
1919+ /// ```
2020+ AsRoot,
2121+2222+ /// Inserts the `Node` under the `Node` that has the provided `NodeId`.
2323+ ///
2424+ /// Note: Adds the new `Node` to the end of its children.
2525+ ///
2626+ /// # Returns
2727+ /// `Result` containing the `NodeId` of the child that was added or a `NodeIdError`
2828+ ///
2929+ /// ```
3030+ /// use sakura::*;
3131+ /// use sakura::InsertBehavior::*;
3232+ ///
3333+ /// let root_node = Node::new(1);
3434+ /// let child_node = Node::new(2);
3535+ ///
3636+ /// let mut tree: Tree<i32> = Tree::new();
3737+ /// let mut root_id = tree.insert(root_node, AsRoot).unwrap();
3838+ ///
3939+ /// tree.insert(child_node, UnderNode(&root_id)).unwrap();
4040+ ///
4141+ /// ```
4242+ UnderNode(&'a NodeId),
4343+}
4444+4545+pub enum RemoveBehavior {
4646+ /// The entire subtree of the `Node` being removed will be
4747+ /// dropped from the tree, effectively meaning that all children
4848+ /// will be dropped recursively.
4949+ ///
5050+ /// Those `Node`'s will no longer exist and cannot be accessed even
5151+ /// if you hold a `NodeId` for them, so use this behavior with caution.
5252+ ///
5353+ ///
5454+ /// ```
5555+ /// use sakura::*;
5656+ /// use sakura::InsertBehavior::*;
5757+ /// use sakura::RemoveBehavior::*;
5858+ ///
5959+ /// let mut tree: Tree<i32> = Tree::new();
6060+ ///
6161+ /// let root_id = tree.insert(Node::new(0), AsRoot).unwrap();
6262+ /// let child_id = tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
6363+ /// let grandchild_id = tree.insert(Node::new(2), UnderNode(&child_id)).unwrap();
6464+ ///
6565+ /// let child = tree.remove_node(child_id, DropChildren).ok().unwrap();
6666+ ///
6767+ /// assert!(tree.get(&grandchild_id).is_err());
6868+ /// assert_eq!(tree.get(&root_id).unwrap().children().len(), 0);
6969+ /// assert_eq!(child.children().len(), 0);
7070+ /// assert_eq!(child.parent(), None);
7171+ /// ```
7272+ ///
7373+ DropChildren,
7474+7575+ ///
7676+ ///
7777+ /// If the removed `Node` (say `A`) has a parent `A'`, then `A'` will
7878+ /// become the parent of `A`'s children.
7979+ ///
8080+ /// If `A` doesn't have a parent, then this behaves exactly like
8181+ /// `RemoveBehavior::OrphanChildren`.
8282+ /// ```
8383+ /// use sakura::*;
8484+ /// use sakura::InsertBehavior::*;
8585+ /// use sakura::RemoveBehavior::*;
8686+ ///
8787+ /// let mut tree: Tree<i32> = Tree::new();
8888+ ///
8989+ /// let root_id = tree.insert(Node::new(0), AsRoot).unwrap();
9090+ /// let child_id = tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
9191+ /// let grandchild_id = tree.insert(Node::new(2), UnderNode(&child_id)).unwrap();
9292+ ///
9393+ /// let child = tree.remove_node(child_id, LiftChildren).ok().unwrap();
9494+ ///
9595+ /// assert!(tree.get(&grandchild_id).is_ok());
9696+ /// assert!(tree.get(&root_id).unwrap().children().contains(&grandchild_id));
9797+ /// assert_eq!(child.children().len(), 0);
9898+ /// assert_eq!(child.parent(), None);
9999+ /// ```
100100+ ///
101101+ LiftChildren,
102102+103103+ /// All children will have their parent references cleared. Nothing
104104+ /// will point to them, but they will still exist in the tree.
105105+ /// Those `Node`s can still be accessed if you still have their
106106+ /// `NodeId`'s.
107107+ ///
108108+ /// ```
109109+ /// use sakura::*;
110110+ /// use sakura::InsertBehavior::*;
111111+ /// use sakura::RemoveBehavior::*;
112112+ ///
113113+ /// let mut tree: Tree<i32> = Tree::new();
114114+ ///
115115+ /// let root_id = tree.insert(Node::new(0), AsRoot).unwrap();
116116+ /// let child_id = tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
117117+ /// let grandchild_id = tree.insert(Node::new(2), UnderNode(&child_id)).unwrap();
118118+ ///
119119+ /// let child = tree.remove_node(child_id, OrphanChildren).ok().unwrap();
120120+ ///
121121+ /// assert!(tree.get(&grandchild_id).is_ok());
122122+ /// assert_eq!(tree.get(&root_id).unwrap().children().len(), 0);
123123+ /// assert_eq!(child.children().len(), 0);
124124+ /// assert_eq!(child.parent(), None);
125125+ /// ```
126126+ ///
127127+ OrphanChildren,
128128+}
129129+130130+pub enum MoveBehavior<'a> {
131131+ /// Sets the `Node` as the new root `Node`, while having all their children
132132+ /// travel with them.
133133+ ///
134134+ /// If there is already a root `Node` in place, it will be attached as the
135135+ /// last child of the new root `Node`.
136136+ ///
137137+ /// ```
138138+ /// use sakura::*;
139139+ /// use sakura::InsertBehavior::*;
140140+ /// use sakura::MoveBehavior::*;
141141+ ///
142142+ /// let mut tree: Tree<i32> = Tree::new();
143143+ ///
144144+ /// let root_id = tree.insert(Node::new(1), AsRoot).unwrap();
145145+ /// let child_id = tree.insert(Node::new(2), UnderNode(&root_id)).unwrap();
146146+ /// let grandchild_id = tree.insert(Node::new(3), UnderNode(&child_id)).unwrap();
147147+ ///
148148+ /// tree.move_node(&grandchild_id, ToRoot).unwrap();
149149+ ///
150150+ /// assert_eq!(tree.root_node_id(), Some(&grandchild_id));
151151+ /// assert!(tree.get(&grandchild_id).unwrap().children().contains(&root_id));
152152+ /// assert!(!tree.get(&child_id).unwrap().children().contains(&grandchild_id));
153153+ /// ```
154154+ ///
155155+ ToRoot,
156156+157157+ ///
158158+ /// Moves a `Node` in the `Tree` to a new parent, while leaving
159159+ /// all children in their place.
160160+ ///
161161+ /// If the new parent (lets say `A'`) is a descendant of the `Node` being
162162+ /// moved (`A`), then the direct child of `A` on the path from `A` to
163163+ /// `A'` will be shifted upwards to take the place of its parent (`A`).
164164+ /// All other children of `A` will be left alone, so they will travel
165165+ /// with `A`.
166166+ ///
167167+ /// NOTE: During the shift-up part of the above scenario, the `Node` being
168168+ /// shifted up will always be added as the last child of its new parent.
169169+ /// ```
170170+ /// use sakura::*;
171171+ /// use sakura::InsertBehavior::*;
172172+ /// use sakura::MoveBehavior::*;
173173+ ///
174174+ /// let mut tree: Tree<i32> = Tree::new();
175175+ ///
176176+ /// let root_id = tree.insert(Node::new(1), AsRoot).ok().unwrap();
177177+ /// let first_child_id = tree.insert(Node::new(2), UnderNode(&root_id)).unwrap();
178178+ /// let second_child_id = tree.insert(Node::new(3), UnderNode(&root_id)).unwrap();
179179+ /// let grandchild_id = tree.insert(Node::new(4), UnderNode(&first_child_id)).unwrap();
180180+ ///
181181+ /// tree.move_node(&grandchild_id, ToParent(&second_child_id)).unwrap();
182182+ ///
183183+ /// assert!(!tree.get(&first_child_id).unwrap().children().contains(&grandchild_id));
184184+ /// assert!(tree.get(&second_child_id).unwrap().children().contains(&grandchild_id));
185185+ /// ```
186186+ ///
187187+ ToParent(&'a NodeId),
188188+}
+27
crates/sakura/src/error.rs
···11+use std::{error::Error, fmt::Display};
22+33+/// Enum for all possible `NodeId` errors that could happen.
44+#[derive(Debug, PartialEq, Eq)]
55+pub enum NodeIdError {
66+ /// Occurs when a `NodeId` is used on a `Tree` after the corresponding
77+ /// `Node` has been removed.
88+ NodeIdNoLongerValid,
99+}
1010+1111+impl NodeIdError {
1212+ const fn to_string(&self) -> &str {
1313+ match *self {
1414+ Self::NodeIdNoLongerValid => {
1515+ "The given NodeId is no longer valid. The Node in question has been removed."
1616+ }
1717+ }
1818+ }
1919+}
2020+2121+impl Display for NodeIdError {
2222+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
2323+ write!(f, "NodeIdError: {}", self.to_string())
2424+ }
2525+}
2626+2727+impl Error for NodeIdError {}
+261
crates/sakura/src/iterators.rs
···11+use std::{collections::VecDeque, slice::Iter};
22+33+use crate::{Node, NodeId, Tree};
44+55+/// An `Iterator` over the children of a `Node`.
66+///
77+/// Iterates over the child `Node`s of a given `Node` in the `Tree`.
88+/// Each call to `next` will return an immutable
99+/// reference to the next child `Node`.
1010+pub struct Children<'a, T: 'a> {
1111+ tree: &'a Tree<T>,
1212+ child_ids: Iter<'a, NodeId>,
1313+}
1414+1515+impl<'a, T> Children<'a, T> {
1616+ // we actually want to
1717+ #[allow(clippy::use_self)]
1818+ pub(crate) fn new(tree: &'a Tree<T>, node_id: &NodeId) -> Children<'a, T> {
1919+ Children {
2020+ tree,
2121+ child_ids: tree
2222+ .get(node_id)
2323+ .expect(
2424+ "Function is crate specific, expecting to only be used
2525+ with a valid node_id",
2626+ )
2727+ .children()
2828+ .as_slice()
2929+ .iter(),
3030+ }
3131+ }
3232+}
3333+3434+impl<'a, T> Iterator for Children<'a, T> {
3535+ type Item = &'a Node<T>;
3636+3737+ fn next(&mut self) -> Option<Self::Item> {
3838+ self.child_ids
3939+ .next()
4040+ .and_then(|child_id| self.tree.get(child_id).ok())
4141+ }
4242+}
4343+4444+impl<T> Clone for Children<'_, T> {
4545+ fn clone(&self) -> Self {
4646+ Children {
4747+ tree: self.tree,
4848+ child_ids: self.child_ids.clone(),
4949+ }
5050+ }
5151+}
5252+5353+/// An `Iterator` over the children of a `Node`.
5454+///
5555+/// Iterates over the child `NodeId`s of a given `NodeId` in the `Tree`.
5656+/// Each call to `next` will return an immutable
5757+/// reference to the next child `NodeId`.
5858+pub struct ChildrenIds<'a> {
5959+ child_ids: Iter<'a, NodeId>,
6060+}
6161+6262+impl<'a> ChildrenIds<'a> {
6363+ #[allow(clippy::use_self)]
6464+ pub(crate) fn new<T>(tree: &'a Tree<T>, node_id: &NodeId) -> ChildrenIds<'a> {
6565+ ChildrenIds {
6666+ child_ids: tree
6767+ .get(node_id)
6868+ .expect(
6969+ "Function is crate specific, expecting to only be used
7070+ with a valid node_id",
7171+ )
7272+ .children()
7373+ .as_slice()
7474+ .iter(),
7575+ }
7676+ }
7777+}
7878+7979+impl<'a> Iterator for ChildrenIds<'a> {
8080+ type Item = &'a NodeId;
8181+8282+ fn next(&mut self) -> Option<Self::Item> {
8383+ self.child_ids.next()
8484+ }
8585+}
8686+8787+/// An `Iterator` over the ancestors of a `Node`.
8888+///
8989+/// Iterates over the ancestor `Node`s of given `Node` in the `Tree`.
9090+/// Each call to `next` will return an immutable reference to the next
9191+/// `Node` up the `Tree`.
9292+pub struct Ancestors<'a, T: 'a> {
9393+ tree: &'a Tree<T>,
9494+ node_id: Option<NodeId>,
9595+}
9696+9797+impl<'a, T> Ancestors<'a, T> {
9898+ #[allow(clippy::use_self)]
9999+ pub(crate) const fn new(tree: &'a Tree<T>, node_id: NodeId) -> Ancestors<'a, T> {
100100+ Ancestors {
101101+ tree,
102102+ node_id: Some(node_id),
103103+ }
104104+ }
105105+}
106106+107107+impl<'a, T> Iterator for Ancestors<'a, T> {
108108+ type Item = &'a Node<T>;
109109+110110+ fn next(&mut self) -> Option<&'a Node<T>> {
111111+ self.node_id
112112+ .take()
113113+ .and_then(|current_id| self.tree.get(¤t_id).ok())
114114+ .and_then(|node_ref| node_ref.parent())
115115+ .and_then(|parent_id| {
116116+ self.node_id = Some(parent_id.clone());
117117+ self.tree.get(parent_id).ok()
118118+ })
119119+ }
120120+}
121121+122122+impl<T> Clone for Ancestors<'_, T> {
123123+ fn clone(&self) -> Self {
124124+ Ancestors {
125125+ tree: self.tree,
126126+ node_id: self.node_id.clone(),
127127+ }
128128+ }
129129+}
130130+131131+/// An `Iterator` over the ancestors of a `Node`.
132132+///
133133+/// Iterates over `NodeId`s instead of over `Node`s themselves.
134134+pub struct AncestorsIds<'a, T: 'a> {
135135+ tree: &'a Tree<T>,
136136+ node_id: Option<NodeId>,
137137+}
138138+139139+impl<'a, T> AncestorsIds<'a, T> {
140140+ #[allow(clippy::use_self)]
141141+ pub(crate) const fn new(tree: &'a Tree<T>, node_id: NodeId) -> AncestorsIds<'a, T> {
142142+ AncestorsIds {
143143+ tree,
144144+ node_id: Some(node_id),
145145+ }
146146+ }
147147+}
148148+149149+impl<'a, T> Iterator for AncestorsIds<'a, T> {
150150+ type Item = &'a NodeId;
151151+152152+ fn next(&mut self) -> Option<&'a NodeId> {
153153+ self.node_id
154154+ .take()
155155+ .and_then(|current_id| self.tree.get(¤t_id).ok())
156156+ .and_then(|node_ref| node_ref.parent())
157157+ .inspect(|parent_id| {
158158+ self.node_id = Some((*parent_id).clone());
159159+ })
160160+ }
161161+}
162162+163163+impl<T> Clone for AncestorsIds<'_, T> {
164164+ fn clone(&self) -> Self {
165165+ AncestorsIds {
166166+ tree: self.tree,
167167+ node_id: self.node_id.clone(),
168168+ }
169169+ }
170170+}
171171+172172+/// An iterator over the subtree relative to a given `Node`.
173173+///
174174+/// Each call to `next` will return an immutable reference to the
175175+/// next `Node` in Pre-Order Traversal order.
176176+pub struct PreOrderTraversal<'a, T: 'a> {
177177+ tree: &'a Tree<T>,
178178+ data: VecDeque<NodeId>,
179179+}
180180+181181+impl<'a, T> PreOrderTraversal<'a, T> {
182182+ #[allow(clippy::use_self)]
183183+ pub(crate) fn new(tree: &'a Tree<T>, node_id: NodeId) -> PreOrderTraversal<'a, T> {
184184+ let mut data = VecDeque::with_capacity(tree.capacity());
185185+ data.push_front(node_id);
186186+187187+ PreOrderTraversal { tree, data }
188188+ }
189189+}
190190+191191+impl<'a, T> Iterator for PreOrderTraversal<'a, T> {
192192+ type Item = &'a Node<T>;
193193+194194+ fn next(&mut self) -> Option<Self::Item> {
195195+ self.data
196196+ .pop_front()
197197+ .and_then(|node_id| self.tree.get(&node_id).ok())
198198+ .inspect(|node_ref| {
199199+ for child_id in node_ref.children().iter().rev() {
200200+ self.data.push_front(child_id.clone());
201201+ }
202202+ })
203203+ }
204204+}
205205+206206+impl<T> Clone for PreOrderTraversal<'_, T> {
207207+ fn clone(&self) -> Self {
208208+ PreOrderTraversal {
209209+ tree: self.tree,
210210+ data: self.data.clone(),
211211+ }
212212+ }
213213+}
214214+215215+/// An Iterator over the subtree relative to a given `Node`.
216216+///
217217+/// Each call to `next` will return an immutable reference to the
218218+/// next `NodeId` in Pre-Order Traversal order.
219219+///
220220+pub struct PreOrderTraversalIds<'a, T: 'a> {
221221+ tree: &'a Tree<T>,
222222+ data: VecDeque<NodeId>,
223223+}
224224+225225+impl<'a, T> PreOrderTraversalIds<'a, T> {
226226+ #[allow(clippy::use_self)]
227227+ pub(crate) fn new(tree: &'a Tree<T>, node_id: NodeId) -> PreOrderTraversalIds<'a, T> {
228228+ // Over allocating, but all at once instead of resizing and reallocating as we go.
229229+ let mut data = VecDeque::with_capacity(tree.capacity());
230230+231231+ data.push_front(node_id);
232232+233233+ PreOrderTraversalIds { tree, data }
234234+ }
235235+}
236236+237237+impl<T> Iterator for PreOrderTraversalIds<'_, T> {
238238+ type Item = NodeId;
239239+240240+ fn next(&mut self) -> Option<NodeId> {
241241+ self.data.pop_front().and_then(|node_id| {
242242+ self.tree.get(&node_id).ok().map(|node_ref| {
243243+ // prepend child_ids
244244+ for child_id in node_ref.children().iter().rev() {
245245+ self.data.push_front(child_id.clone());
246246+ }
247247+248248+ node_id
249249+ })
250250+ })
251251+ }
252252+}
253253+254254+impl<T> Clone for PreOrderTraversalIds<'_, T> {
255255+ fn clone(&self) -> Self {
256256+ PreOrderTraversalIds {
257257+ tree: self.tree,
258258+ data: self.data.clone(),
259259+ }
260260+ }
261261+}
+50
crates/sakura/src/lib.rs
···11+#![forbid(unsafe_code)]
22+//! A purpose-built library for CASE, to hold the internal tree-like
33+//! data structure that holds tasks and groups. Additionally, this
44+//! data structure is compatible with `AutoMerge`, via `AutoSurgeon`
55+//!
66+//! TODO: add example usage
77+88+use autosurgeon::{Hydrate, Reconcile};
99+use serde::{Deserialize, Serialize};
1010+1111+mod behaviors;
1212+mod error;
1313+mod iterators;
1414+mod node;
1515+mod tree;
1616+1717+pub use node::Node;
1818+1919+pub use tree::Tree;
2020+pub use tree::TreeBuilder;
2121+2222+pub use behaviors::InsertBehavior;
2323+pub use behaviors::MoveBehavior;
2424+pub use behaviors::RemoveBehavior;
2525+2626+pub use iterators::Ancestors;
2727+pub use iterators::Children;
2828+pub use iterators::ChildrenIds;
2929+pub use iterators::PreOrderTraversal;
3030+pub use iterators::PreOrderTraversalIds;
3131+3232+pub use error::NodeIdError;
3333+3434+/// A Node Id
3535+#[derive(
3636+ Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize, Reconcile, Hydrate,
3737+)]
3838+pub struct NodeId {
3939+ index: u32,
4040+}
4141+4242+impl NodeId {
4343+ // This is okay since we are practically never reaching 2^32.
4444+ #[allow(clippy::cast_possible_truncation)]
4545+ pub(crate) const fn new(index: usize) -> Self {
4646+ Self {
4747+ index: index as u32,
4848+ }
4949+ }
5050+}
+204
crates/sakura/src/node.rs
···11+use autosurgeon::{Hydrate, Reconcile};
22+use serde::{Deserialize, Serialize};
33+44+use crate::NodeId;
55+66+#[derive(Debug, Serialize, Deserialize, Reconcile, Hydrate, Ord, Eq, PartialOrd)]
77+pub struct Node<T> {
88+ pub(crate) data: T,
99+ pub(crate) parent: Option<NodeId>,
1010+ pub(crate) children: Vec<NodeId>,
1111+}
1212+1313+impl<T> PartialEq for Node<T>
1414+where
1515+ T: PartialEq,
1616+{
1717+ // We only care if node data is equivalent.
1818+ fn eq(&self, other: &Self) -> bool {
1919+ self.data == other.data
2020+ }
2121+}
2222+2323+impl<T> Node<T> {
2424+ /// Creates a new `Node` with the provided data
2525+ ///
2626+ /// ```
2727+ /// use sakura::Node;
2828+ ///
2929+ /// let _one: Node<i32> = Node::new(1);
3030+ /// ```
3131+ ///
3232+ #[allow(clippy::use_self)]
3333+ pub const fn new(data: T) -> Node<T> {
3434+ Self {
3535+ parent: None,
3636+ data,
3737+ children: vec![],
3838+ }
3939+ }
4040+4141+ /// Returns a reference to the data inside the `Node`
4242+ ///
4343+ /// ```
4444+ /// use sakura::Node;
4545+ ///
4646+ /// let x = 10;
4747+ /// let node: Node<i32> = Node::new(x);
4848+ /// # assert_eq!(node.data(), &10);
4949+ /// ```
5050+ pub const fn data(&self) -> &T {
5151+ &self.data
5252+ }
5353+5454+ /// Returns a mutable reference to the data inside the `Node`
5555+ ///
5656+ /// ```
5757+ /// use sakura::Node;
5858+ ///
5959+ /// let x = 10;
6060+ /// let mut node: Node<i32> = Node::new(x);
6161+ /// # assert_eq!(node.data_mut(), &mut 10);
6262+ /// ```
6363+ pub const fn data_mut(&mut self) -> &mut T {
6464+ &mut self.data
6565+ }
6666+6767+ /// Replaces this `Node`s data with the provided data
6868+ ///
6969+ /// Returns the data previously in the node
7070+ ///
7171+ /// ```
7272+ /// use sakura::Node;
7373+ ///
7474+ /// let x = 10;
7575+ /// let mut y = 15;
7676+ ///
7777+ /// let mut node_x: Node<i32> = Node::new(x);
7878+ /// let replaced_x = node_x.replace_data(y);
7979+ /// let new_x = node_x.data();
8080+ ///
8181+ /// # assert_eq!(*new_x, y);
8282+ /// # assert_eq!(replaced_x, x);
8383+ /// ```
8484+ pub const fn replace_data(&mut self, mut data: T) -> T {
8585+ ::std::mem::swap(&mut data, self.data_mut());
8686+ data
8787+ }
8888+8989+ /// Returns the parent of this `Node`, if it has one.
9090+ ///
9191+ /// ```
9292+ /// use sakura::Node;
9393+ ///
9494+ /// let node: Node<i32> = Node::new(1);
9595+ /// # assert_eq!(node.parent(), None);
9696+ /// ```
9797+ pub const fn parent(&self) -> Option<&NodeId> {
9898+ self.parent.as_ref()
9999+ }
100100+101101+ /// Returns the children of this `Node`
102102+ ///
103103+ /// ```
104104+ /// use sakura::Node;
105105+ ///
106106+ /// let node: Node<i32> = Node::new(0);
107107+ /// # assert_eq!(node.children().len(), 0);
108108+ /// ```
109109+ pub const fn children(&self) -> &Vec<NodeId> {
110110+ &self.children
111111+ }
112112+113113+ pub(crate) const fn children_mut(&mut self) -> &mut Vec<NodeId> {
114114+ &mut self.children
115115+ }
116116+117117+ pub(crate) const fn set_parent(&mut self, parent: Option<NodeId>) {
118118+ self.parent = parent;
119119+ }
120120+121121+ pub(crate) fn add_child(&mut self, child: NodeId) {
122122+ self.children.push(child);
123123+ }
124124+125125+ pub(crate) fn set_children(&mut self, children: Vec<NodeId>) {
126126+ self.children = children;
127127+ }
128128+129129+ pub(crate) fn take_children(&mut self) -> Vec<NodeId> {
130130+ use std::mem;
131131+132132+ let mut empty = Vec::with_capacity(0);
133133+ mem::swap(&mut self.children, &mut empty);
134134+ // post-swap this holds children
135135+ empty
136136+ }
137137+}
138138+139139+#[cfg(test)]
140140+mod node_tests {
141141+142142+ use super::super::NodeId;
143143+ use super::Node;
144144+145145+ #[test]
146146+ fn test_new() {
147147+ let node = Node::new(10);
148148+ assert_eq!(node.children.capacity(), 0);
149149+ }
150150+151151+ #[test]
152152+ fn test_data() {
153153+ let data = 0;
154154+ let node = Node::new(data);
155155+156156+ assert_eq!(node.data(), &data);
157157+ }
158158+159159+ #[test]
160160+ fn test_data_mut() {
161161+ let mut data = 0;
162162+ let mut node = Node::new(data);
163163+164164+ assert_eq!(node.data_mut(), &mut data);
165165+ }
166166+167167+ #[test]
168168+ fn test_parent() {
169169+ let mut node = Node::new(0);
170170+171171+ assert!(node.parent().is_none());
172172+173173+ let parent_id: NodeId = NodeId { index: 100 };
174174+175175+ node.set_parent(Some(parent_id.clone()));
176176+177177+ assert_eq!(node.parent, Some(parent_id));
178178+ }
179179+180180+ #[test]
181181+ fn test_children() {
182182+ let mut node = Node::new(0);
183183+ assert!(node.children.is_empty());
184184+185185+ let child_id: NodeId = NodeId { index: 1 };
186186+187187+ node.add_child(child_id.clone());
188188+189189+ assert_eq!(node.children.len(), 1);
190190+ assert_eq!(node.children.first().unwrap(), &child_id);
191191+ }
192192+193193+ #[test]
194194+ fn test_partial_eq() {
195195+ let node1 = Node::new(32);
196196+ let node2 = Node::new(32);
197197+ let node3 = Node::new(64);
198198+199199+ assert_eq!(node1, node2);
200200+201201+ assert_ne!(node1, node3);
202202+ assert_ne!(node2, node3);
203203+ }
204204+}
+1732
crates/sakura/src/tree.rs
···11+use std::cmp::Ordering;
22+33+use autosurgeon::{Hydrate, Reconcile};
44+use serde::{Deserialize, Serialize};
55+66+use crate::{
77+ Ancestors, Children, ChildrenIds, InsertBehavior, MoveBehavior, Node, NodeId,
88+ PreOrderTraversal, PreOrderTraversalIds, RemoveBehavior, error::NodeIdError,
99+ iterators::AncestorsIds,
1010+};
1111+1212+/// A `Tree` builder to assist with building a `Tree`, with more control.
1313+pub struct TreeBuilder<T> {
1414+ root: Option<Node<T>>,
1515+ node_capacity: usize,
1616+ swap_capacity: usize,
1717+}
1818+1919+impl<T> Default for TreeBuilder<T> {
2020+ fn default() -> Self {
2121+ Self::new()
2222+ }
2323+}
2424+2525+impl<T> TreeBuilder<T> {
2626+ /// Creates a new `TreeBuilder` with default settings.
2727+ ///
2828+ /// ```
2929+ /// use sakura::TreeBuilder;
3030+ ///
3131+ /// let _tree_builder: TreeBuilder<i32> = TreeBuilder::new();
3232+ ///
3333+ /// ```
3434+ #[allow(clippy::use_self)]
3535+ #[must_use]
3636+ pub const fn new() -> TreeBuilder<T> {
3737+ TreeBuilder {
3838+ root: None,
3939+ node_capacity: 0,
4040+ swap_capacity: 0,
4141+ }
4242+ }
4343+4444+ /// Sets the root `Node` for the resulting `Tree` from this `TreeBuilder`.
4545+ ///
4646+ /// ```
4747+ /// use sakura::TreeBuilder;
4848+ /// use sakura::Node;
4949+ ///
5050+ /// let _tree_builder: TreeBuilder<i32> = TreeBuilder::new().with_root(Node::new(1));
5151+ /// ```
5252+ #[must_use]
5353+ #[allow(clippy::use_self)]
5454+ pub fn with_root(mut self, root: Node<T>) -> TreeBuilder<T> {
5555+ self.root = Some(root);
5656+ self
5757+ }
5858+5959+ /// Sets the `node_capacity` for `TreeBuilder`.
6060+ ///
6161+ /// Since `Tree`'s own their `Node`'s, they must allocate
6262+ /// storage for `Node`'s ahead of time, so that the
6363+ /// space allocations don't happen as the `Node`'s are inserted.
6464+ ///
6565+ /// _Configure this variable if you know the **maximum** number of `Node`'s
6666+ /// that your `Tree` will **contain** at **any given time**._
6767+ ///
6868+ /// ```
6969+ /// use sakura::TreeBuilder;
7070+ ///
7171+ /// let _tree_builder: TreeBuilder<i32> = TreeBuilder::new().with_node_capacity(1);
7272+ ///
7373+ /// ```
7474+ #[must_use]
7575+ #[allow(clippy::use_self)]
7676+ pub const fn with_node_capacity(mut self, node_capacity: usize) -> TreeBuilder<T> {
7777+ self.node_capacity = node_capacity;
7878+ self
7979+ }
8080+8181+ /// Sets the `swap_capacity` for `TreeBuilder`.
8282+ ///
8383+ /// `Tree`'s attempt to save time by reusing storage space
8484+ /// when `Node`'s are removed (instead of shuffling `Node`'s around internally).
8585+ /// To do this, the `Tree` must store information about the space left behind when a `Node`
8686+ /// is removed. Using this setting allows the `Tree` to pre-allocate this storage
8787+ /// space instead of doing so as `Node`'s are removed from the `Tree`.
8888+ ///
8989+ /// _Use of this setting is recommended if you know the **maximum "net number
9090+ /// of removals"** that have occurred at **any given time**._
9191+ ///
9292+ ///
9393+ /// For example:
9494+ /// ---
9595+ /// In **Scenario 1**:
9696+ ///
9797+ /// * Add 3 `Node`s, Remove 2 `Node`s, Add 1 `Node`.
9898+ ///
9999+ /// The maximum amount of nodes that have been removed at any given time is **2**.
100100+ ///
101101+ /// But in **Scenario 2**:
102102+ ///
103103+ /// * Add 3 `Node`s, Remove 2 `Node`s, Add 1 `Node`, Remove 2 `Node`s.
104104+ ///
105105+ /// The maximum amount of nodes that have been removed at any given time is **3**.
106106+ ///
107107+ /// ```
108108+ /// use sakura::TreeBuilder;
109109+ ///
110110+ /// let _tree_builder: TreeBuilder<i32> = TreeBuilder::new().with_node_capacity(1);
111111+ ///
112112+ /// ```
113113+ #[must_use]
114114+ #[allow(clippy::use_self)]
115115+ pub const fn with_swap_capacity(mut self, swap_capacity: usize) -> TreeBuilder<T> {
116116+ self.swap_capacity = swap_capacity;
117117+ self
118118+ }
119119+120120+ ///
121121+ /// Build a `Tree` based upon the current settings in the `TreeBuilder`.
122122+ ///
123123+ /// ```
124124+ /// use sakura::TreeBuilder;
125125+ /// use sakura::Tree;
126126+ /// use sakura::Node;
127127+ ///
128128+ /// let _tree: Tree<i32> = TreeBuilder::new()
129129+ /// .with_root(Node::new(5))
130130+ /// .with_node_capacity(3)
131131+ /// .with_swap_capacity(2)
132132+ /// .build();
133133+ /// ```
134134+ pub fn build(mut self) -> Tree<T> {
135135+ let mut tree = Tree {
136136+ root: None,
137137+ nodes: Vec::with_capacity(self.node_capacity),
138138+ free_ids: Vec::with_capacity(self.swap_capacity),
139139+ };
140140+141141+ if self.root.is_some() {
142142+ let node_id = NodeId { index: 0 };
143143+144144+ tree.nodes.push(self.root.take());
145145+146146+ tree.root = Some(node_id);
147147+ }
148148+149149+ tree
150150+ }
151151+}
152152+153153+/// A tree structure made up of `Node`'s.
154154+///
155155+/// # Panics
156156+/// Any function that takes a `NodeId` can `panic`, but this should
157157+/// only happen with improper `NodeId` management within `Sakura`, and
158158+/// should have nothing to do with library user's code.
159159+#[derive(Debug, Serialize, Deserialize, Reconcile, Hydrate)]
160160+pub struct Tree<T> {
161161+ root: Option<NodeId>,
162162+ pub(crate) nodes: Vec<Option<Node<T>>>,
163163+ free_ids: Vec<NodeId>,
164164+}
165165+166166+impl<T> Default for Tree<T> {
167167+ fn default() -> Self {
168168+ Self::new()
169169+ }
170170+}
171171+172172+impl<T> PartialEq for Tree<T>
173173+where
174174+ T: PartialEq,
175175+{
176176+ fn eq(&self, other: &Self) -> bool {
177177+ if self.nodes.iter().filter(|x| x.is_some()).count()
178178+ != other.nodes.iter().filter(|x| x.is_some()).count()
179179+ {
180180+ return false;
181181+ }
182182+183183+ for ((i, node1), (j, node2)) in self
184184+ .nodes
185185+ .iter()
186186+ .enumerate()
187187+ .filter_map(|(i, x)| (*x).as_ref().map(|x| (i, x)))
188188+ .zip(
189189+ other
190190+ .nodes
191191+ .iter()
192192+ .enumerate()
193193+ .filter_map(|(i, x)| (*x).as_ref().map(|x| (i, x))),
194194+ )
195195+ {
196196+ let parent1_node = node1.parent.as_ref().and_then(|x| self.get(x).ok());
197197+ let parent2_node = node2.parent.as_ref().and_then(|x| other.get(x).ok());
198198+199199+ if i != j || node1 != node2 || parent1_node != parent2_node {
200200+ return false;
201201+ }
202202+ }
203203+204204+ true
205205+ }
206206+}
207207+208208+impl<T> Tree<T> {
209209+ /// Creates a new `Tree` with default settings (no root `Node` and no space pre-allocation)
210210+ ///
211211+ /// ```
212212+ /// use sakura::Tree;
213213+ ///
214214+ /// let _tree: Tree<i32> = Tree::new();
215215+ /// ```
216216+ #[must_use]
217217+ #[allow(clippy::use_self)]
218218+ pub fn new() -> Tree<T> {
219219+ TreeBuilder::new().build()
220220+ }
221221+222222+ ///
223223+ /// Returns the number of elements the tree can hold without reallocating.
224224+ ///
225225+ #[must_use]
226226+ pub const fn capacity(&self) -> usize {
227227+ self.nodes.capacity()
228228+ }
229229+230230+ /// Returns a `Some` value containing the `NodeId` of the root `Node` if
231231+ /// it exists. Otherwise, a `None` is returned.
232232+ ///
233233+ /// ```
234234+ /// use sakura::*;
235235+ /// use sakura::InsertBehavior::*;
236236+ ///
237237+ /// let mut tree: Tree<i32> = Tree::new();
238238+ /// let root_id = tree.insert(Node::new(5), AsRoot).unwrap();
239239+ ///
240240+ /// # assert_eq!(&root_id, tree.root_node_id().unwrap());
241241+ /// ```
242242+ ///
243243+ #[must_use]
244244+ pub const fn root_node_id(&self) -> Option<&NodeId> {
245245+ self.root.as_ref()
246246+ }
247247+248248+ /// Returns the maximum height of the `Tree`.
249249+ ///
250250+ /// ```
251251+ /// use sakura::*;
252252+ /// use sakura::InsertBehavior::*;
253253+ ///
254254+ /// let mut tree: Tree<i32> = Tree::new();
255255+ /// # assert_eq!(0, tree.height());
256256+ ///
257257+ /// let root_id = tree.insert(Node::new(1), AsRoot).unwrap();
258258+ /// # assert_eq!(1, tree.height());
259259+ ///
260260+ /// tree.insert(Node::new(2), UnderNode(&root_id)).unwrap();
261261+ /// # assert_eq!(2, tree.height());
262262+ /// ```
263263+ #[must_use]
264264+ pub fn height(&self) -> usize {
265265+ self.root
266266+ .as_ref()
267267+ .map_or_else(|| 0, |id| self.height_of_node(id))
268268+ }
269269+270270+ fn height_of_node(&self, node: &NodeId) -> usize {
271271+ let mut h = 0;
272272+ for n in self.children_ids(node).unwrap() {
273273+ h = std::cmp::max(h, self.height_of_node(n));
274274+ }
275275+276276+ h + 1
277277+ }
278278+279279+ /// Gets a reference `Node` from the `Tree`
280280+ ///
281281+ /// # Errors
282282+ ///
283283+ /// Can error if the given `NodeId` is not valid (i.e. it was removed from the `Tree`.)
284284+ ///
285285+ /// # Panics
286286+ ///
287287+ /// Can panic if the `NodeId` does not exist in the `Tree`, but this would
288288+ /// be a bug in `Sakura`
289289+ ///
290290+ /// ```
291291+ /// use sakura::*;
292292+ /// use sakura::InsertBehavior::*;
293293+ ///
294294+ /// let mut tree: Tree<i32> = Tree::new();
295295+ /// let root_id = tree.insert(Node::new(5), AsRoot).unwrap();
296296+ ///
297297+ /// let root_node: &Node<i32> = tree.get(&root_id).unwrap();
298298+ ///
299299+ /// # assert_eq!(root_node.data(), &5);
300300+ /// ```
301301+ ///
302302+ pub fn get(&self, node_id: &NodeId) -> Result<&Node<T>, NodeIdError> {
303303+ // Returns if node id isn't valid.
304304+ let () = self.is_valid_node_id(node_id)?;
305305+306306+ self.nodes
307307+ .get(node_id.index as usize)
308308+ .expect(
309309+ "index must
310310+ exist in tree",
311311+ )
312312+ .as_ref()
313313+ // Since we are given a node id, and that entry in the nodes
314314+ // vec isn't an actual node, the node_id is no longer valid.
315315+ .ok_or(NodeIdError::NodeIdNoLongerValid)
316316+ }
317317+318318+ /// Gets a mutable reference to a `Node` from the `Tree`
319319+ ///
320320+ /// # Errors
321321+ ///
322322+ /// Can error if the given `NodeId` is not valid (i.e. it was removed from the `Tree`.)
323323+ ///
324324+ /// # Panics
325325+ ///
326326+ /// Can panic if the `NodeId` does not exist in the `Tree`, but this would
327327+ /// be a bug in `Sakura`
328328+ ///
329329+ /// ```
330330+ /// use sakura::*;
331331+ /// use sakura::InsertBehavior::*;
332332+ ///
333333+ /// let mut tree: Tree<i32> = Tree::new();
334334+ /// let root_id = tree.insert(Node::new(5), AsRoot).unwrap();
335335+ ///
336336+ /// let root_node: &mut Node<i32> = tree.get_mut(&root_id).unwrap();
337337+ ///
338338+ /// # assert_eq!(root_node.data(), &5);
339339+ /// ```
340340+ ///
341341+ pub fn get_mut(&mut self, node_id: &NodeId) -> Result<&mut Node<T>, NodeIdError> {
342342+ // Returns if node id isn't valid.
343343+ let () = self.is_valid_node_id(node_id)?;
344344+345345+ self.nodes
346346+ .get_mut(node_id.index as usize)
347347+ .expect(
348348+ "index must
349349+ exist in tree",
350350+ )
351351+ .as_mut()
352352+ // Since we are given a node id, and that entry in the nodes
353353+ // vec isn't an actual node, the node_id is no longer valid.
354354+ .ok_or(NodeIdError::NodeIdNoLongerValid)
355355+ }
356356+357357+ /// Inserts a `Node` into the `Tree`, via the provided `InsertBehavior`
358358+ ///
359359+ /// # Errors
360360+ ///
361361+ /// Can error if the given `NodeId` is not valid (i.e. it was removed from the `Tree`.)
362362+ ///
363363+ /// # Panics
364364+ ///
365365+ /// Can panic if the `NodeId` does not exist in the `Tree`, but this would
366366+ /// be a bug in `Sakura`
367367+ ///
368368+ /// ```
369369+ /// use sakura::*;
370370+ /// use sakura::InsertBehavior::*;
371371+ ///
372372+ /// let root_node = Node::new(1);
373373+ /// let child_node = Node::new(2);
374374+ ///
375375+ /// let mut tree: Tree<i32> = Tree::new();
376376+ /// let root_id = tree.insert(root_node, AsRoot).unwrap();
377377+ ///
378378+ /// tree.insert(child_node, UnderNode(&root_id)).unwrap();
379379+ /// ```
380380+ #[allow(clippy::needless_pass_by_value)]
381381+ pub fn insert(
382382+ &mut self,
383383+ node: Node<T>,
384384+ behavior: InsertBehavior,
385385+ ) -> Result<NodeId, NodeIdError> {
386386+ match behavior {
387387+ InsertBehavior::AsRoot => Ok(self.set_root(node)),
388388+ InsertBehavior::UnderNode(parent_id) => {
389389+ self.is_valid_node_id(parent_id)?;
390390+ Ok(self.insert_with_parent(node, parent_id))
391391+ }
392392+ }
393393+ }
394394+395395+ /// Removes a `Node` from the `Tree`, via the provided `RemoveBehavior`
396396+ ///
397397+ /// # Errors
398398+ ///
399399+ /// Can error if the given `NodeId` is not valid (i.e. it was removed from the `Tree`.)
400400+ ///
401401+ /// # Panics
402402+ ///
403403+ /// Can panic if the `NodeId` does not exist in the `Tree`, but this would
404404+ /// be a bug in `Sakura`
405405+ ///
406406+ ///
407407+ /// ```
408408+ /// use sakura::*;
409409+ /// use sakura::InsertBehavior::*;
410410+ /// use sakura::RemoveBehavior::*;
411411+ ///
412412+ /// let mut tree: Tree<i32> = Tree::new();
413413+ /// let root_id = tree.insert(Node::new(0), AsRoot).unwrap();
414414+ ///
415415+ /// let child_id = tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
416416+ /// let grandchild_id = tree.insert(Node::new(2), UnderNode(&child_id)).unwrap();
417417+ ///
418418+ /// let child = tree.remove_node(child_id, DropChildren).unwrap();
419419+ ///
420420+ /// # assert!(tree.get(&grandchild_id).is_err());
421421+ /// # assert_eq!(tree.get(&root_id).unwrap().children().len(), 0);
422422+ /// # assert_eq!(child.children().len(), 0);
423423+ /// # assert_eq!(child.parent(), None);
424424+ /// ```
425425+ #[allow(clippy::needless_pass_by_value)]
426426+ pub fn remove_node(
427427+ &mut self,
428428+ node_id: NodeId,
429429+ behavior: RemoveBehavior,
430430+ ) -> Result<Node<T>, NodeIdError> {
431431+ self.is_valid_node_id(&node_id)?;
432432+433433+ match behavior {
434434+ RemoveBehavior::DropChildren => Ok(self.remove_node_drop_children(node_id)),
435435+ RemoveBehavior::LiftChildren => Ok(self.remove_node_lift_children(node_id)),
436436+ RemoveBehavior::OrphanChildren => Ok(self.remove_node_orphan_children(node_id)),
437437+ }
438438+ }
439439+440440+ /// Remove a `Node` from the `Tree`, while transferring all of its children
441441+ /// to its parent.
442442+ fn remove_node_lift_children(&mut self, node_id: NodeId) -> Node<T> {
443443+ if let Some(parent_id) = self
444444+ .get(&node_id)
445445+ .expect("Tree::remove_node_lift_children: Expecting node_id to be valid.")
446446+ .parent()
447447+ .cloned()
448448+ {
449449+ for child_id in self
450450+ .get(&node_id)
451451+ .expect("Tree::remove_node_lift_children: Expecting node_id to be valid.")
452452+ .children()
453453+ .clone()
454454+ {
455455+ self.set_as_parent_and_child(&parent_id, &child_id);
456456+ }
457457+ } else {
458458+ self.clear_parent_of_children(&node_id);
459459+ }
460460+461461+ self.remove_node_internal(node_id)
462462+ }
463463+464464+ /// Remove a `Node` from the `Tree` including all of its children recursively.
465465+ fn remove_node_drop_children(&mut self, node_id: NodeId) -> Node<T> {
466466+ let children = self
467467+ .get_mut(&node_id)
468468+ .expect("Tree::remove_node_drop_children: Expecting node_id to be valid.")
469469+ .take_children();
470470+471471+ for child in children {
472472+ self.remove_node_drop_children(child);
473473+ }
474474+ self.remove_node_internal(node_id)
475475+ }
476476+477477+ /// Remove a `node` from the `Tree` and leave all of its children in the `Tree`
478478+ fn remove_node_orphan_children(&mut self, node_id: NodeId) -> Node<T> {
479479+ self.clear_parent_of_children(&node_id);
480480+ self.remove_node_internal(node_id)
481481+ }
482482+483483+ /// Moves a `Node` in the `Tree`, via the provided `MoveBehavior`
484484+ ///
485485+ /// # Errors
486486+ ///
487487+ /// Can error if the given `NodeId` is not valid (i.e. it was removed from the `Tree`.)
488488+ ///
489489+ /// # Panics
490490+ ///
491491+ /// Can panic if the `NodeId` does not exist in the `Tree`, but this would
492492+ /// be a bug in `Sakura`
493493+ ///
494494+ #[allow(clippy::needless_pass_by_value)]
495495+ pub fn move_node(
496496+ &mut self,
497497+ node_id: &NodeId,
498498+ behavior: MoveBehavior,
499499+ ) -> Result<(), NodeIdError> {
500500+ self.is_valid_node_id(node_id)?;
501501+502502+ match behavior {
503503+ MoveBehavior::ToRoot => {
504504+ self.move_node_to_root(node_id);
505505+ Ok(())
506506+ }
507507+ MoveBehavior::ToParent(parent_id) => {
508508+ self.move_node_to_parent(node_id, parent_id);
509509+ Ok(())
510510+ }
511511+ }
512512+ }
513513+514514+ fn move_node_to_parent(&mut self, node_id: &NodeId, parent_id: &NodeId) {
515515+ if let Some(subtree_root_id) = self
516516+ .find_subtree_root_between_ids(parent_id, node_id)
517517+ .cloned()
518518+ {
519519+ // node_id is above parent_id, this is a move "down" the tree
520520+ let root = self.root.clone();
521521+522522+ if root.as_ref() == Some(node_id) {
523523+ // We're moving the root down the tree.
524524+ // Also we know the root exists.
525525+526526+ // Detach subtree_root from node.
527527+ self.detach_from_parent(node_id, &subtree_root_id);
528528+529529+ // Set subtree_root as Tree root.
530530+ self.clear_parent(&subtree_root_id);
531531+ self.root = Some(subtree_root_id);
532532+ } else {
533533+ // We're moving some other node down the tree.
534534+535535+ if let Some(old_parent) = self
536536+ .get(node_id)
537537+ .expect("Tree::move_node_to_parent: Expecting valid node_id")
538538+ .parent()
539539+ .cloned()
540540+ {
541541+ // Detach from old parent.
542542+ self.detach_from_parent(&old_parent, node_id);
543543+544544+ //Connect old parent and subtree root.
545545+ self.set_as_parent_and_child(&old_parent, &subtree_root_id);
546546+ } else {
547547+ // Node is orphaned, need to set subtree_root's parent to None (same as node's).
548548+549549+ self.clear_parent(&subtree_root_id);
550550+ }
551551+552552+ // Detach subtree_root from node.
553553+ self.detach_from_parent(node_id, &subtree_root_id);
554554+ }
555555+ } else {
556556+ // this is a move "across" or "up" the tree
557557+558558+ // detach from old parent
559559+560560+ if let Some(old_parent) = self
561561+ .get(node_id)
562562+ .expect("Tree::move_node_to_parent: Expecting valid node_id")
563563+ .parent()
564564+ .cloned()
565565+ {
566566+ self.detach_from_parent(&old_parent, node_id);
567567+ }
568568+ }
569569+ self.set_as_parent_and_child(parent_id, node_id);
570570+ }
571571+572572+ /// Sorts the children of a `Node`, in-place, using compare to compare
573573+ /// the nodes
574574+ ///
575575+ /// This sort is stable and O(n log n) worst case but allocates
576576+ /// approximately 2 * n where n is the length of children
577577+ ///
578578+ /// # Errors
579579+ ///
580580+ /// Can error if the given `NodeId` is not valid (i.e. it was removed from the `Tree`.)
581581+ ///
582582+ /// # Panics
583583+ ///
584584+ /// Can panic if the `NodeId` does not exist in the `Tree`, but this would
585585+ /// be a bug in `Sakura`
586586+ ///
587587+ /// ```
588588+ /// use sakura::*;
589589+ /// use sakura::InsertBehavior::*;
590590+ ///
591591+ /// let mut tree: Tree<i32> = Tree::new();
592592+ ///
593593+ /// let root_id = tree.insert(Node::new(100), AsRoot).unwrap();
594594+ /// tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
595595+ /// tree.insert(Node::new(2), UnderNode(&root_id)).unwrap();
596596+ /// tree.insert(Node::new(0), UnderNode(&root_id)).unwrap();
597597+ ///
598598+ /// tree.sort_children_by(&root_id, |a, b| a.data().cmp(b.data())).unwrap();
599599+ ///
600600+ /// # for (i, id) in tree.get(&root_id).unwrap().children().iter().enumerate() {
601601+ /// # assert_eq!(*tree.get(&id).unwrap().data(), i as i32);
602602+ /// # }
603603+ /// ```
604604+ pub fn sort_children_by<F>(
605605+ &mut self,
606606+ node_id: &NodeId,
607607+ mut compare: F,
608608+ ) -> Result<(), NodeIdError>
609609+ where
610610+ F: FnMut(&Node<T>, &Node<T>) -> Ordering,
611611+ {
612612+ self.is_valid_node_id(node_id)?;
613613+614614+ let mut children = self
615615+ .get_mut(node_id)
616616+ .expect("Tree::sort_children_by: expecting to be passed in a valid node_id")
617617+ .take_children();
618618+619619+ children.sort_by(|a, b| {
620620+ compare(
621621+ self.get(a)
622622+ .expect("Tree::sort_children_by: expecting to be passed in a valid node_id"),
623623+ self.get(b)
624624+ .expect("Tree::sort_children_by: expecting to be passed in a valid node_id"),
625625+ )
626626+ });
627627+628628+ self.get_mut(node_id)
629629+ .expect("Tree::sort_children_by: expecting to be passed in a valid node_id")
630630+ .set_children(children);
631631+632632+ Ok(())
633633+ }
634634+635635+ /// Sorts the children of a `Node`, in-place, using their data.
636636+ ///
637637+ /// This sort is stable and O(n log n) worst case but allocates
638638+ /// approximately 2 * n where n is the length of children
639639+ ///
640640+ /// # Errors
641641+ ///
642642+ /// Can error if the given `NodeId` is not valid (i.e. it was removed from the `Tree`.)
643643+ ///
644644+ /// # Panics
645645+ ///
646646+ /// Can panic if the `NodeId` does not exist in the `Tree`, but this would
647647+ /// be a bug in `Sakura`
648648+ ///
649649+ /// ```
650650+ /// use sakura::*;
651651+ /// use sakura::InsertBehavior::*;
652652+ ///
653653+ /// let mut tree: Tree<i32> = Tree::new();
654654+ ///
655655+ /// let root_id = tree.insert(Node::new(100), AsRoot).unwrap();
656656+ /// tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
657657+ /// tree.insert(Node::new(2), UnderNode(&root_id)).unwrap();
658658+ /// tree.insert(Node::new(0), UnderNode(&root_id)).unwrap();
659659+ ///
660660+ /// tree.sort_children_by_data(&root_id).unwrap();
661661+ ///
662662+ /// # for (i, id) in tree.get(&root_id).unwrap().children().iter().enumerate() {
663663+ /// # assert_eq!(*tree.get(&id).unwrap().data(), i as i32);
664664+ /// # }
665665+ /// ```
666666+ ///
667667+ pub fn sort_children_by_data(&mut self, node_id: &NodeId) -> Result<(), NodeIdError>
668668+ where
669669+ T: Ord,
670670+ {
671671+ self.is_valid_node_id(node_id)?;
672672+673673+ let mut children = self
674674+ .get_mut(node_id)
675675+ .expect("Tree::sort_children_by: expecting to be passed in a valid node_id")
676676+ .take_children();
677677+678678+ children.sort_by_key(|a| {
679679+ self.get(a)
680680+ .expect("Tree::sort_children_by: expecting to be passed in a valid node_id")
681681+ });
682682+683683+ self.get_mut(node_id)
684684+ .expect("Tree::sort_children_by: expecting to be passed in a valid node_id")
685685+ .set_children(children);
686686+687687+ Ok(())
688688+ }
689689+690690+ /// Returns an `Ancestors` iterator
691691+ ///
692692+ /// # Errors
693693+ ///
694694+ /// Can error if the given `NodeId` is not valid (i.e. it was removed from the `Tree`.)
695695+ ///
696696+ /// # Panics
697697+ ///
698698+ /// Can panic if the `NodeId` does not exist in the `Tree`, but this would
699699+ /// be a bug in `Sakura`
700700+ ///
701701+ /// ```
702702+ /// use sakura::*;
703703+ /// use sakura::InsertBehavior::*;
704704+ ///
705705+ /// let mut tree: Tree<i32> = Tree::new();
706706+ /// let root_id = tree.insert(Node::new(0), AsRoot).unwrap();
707707+ /// let node_1 = tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
708708+ ///
709709+ /// let mut ancestors = tree.ancestors(&node_1).unwrap();
710710+ ///
711711+ /// # assert_eq!(ancestors.next().unwrap().data(), &0);
712712+ /// # assert!(ancestors.next().is_none());
713713+ /// ```
714714+ pub fn ancestors(&self, node_id: &NodeId) -> Result<Ancestors<'_, T>, NodeIdError> {
715715+ self.is_valid_node_id(node_id)?;
716716+ Ok(Ancestors::new(self, node_id.clone()))
717717+ }
718718+719719+ /// Returns an `AncestorIds` iterator
720720+ ///
721721+ ///
722722+ /// # Errors
723723+ ///
724724+ /// Can error if the given `NodeId` is not valid (i.e. it was removed from the `Tree`.)
725725+ ///
726726+ /// # Panics
727727+ ///
728728+ /// Can panic if the `NodeId` does not exist in the `Tree`, but this would
729729+ /// be a bug in `Sakura`
730730+ ///
731731+ ///
732732+ /// ```
733733+ /// use sakura::*;
734734+ /// use sakura::InsertBehavior::*;
735735+ ///
736736+ /// let mut tree: Tree<i32> = Tree::new();
737737+ /// let root_id = tree.insert(Node::new(0), AsRoot).unwrap();
738738+ /// let node_1 = tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
739739+ ///
740740+ /// let mut ancestor_ids = tree.ancestor_ids(&node_1).unwrap();
741741+ ///
742742+ /// # assert_eq!(ancestor_ids.next().unwrap(), &root_id);
743743+ /// # assert!(ancestor_ids.next().is_none());
744744+ /// ```
745745+ ///
746746+ pub fn ancestor_ids(&self, node_id: &NodeId) -> Result<AncestorsIds<'_, T>, NodeIdError> {
747747+ self.is_valid_node_id(node_id)?;
748748+749749+ Ok(AncestorsIds::new(self, node_id.clone()))
750750+ }
751751+752752+ /// Returns an `Children` iterator for a given `NodeId`
753753+ ///
754754+ /// # Errors
755755+ ///
756756+ /// Can error if the given `NodeId` is not valid (i.e. it was removed from the `Tree`.)
757757+ ///
758758+ /// # Panics
759759+ ///
760760+ /// Can panic if the `NodeId` does not exist in the `Tree`, but this would
761761+ /// be a bug in `Sakura`
762762+ ///
763763+ /// ```
764764+ /// use sakura::*;
765765+ /// use sakura::InsertBehavior::*;
766766+ ///
767767+ /// let mut tree: Tree<i32> = Tree::new();
768768+ /// let root_id = tree.insert(Node::new(0), AsRoot).unwrap();
769769+ /// tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
770770+ ///
771771+ /// let mut children = tree.children(&root_id).unwrap();
772772+ ///
773773+ /// # assert_eq!(children.next().unwrap().data(), &1);
774774+ /// # assert!(children.next().is_none());
775775+ /// ```
776776+ pub fn children(&self, node_id: &NodeId) -> Result<Children<'_, T>, NodeIdError> {
777777+ self.is_valid_node_id(node_id)?;
778778+ Ok(Children::new(self, node_id))
779779+ }
780780+781781+ /// Returns an `Children` iterator for a given `NodeId`
782782+ ///
783783+ /// # Errors
784784+ ///
785785+ /// Can error if the given `NodeId` is not valid (i.e. it was removed from the `Tree`.)
786786+ ///
787787+ /// # Panics
788788+ ///
789789+ /// Can panic if the `NodeId` does not exist in the `Tree`, but this would
790790+ /// be a bug in `Sakura`
791791+ ///
792792+ /// ```
793793+ /// use sakura::*;
794794+ /// use sakura::InsertBehavior::*;
795795+ ///
796796+ /// let mut tree: Tree<i32> = Tree::new();
797797+ /// let root_id = tree.insert(Node::new(0), AsRoot).unwrap();
798798+ /// let node_1 = tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
799799+ ///
800800+ /// let mut children_ids = tree.children_ids(&root_id).unwrap();
801801+ ///
802802+ /// # assert_eq!(children_ids.next().unwrap(), &node_1);
803803+ /// # assert!(children_ids.next().is_none());
804804+ /// ```
805805+ pub fn children_ids(&self, node_id: &NodeId) -> Result<ChildrenIds<'_>, NodeIdError> {
806806+ self.is_valid_node_id(node_id)?;
807807+ Ok(ChildrenIds::new(self, node_id))
808808+ }
809809+810810+ /// Returns a `PreOrderTraversal` iterator
811811+ ///
812812+ /// # Errors
813813+ ///
814814+ /// Can error if the given `NodeId` is not valid (i.e. it was removed from the `Tree`.)
815815+ ///
816816+ /// # Panics
817817+ ///
818818+ /// Can panic if the `NodeId` does not exist in the `Tree`, but this would
819819+ /// be a bug in `Sakura`
820820+ ///
821821+ /// ```
822822+ /// use sakura::*;
823823+ /// use sakura::InsertBehavior::*;
824824+ ///
825825+ /// let mut tree: Tree<i32> = Tree::new();
826826+ /// let root_id = tree.insert(Node::new(0), AsRoot).unwrap();
827827+ /// tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
828828+ ///
829829+ /// let mut nodes = tree.traverse_pre_order(&root_id).unwrap();
830830+ ///
831831+ /// # assert_eq!(nodes.next().unwrap().data(), &0);
832832+ /// # assert_eq!(nodes.next().unwrap().data(), &1);
833833+ /// # assert!(nodes.next().is_none());
834834+ /// ```
835835+ ///
836836+ pub fn traverse_pre_order(
837837+ &self,
838838+ node_id: &NodeId,
839839+ ) -> Result<PreOrderTraversal<'_, T>, NodeIdError> {
840840+ self.is_valid_node_id(node_id)?;
841841+842842+ Ok(PreOrderTraversal::new(self, node_id.clone()))
843843+ }
844844+845845+ /// Returns a `PreOrderTraversalIds` iterator
846846+ ///
847847+ /// # Errors
848848+ ///
849849+ /// Can error if the given `NodeId` is not valid (i.e. it was removed from the `Tree`.)
850850+ ///
851851+ /// # Panics
852852+ ///
853853+ /// Can panic if the `NodeId` does not exist in the `Tree`, but this would
854854+ /// be a bug in `Sakura`
855855+ ///
856856+ /// ```
857857+ /// use sakura::*;
858858+ /// use sakura::InsertBehavior::*;
859859+ ///
860860+ /// let mut tree: Tree<i32> = Tree::new();
861861+ /// let root_id = tree.insert(Node::new(0), AsRoot).unwrap();
862862+ /// tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
863863+ ///
864864+ /// let mut nodes = tree.traverse_pre_order_ids(&root_id).unwrap();
865865+ ///
866866+ /// assert_eq!(tree.get(&nodes.next().unwrap()).unwrap().data(), &0);
867867+ /// assert_eq!(tree.get(&nodes.next().unwrap()).unwrap().data(), &1);
868868+ /// assert!(nodes.next().is_none());
869869+ /// ```
870870+ ///
871871+ pub fn traverse_pre_order_ids(
872872+ &self,
873873+ node_id: &NodeId,
874874+ ) -> Result<PreOrderTraversalIds<'_, T>, NodeIdError> {
875875+ self.is_valid_node_id(node_id)?;
876876+877877+ Ok(PreOrderTraversalIds::new(self, node_id.clone()))
878878+ }
879879+880880+ fn move_node_to_root(&mut self, node_id: &NodeId) {
881881+ let old_root = self.root.clone();
882882+883883+ if let Some(parent_id) = self
884884+ .get(node_id)
885885+ .expect("Tree::move_node_to_root Expected a valid NodeId")
886886+ .parent
887887+ .clone()
888888+ {
889889+ self.detach_from_parent(&parent_id, node_id);
890890+ }
891891+892892+ self.clear_parent(node_id);
893893+894894+ self.root = Some(node_id.clone());
895895+896896+ if let Some(old_root) = old_root {
897897+ self.move_node_to_parent(&old_root, node_id);
898898+ }
899899+ }
900900+901901+ fn insert_with_parent(&mut self, child: Node<T>, parent_id: &NodeId) -> NodeId {
902902+ let new_child_id = self.insert_new_node(child);
903903+ self.set_as_parent_and_child(parent_id, &new_child_id);
904904+ new_child_id
905905+ }
906906+907907+ fn set_root(&mut self, new_root: Node<T>) -> NodeId {
908908+ let new_root_id = self.insert_new_node(new_root);
909909+910910+ if let Some(current_root_node_id) = self.root.clone() {
911911+ self.set_as_parent_and_child(&new_root_id, ¤t_root_node_id);
912912+ }
913913+914914+ self.root = Some(new_root_id.clone());
915915+916916+ new_root_id
917917+ }
918918+919919+ fn find_subtree_root_between_ids<'a>(
920920+ &'a self,
921921+ lower_id: &'a NodeId,
922922+ upper_id: &'a NodeId,
923923+ ) -> Option<&'a NodeId> {
924924+ if let Some(lower_parent) = self.get(lower_id).unwrap().parent() {
925925+ if lower_parent == upper_id {
926926+ return Some(lower_id);
927927+ }
928928+ return self.find_subtree_root_between_ids(lower_parent, upper_id);
929929+ }
930930+931931+ None
932932+ }
933933+934934+ fn set_as_parent_and_child(&mut self, parent_id: &NodeId, child_id: &NodeId) {
935935+ self.get_mut(parent_id)
936936+ .expect("Tree::set_as_parent_and_child: parent_id should be inside the Tree.")
937937+ .add_child(child_id.clone());
938938+939939+ self.get_mut(child_id)
940940+ .expect("Tree::set_as_parent_and_child: child_id should be inside the Tree.")
941941+ .set_parent(Some(parent_id.clone()));
942942+ }
943943+944944+ fn detach_from_parent(&mut self, parent_id: &NodeId, node_id: &NodeId) {
945945+ self.get_mut(parent_id)
946946+ .expect("Tree::detach_from_parent: parent_id must be present in tree")
947947+ .children_mut()
948948+ .retain(|child_id| *child_id != *node_id);
949949+ }
950950+951951+ fn insert_new_node(&mut self, new_node: Node<T>) -> NodeId {
952952+ if self.free_ids.is_empty() {
953953+ let new_node_idx = self.nodes.len();
954954+ self.nodes.push(Some(new_node));
955955+ NodeId::new(new_node_idx)
956956+ } else {
957957+ let new_node_id = self
958958+ .free_ids
959959+ .pop()
960960+ .expect("Tree::insert_new_node: Couldn't pop from vec with len() > 0.");
961961+962962+ self.nodes.push(Some(new_node));
963963+ self.nodes.swap_remove(new_node_id.index as usize);
964964+ new_node_id
965965+ }
966966+ }
967967+968968+ fn is_valid_node_id(&self, node_id: &NodeId) -> Result<(), NodeIdError> {
969969+ let idx = node_id.index as usize;
970970+971971+ assert!(
972972+ idx <= self.nodes.len(),
973973+ "NodeId: {node_id:?} is out of bounds. This is a bug inside
974974+ Sakura.",
975975+ );
976976+977977+ if self.nodes.get(idx).is_none() {
978978+ return Err(NodeIdError::NodeIdNoLongerValid);
979979+ }
980980+981981+ Ok(())
982982+ }
983983+984984+ // We want to have the node_id be consumed by this remove function.
985985+ #[allow(clippy::needless_pass_by_value)]
986986+ fn remove_node_internal(&mut self, node_id: NodeId) -> Node<T> {
987987+ if let Some(root_id) = &self.root
988988+ && node_id == *root_id
989989+ {
990990+ self.root = None;
991991+ }
992992+993993+ let mut node = self.take_node(node_id.clone());
994994+995995+ if let Some(parent_id) = node.parent() {
996996+ self.get_mut(parent_id)
997997+ .expect(
998998+ "Tree::remove_node_internal: expecting
999999+ parent_id to be a valid node_id!",
10001000+ )
10011001+ .children_mut()
10021002+ .retain(|child_id| *child_id != node_id);
10031003+ }
10041004+10051005+ node.children_mut().clear();
10061006+ node.set_parent(None);
10071007+10081008+ node
10091009+ }
10101010+10111011+ fn take_node(&mut self, node_id: NodeId) -> Node<T> {
10121012+ self.nodes.push(None);
10131013+10141014+ let node = self
10151015+ .nodes
10161016+ .swap_remove(node_id.index as usize)
10171017+ .expect("Tree::take_node: expecting node_id to be a valid node_id!");
10181018+10191019+ self.free_ids.push(node_id);
10201020+10211021+ node
10221022+ }
10231023+10241024+ fn clear_parent(&mut self, node_id: &NodeId) {
10251025+ self.set_parent(node_id, None);
10261026+ }
10271027+10281028+ fn set_parent(&mut self, node_id: &NodeId, parent_id: Option<NodeId>) {
10291029+ self.get_mut(node_id)
10301030+ .expect(
10311031+ "Tree::set_parent: expecting node_id to
10321032+ be present inside tree!",
10331033+ )
10341034+ .set_parent(parent_id);
10351035+ }
10361036+10371037+ fn clear_parent_of_children(&mut self, node_id: &NodeId) {
10381038+ self.set_parent_of_children(node_id, None);
10391039+ }
10401040+10411041+ fn set_parent_of_children(&mut self, node_id: &NodeId, new_parent: Option<&NodeId>) {
10421042+ for child_id in self
10431043+ .get(node_id)
10441044+ .expect("Tree::set_parent_of_child: expect node_id to be a valid node inside tree.")
10451045+ .children
10461046+ .clone()
10471047+ {
10481048+ self.set_parent(&child_id, new_parent.cloned());
10491049+ }
10501050+ }
10511051+}
10521052+10531053+impl<T: std::fmt::Debug> Tree<T> {
10541054+ /// Write formatted tree representation and nodes with debug formatting.
10551055+ ///
10561056+ ///
10571057+ /// # Errors
10581058+ ///
10591059+ /// Function can error if something goes wrong during debug!
10601060+ ///
10611061+ /// # Panics
10621062+ ///
10631063+ /// Function can error if something goes wrong during debug!
10641064+ ///
10651065+ /// ```
10661066+ /// use sakura::Tree;
10671067+ /// use sakura::Node;
10681068+ /// use sakura::InsertBehavior::*;
10691069+ ///
10701070+ /// let mut tree = Tree::<i32>::new();
10711071+ /// let root_id = tree.insert(Node::new(0), AsRoot).unwrap();
10721072+ /// let first_child_id = tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
10731073+ /// let _ = tree.insert(Node::new(2), UnderNode(&first_child_id)).unwrap();
10741074+ /// let _ = tree.insert(Node::new(3), UnderNode(&root_id)).unwrap();
10751075+ /// let mut s = String::new();
10761076+ /// tree.write_formatted(&mut s).unwrap();
10771077+ /// assert_eq!(&s, "\
10781078+ /// 0
10791079+ /// ├── 1
10801080+ /// │ └── 2
10811081+ /// └── 3
10821082+ /// ");
10831083+ /// ```
10841084+ ///
10851085+ /// Writes nothing if the tree is empty.
10861086+ ///
10871087+ /// ```
10881088+ /// use sakura::Tree;
10891089+ ///
10901090+ /// let tree = Tree::<i32>::new();
10911091+ /// let mut s = String::new();
10921092+ /// tree.write_formatted(&mut s).unwrap();
10931093+ /// # assert_eq!(&s, "");
10941094+ /// ```
10951095+ pub fn write_formatted<W: std::fmt::Write>(&self, w: &mut W) -> std::fmt::Result {
10961096+ if let Some(node_id) = self.root_node_id() {
10971097+ let childn = 0;
10981098+ let level = 0;
10991099+ let last = vec![];
11001100+ let mut stack = vec![(node_id, childn, level, last)];
11011101+ while let Some((node_id, childn, level, last)) = stack.pop() {
11021102+ debug_assert_eq!(
11031103+ last.len(),
11041104+ level,
11051105+ "each previous level should indicate whether it has reached the last node"
11061106+ );
11071107+ let node = self
11081108+ .get(node_id)
11091109+ .expect("getting node of existing node ref id");
11101110+ if childn == 0 {
11111111+ for i in 1..level {
11121112+ if last[i - 1] {
11131113+ write!(w, " ")?;
11141114+ } else {
11151115+ write!(w, "│ ")?;
11161116+ }
11171117+ }
11181118+ if level > 0 {
11191119+ if last[level - 1] {
11201120+ write!(w, "└── ")?;
11211121+ } else {
11221122+ write!(w, "├── ")?;
11231123+ }
11241124+ }
11251125+ writeln!(w, "{:?}", node.data())?;
11261126+ }
11271127+ let mut children = node.children().iter().skip(childn);
11281128+ if let Some(child_id) = children.next() {
11291129+ let mut next_last = last.clone();
11301130+ if children.next().is_some() {
11311131+ stack.push((node_id, childn + 1, level, last));
11321132+ next_last.push(false);
11331133+ } else {
11341134+ next_last.push(true);
11351135+ }
11361136+ stack.push((child_id, 0, level + 1, next_last));
11371137+ }
11381138+ }
11391139+ }
11401140+ Ok(())
11411141+ }
11421142+}
11431143+11441144+#[cfg(test)]
11451145+mod tree_builder_tests {
11461146+ use super::super::Node;
11471147+ use super::TreeBuilder;
11481148+11491149+ #[test]
11501150+ fn test_new() {
11511151+ let tb: TreeBuilder<i32> = TreeBuilder::new();
11521152+ assert!(tb.root.is_none());
11531153+ assert_eq!(tb.node_capacity, 0);
11541154+ assert_eq!(tb.swap_capacity, 0);
11551155+ }
11561156+11571157+ #[test]
11581158+ fn test_with_root() {
11591159+ let tb: TreeBuilder<i32> = TreeBuilder::new().with_root(Node::new(5));
11601160+11611161+ assert_eq!(tb.root.unwrap().data(), &5);
11621162+ assert_eq!(tb.node_capacity, 0);
11631163+ assert_eq!(tb.swap_capacity, 0);
11641164+ }
11651165+11661166+ #[test]
11671167+ fn test_with_node_capacity() {
11681168+ let tb: TreeBuilder<i32> = TreeBuilder::new().with_node_capacity(10);
11691169+11701170+ assert!(tb.root.is_none());
11711171+ assert_eq!(tb.node_capacity, 10);
11721172+ assert_eq!(tb.swap_capacity, 0);
11731173+ }
11741174+11751175+ #[test]
11761176+ fn test_with_swap_capacity() {
11771177+ let tb: TreeBuilder<i32> = TreeBuilder::new().with_swap_capacity(10);
11781178+11791179+ assert!(tb.root.is_none());
11801180+ assert_eq!(tb.node_capacity, 0);
11811181+ assert_eq!(tb.swap_capacity, 10);
11821182+ }
11831183+11841184+ #[test]
11851185+ fn test_with_all_settings() {
11861186+ let tb: TreeBuilder<i32> = TreeBuilder::new()
11871187+ .with_root(Node::new(5))
11881188+ .with_node_capacity(10)
11891189+ .with_swap_capacity(3);
11901190+11911191+ assert_eq!(tb.root.unwrap().data(), &5);
11921192+ assert_eq!(tb.node_capacity, 10);
11931193+ assert_eq!(tb.swap_capacity, 3);
11941194+ }
11951195+11961196+ #[test]
11971197+ fn test_build() {
11981198+ let tree = TreeBuilder::new()
11991199+ .with_root(Node::new(5))
12001200+ .with_node_capacity(10)
12011201+ .with_swap_capacity(3)
12021202+ .build();
12031203+12041204+ let root = tree.get(tree.root_node_id().unwrap()).unwrap();
12051205+12061206+ assert_eq!(root.data(), &5);
12071207+ assert_eq!(tree.capacity(), 10);
12081208+ assert_eq!(tree.free_ids.capacity(), 3);
12091209+ }
12101210+}
12111211+12121212+#[cfg(test)]
12131213+#[allow(clippy::similar_names)]
12141214+mod tree_tests {
12151215+ use crate::InsertBehavior;
12161216+ use crate::MoveBehavior;
12171217+ use crate::RemoveBehavior;
12181218+12191219+ use super::super::Node;
12201220+ use super::super::NodeId;
12211221+ use super::Tree;
12221222+ use super::TreeBuilder;
12231223+12241224+ #[test]
12251225+ fn test_new() {
12261226+ let tree: Tree<i32> = Tree::new();
12271227+12281228+ assert_eq!(tree.root, None);
12291229+ assert_eq!(tree.nodes.len(), 0);
12301230+ assert_eq!(tree.free_ids.len(), 0);
12311231+ }
12321232+12331233+ #[test]
12341234+ fn test_get() {
12351235+ let tree = TreeBuilder::new().with_root(Node::new(5)).build();
12361236+12371237+ let root_id = tree.root.clone().unwrap();
12381238+ let root = tree.get(&root_id).unwrap();
12391239+12401240+ assert_eq!(root.data(), &5);
12411241+ }
12421242+12431243+ #[test]
12441244+ fn test_get_mut() {
12451245+ let mut tree = TreeBuilder::new().with_root(Node::new(5)).build();
12461246+12471247+ let root_id = tree.root.clone().unwrap();
12481248+12491249+ {
12501250+ let root = tree.get(&root_id).unwrap();
12511251+ assert_eq!(root.data(), &5);
12521252+ }
12531253+12541254+ {
12551255+ let root = tree.get_mut(&root_id).unwrap();
12561256+ *root.data_mut() = 6;
12571257+ }
12581258+12591259+ let root = tree.get(&root_id).unwrap();
12601260+ assert_eq!(root.data(), &6);
12611261+ }
12621262+12631263+ #[test]
12641264+ fn test_set_root() {
12651265+ use InsertBehavior::*;
12661266+12671267+ let a = 5;
12681268+ let b = 6;
12691269+ let node_a = Node::new(a);
12701270+ let node_b = Node::new(b);
12711271+12721272+ let mut tree = TreeBuilder::new().build();
12731273+12741274+ let node_a_id = tree.insert(node_a, AsRoot).unwrap();
12751275+ let root_id = tree.root.clone().unwrap();
12761276+ assert_eq!(node_a_id, root_id);
12771277+12781278+ {
12791279+ let node_a_ref = tree.get(&node_a_id).unwrap();
12801280+ let root_ref = tree.get(&root_id).unwrap();
12811281+ assert_eq!(node_a_ref.data(), &a);
12821282+ assert_eq!(root_ref.data(), &a);
12831283+ }
12841284+12851285+ let node_b_id = tree.insert(node_b, AsRoot).unwrap();
12861286+ let root_id = tree.root.clone().unwrap();
12871287+ assert_eq!(node_b_id, root_id);
12881288+12891289+ {
12901290+ let node_b_ref = tree.get(&node_b_id).unwrap();
12911291+ let root_ref = tree.get(&root_id).unwrap();
12921292+ assert_eq!(node_b_ref.data(), &b);
12931293+ assert_eq!(root_ref.data(), &b);
12941294+12951295+ let node_b_child_id = node_b_ref.children().first().unwrap();
12961296+ let node_b_child_ref = tree.get(node_b_child_id).unwrap();
12971297+ assert_eq!(node_b_child_ref.data(), &a);
12981298+ }
12991299+ }
13001300+13011301+ #[test]
13021302+ fn test_root_node_id() {
13031303+ let tree = TreeBuilder::new().with_root(Node::new(5)).build();
13041304+13051305+ let root_id = tree.root.clone().unwrap();
13061306+ let root_node_id = tree.root_node_id().unwrap();
13071307+13081308+ assert_eq!(&root_id, root_node_id);
13091309+ }
13101310+13111311+ #[test]
13121312+ fn test_insert_with_parent() {
13131313+ use InsertBehavior::*;
13141314+13151315+ let a = 1;
13161316+ let b = 2;
13171317+ let r = 5;
13181318+13191319+ let mut tree = TreeBuilder::new().with_root(Node::new(r)).build();
13201320+13211321+ let node_a = Node::new(a);
13221322+ let node_b = Node::new(b);
13231323+13241324+ let root_id = tree.root.clone().unwrap();
13251325+ let node_a_id = tree.insert(node_a, UnderNode(&root_id)).unwrap();
13261326+ let node_b_id = tree.insert(node_b, UnderNode(&root_id)).unwrap();
13271327+13281328+ let node_a_ref = tree.get(&node_a_id).unwrap();
13291329+ let node_b_ref = tree.get(&node_b_id).unwrap();
13301330+ assert_eq!(node_a_ref.data(), &a);
13311331+ assert_eq!(node_b_ref.data(), &b);
13321332+13331333+ assert_eq!(node_a_ref.parent().unwrap().clone(), root_id);
13341334+ assert_eq!(node_b_ref.parent().unwrap().clone(), root_id);
13351335+13361336+ let root_node_ref = tree.get(&root_id).unwrap();
13371337+ let root_children: &Vec<NodeId> = root_node_ref.children();
13381338+13391339+ let child_1_id = root_children.first().unwrap();
13401340+ let child_2_id = root_children.get(1).unwrap();
13411341+13421342+ let child_1_ref = tree.get(child_1_id).unwrap();
13431343+ let child_2_ref = tree.get(child_2_id).unwrap();
13441344+13451345+ assert_eq!(child_1_ref.data(), &a);
13461346+ assert_eq!(child_2_ref.data(), &b);
13471347+ }
13481348+13491349+ #[test]
13501350+ fn test_remove_node_lift_children() {
13511351+ use InsertBehavior::*;
13521352+ use RemoveBehavior::*;
13531353+13541354+ let mut tree = TreeBuilder::new().with_root(Node::new(5)).build();
13551355+13561356+ let root_id = tree.root.clone().unwrap();
13571357+13581358+ let node_1_id = tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
13591359+ let node_2_id = tree.insert(Node::new(2), UnderNode(&node_1_id)).unwrap();
13601360+ let node_3_id = tree.insert(Node::new(3), UnderNode(&node_1_id)).unwrap();
13611361+13621362+ let node_1 = tree.remove_node(node_1_id.clone(), LiftChildren).unwrap();
13631363+13641364+ assert_eq!(Some(&root_id), tree.root_node_id());
13651365+13661366+ assert_eq!(node_1.data(), &1);
13671367+ assert_eq!(node_1.children().len(), 0);
13681368+ assert!(node_1.parent().is_none());
13691369+ assert!(tree.get(&node_1_id).is_err());
13701370+13711371+ let root_ref = tree.get(&root_id).unwrap();
13721372+ let node_2_ref = tree.get(&node_2_id).unwrap();
13731373+ let node_3_ref = tree.get(&node_3_id).unwrap();
13741374+13751375+ assert_eq!(node_2_ref.data(), &2);
13761376+ assert_eq!(node_3_ref.data(), &3);
13771377+13781378+ assert_eq!(node_2_ref.parent().unwrap(), &root_id);
13791379+ assert_eq!(node_3_ref.parent().unwrap(), &root_id);
13801380+13811381+ assert!(root_ref.children().contains(&node_2_id));
13821382+ assert!(root_ref.children().contains(&node_3_id));
13831383+ }
13841384+13851385+ #[test]
13861386+ fn test_remove_node_orphan_children() {
13871387+ use InsertBehavior::*;
13881388+ use RemoveBehavior::*;
13891389+13901390+ let mut tree = TreeBuilder::new().with_root(Node::new(5)).build();
13911391+13921392+ let root_id = tree.root.clone().unwrap();
13931393+13941394+ let node_1_id = tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
13951395+ let node_2_id = tree.insert(Node::new(2), UnderNode(&node_1_id)).unwrap();
13961396+ let node_3_id = tree.insert(Node::new(3), UnderNode(&node_1_id)).unwrap();
13971397+13981398+ let node_1 = tree.remove_node(node_1_id.clone(), OrphanChildren).unwrap();
13991399+14001400+ assert_eq!(Some(&root_id), tree.root_node_id());
14011401+14021402+ assert_eq!(node_1.data(), &1);
14031403+ assert_eq!(node_1.children().len(), 0);
14041404+ assert!(node_1.parent().is_none());
14051405+ assert!(tree.get(&node_1_id).is_err());
14061406+14071407+ let node_2_ref = tree.get(&node_2_id).unwrap();
14081408+ let node_3_ref = tree.get(&node_3_id).unwrap();
14091409+14101410+ assert_eq!(node_2_ref.data(), &2);
14111411+ assert_eq!(node_3_ref.data(), &3);
14121412+14131413+ assert!(node_2_ref.parent().is_none());
14141414+ assert!(node_3_ref.parent().is_none());
14151415+ }
14161416+14171417+ #[test]
14181418+ fn test_remove_root() {
14191419+ use RemoveBehavior::*;
14201420+14211421+ let mut tree = TreeBuilder::new().with_root(Node::new(5)).build();
14221422+14231423+ let root_id = tree.root.clone().unwrap();
14241424+ tree.remove_node(root_id, OrphanChildren).unwrap();
14251425+ assert_eq!(None, tree.root_node_id());
14261426+14271427+ let mut tree = TreeBuilder::new().with_root(Node::new(5)).build();
14281428+14291429+ let root_id = tree.root.clone().unwrap();
14301430+ tree.remove_node(root_id, LiftChildren).unwrap();
14311431+ assert_eq!(None, tree.root_node_id());
14321432+ }
14331433+14341434+ #[test]
14351435+ fn test_move_node_to_parent() {
14361436+ use InsertBehavior::*;
14371437+ use MoveBehavior::*;
14381438+14391439+ let mut tree = Tree::new();
14401440+14411441+ let root_id = tree.insert(Node::new(0), AsRoot).unwrap();
14421442+ let node_1_id = tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
14431443+ let node_2_id = tree.insert(Node::new(2), UnderNode(&root_id)).unwrap();
14441444+ let node_3_id = tree.insert(Node::new(3), UnderNode(&node_1_id)).unwrap();
14451445+14461446+ // Move 3 "across" the tree.
14471447+ tree.move_node(&node_3_id, ToParent(&node_2_id)).unwrap();
14481448+ assert!(tree.get(&root_id).unwrap().children().contains(&node_1_id));
14491449+ assert!(tree.get(&root_id).unwrap().children().contains(&node_2_id));
14501450+ assert!(
14511451+ tree.get(&node_2_id,)
14521452+ .unwrap()
14531453+ .children()
14541454+ .contains(&node_3_id,)
14551455+ );
14561456+14571457+ // Move 3 "up" the tree.
14581458+ tree.move_node(&node_3_id, ToParent(&root_id)).unwrap();
14591459+ assert!(tree.get(&root_id).unwrap().children().contains(&node_1_id));
14601460+ assert!(tree.get(&root_id).unwrap().children().contains(&node_2_id));
14611461+ assert!(tree.get(&root_id).unwrap().children().contains(&node_3_id));
14621462+14631463+ // Move 3 "down" (really this is across though) the tree.
14641464+ tree.move_node(&node_3_id, ToParent(&node_1_id)).unwrap();
14651465+ assert!(tree.get(&root_id).unwrap().children().contains(&node_1_id));
14661466+ assert!(tree.get(&root_id).unwrap().children().contains(&node_2_id));
14671467+ assert!(
14681468+ tree.get(&node_1_id,)
14691469+ .unwrap()
14701470+ .children()
14711471+ .contains(&node_3_id,)
14721472+ );
14731473+14741474+ // Move 1 "down" the tree.
14751475+ tree.move_node(&node_1_id, ToParent(&node_3_id)).unwrap();
14761476+ assert!(tree.get(&root_id).unwrap().children().contains(&node_2_id));
14771477+ assert!(tree.get(&root_id).unwrap().children().contains(&node_3_id));
14781478+ assert!(
14791479+ tree.get(&node_3_id,)
14801480+ .unwrap()
14811481+ .children()
14821482+ .contains(&node_1_id,)
14831483+ );
14841484+14851485+ // Note: node_1 is at the lowest point in the tree before these insertions.
14861486+ let node_4_id = tree.insert(Node::new(4), UnderNode(&node_1_id)).unwrap();
14871487+ let node_5_id = tree.insert(Node::new(5), UnderNode(&node_4_id)).unwrap();
14881488+14891489+ // move 3 "down" the tree
14901490+ tree.move_node(&node_3_id, ToParent(&node_5_id)).unwrap();
14911491+ assert!(tree.get(&root_id).unwrap().children().contains(&node_2_id));
14921492+ assert!(tree.get(&root_id).unwrap().children().contains(&node_1_id));
14931493+ assert!(
14941494+ tree.get(&node_1_id,)
14951495+ .unwrap()
14961496+ .children()
14971497+ .contains(&node_4_id,)
14981498+ );
14991499+ assert!(
15001500+ tree.get(&node_4_id,)
15011501+ .unwrap()
15021502+ .children()
15031503+ .contains(&node_5_id,)
15041504+ );
15051505+ assert!(
15061506+ tree.get(&node_5_id,)
15071507+ .unwrap()
15081508+ .children()
15091509+ .contains(&node_3_id,)
15101510+ );
15111511+15121512+ // move root "down" the tree
15131513+ tree.move_node(&root_id, ToParent(&node_2_id)).unwrap();
15141514+ assert!(tree.get(&node_2_id).unwrap().children().contains(&root_id));
15151515+ assert!(tree.get(&root_id).unwrap().children().contains(&node_1_id));
15161516+ assert!(
15171517+ tree.get(&node_1_id,)
15181518+ .unwrap()
15191519+ .children()
15201520+ .contains(&node_4_id,)
15211521+ );
15221522+ assert!(
15231523+ tree.get(&node_4_id,)
15241524+ .unwrap()
15251525+ .children()
15261526+ .contains(&node_5_id,)
15271527+ );
15281528+ assert!(
15291529+ tree.get(&node_5_id,)
15301530+ .unwrap()
15311531+ .children()
15321532+ .contains(&node_3_id,)
15331533+ );
15341534+ assert_eq!(tree.root_node_id(), Some(&node_2_id));
15351535+ }
15361536+15371537+ #[test]
15381538+ fn test_move_node_to_root() {
15391539+ use InsertBehavior::*;
15401540+15411541+ // test move with existing root
15421542+ {
15431543+ let mut tree = Tree::new();
15441544+ let root_id = tree.insert(Node::new(0), AsRoot).unwrap();
15451545+ let node_1_id = tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
15461546+ let node_2_id = tree.insert(Node::new(2), UnderNode(&node_1_id)).unwrap();
15471547+15481548+ tree.move_node_to_root(&node_2_id);
15491549+15501550+ assert_eq!(tree.root_node_id(), Some(&node_2_id));
15511551+ assert!(tree.get(&node_2_id).unwrap().children().contains(&root_id));
15521552+ assert!(
15531553+ !tree
15541554+ .get(&node_1_id,)
15551555+ .unwrap()
15561556+ .children()
15571557+ .contains(&node_2_id,)
15581558+ );
15591559+ }
15601560+15611561+ // Test move with existing root and with orphan.
15621562+ {
15631563+ let mut tree = Tree::new();
15641564+ let root_id = tree.insert(Node::new(0), AsRoot).unwrap();
15651565+ let node_1_id = tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
15661566+ let node_2_id = tree.insert(Node::new(2), UnderNode(&node_1_id)).unwrap();
15671567+15681568+ tree.remove_node_orphan_children(node_1_id);
15691569+ tree.move_node_to_root(&node_2_id);
15701570+15711571+ assert_eq!(tree.root_node_id(), Some(&node_2_id));
15721572+ assert!(tree.get(&node_2_id).unwrap().children().contains(&root_id));
15731573+ assert_eq!(tree.get(&root_id).unwrap().children().len(), 0);
15741574+ }
15751575+15761576+ // Test move without root and with orphan.
15771577+ {
15781578+ let mut tree = Tree::new();
15791579+ let root_id = tree.insert(Node::new(0), AsRoot).unwrap();
15801580+ let node_1_id = tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
15811581+ let node_2_id = tree.insert(Node::new(2), UnderNode(&node_1_id)).unwrap();
15821582+15831583+ tree.remove_node_orphan_children(root_id);
15841584+ tree.move_node_to_root(&node_1_id);
15851585+15861586+ assert_eq!(tree.root_node_id(), Some(&node_1_id));
15871587+ assert!(
15881588+ tree.get(&node_1_id,)
15891589+ .unwrap()
15901590+ .children()
15911591+ .contains(&node_2_id,)
15921592+ );
15931593+ assert_eq!(tree.get(&node_1_id).unwrap().children().len(), 1);
15941594+ }
15951595+ }
15961596+15971597+ #[test]
15981598+ fn test_find_subtree_root_below_upper_id() {
15991599+ use InsertBehavior::*;
16001600+16011601+ let mut tree = Tree::new();
16021602+16031603+ let root_id = tree.insert(Node::new(0), AsRoot).unwrap();
16041604+ let node_1_id = tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
16051605+ let node_2_id = tree.insert(Node::new(2), UnderNode(&node_1_id)).unwrap();
16061606+ let node_3_id = tree.insert(Node::new(3), UnderNode(&node_1_id)).unwrap();
16071607+ let node_4_id = tree.insert(Node::new(4), UnderNode(&node_2_id)).unwrap();
16081608+16091609+ let sub_root = tree.find_subtree_root_between_ids(&node_1_id, &root_id);
16101610+ assert_eq!(sub_root, Some(&node_1_id));
16111611+ let sub_root = tree.find_subtree_root_between_ids(&root_id, &node_1_id); //invert for None
16121612+ assert_eq!(sub_root, None);
16131613+16141614+ let sub_root = tree.find_subtree_root_between_ids(&node_2_id, &root_id);
16151615+ assert_eq!(sub_root, Some(&node_1_id));
16161616+ let sub_root = tree.find_subtree_root_between_ids(&root_id, &node_2_id); //invert for None
16171617+ assert_eq!(sub_root, None);
16181618+16191619+ let sub_root = tree.find_subtree_root_between_ids(&node_3_id, &node_1_id);
16201620+ assert_eq!(sub_root, Some(&node_3_id));
16211621+ let sub_root = tree.find_subtree_root_between_ids(&node_1_id, &node_3_id); //invert for None
16221622+ assert_eq!(sub_root, None);
16231623+16241624+ let sub_root = tree.find_subtree_root_between_ids(&node_4_id, &root_id);
16251625+ assert_eq!(sub_root, Some(&node_1_id));
16261626+ let sub_root = tree.find_subtree_root_between_ids(&root_id, &node_4_id); //invert for None
16271627+ assert_eq!(sub_root, None);
16281628+ }
16291629+16301630+ #[test]
16311631+ fn test_tree_height() {
16321632+ use InsertBehavior::*;
16331633+ use RemoveBehavior::*;
16341634+16351635+ // Empty tree.
16361636+ let mut tree = Tree::new();
16371637+ assert_eq!(0, tree.height());
16381638+16391639+ // The tree with single root node.
16401640+ let root_id = tree.insert(Node::new(1), AsRoot).unwrap();
16411641+ assert_eq!(1, tree.height());
16421642+16431643+ // Root node with single child.
16441644+ let child_1_id = tree.insert(Node::new(2), UnderNode(&root_id)).unwrap();
16451645+ assert_eq!(2, tree.height());
16461646+16471647+ // Root node with two children.
16481648+ let child_2_id = tree.insert(Node::new(3), UnderNode(&root_id)).unwrap();
16491649+ assert_eq!(2, tree.height());
16501650+16511651+ // Grandson.
16521652+ tree.insert(Node::new(4), UnderNode(&child_1_id)).unwrap();
16531653+ assert_eq!(3, tree.height());
16541654+16551655+ // Remove child_1 and grandchild.
16561656+ tree.remove_node(child_1_id, DropChildren).unwrap();
16571657+ assert_eq!(2, tree.height());
16581658+16591659+ // Remove child_2.
16601660+ tree.remove_node(child_2_id, LiftChildren).unwrap();
16611661+ assert_eq!(1, tree.height());
16621662+ }
16631663+16641664+ #[test]
16651665+ fn test_partial_eq() {
16661666+ use InsertBehavior::*;
16671667+16681668+ let mut tree = Tree::new();
16691669+ let root_id = tree.insert(Node::new(0), AsRoot).unwrap();
16701670+ let node_1_id = tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
16711671+ tree.insert(Node::new(2), UnderNode(&root_id)).unwrap();
16721672+ tree.insert(Node::new(3), UnderNode(&node_1_id)).unwrap();
16731673+16741674+ // Ensure PartialEq doesn't work when the number of used nodes are not equal.
16751675+ {
16761676+ let mut other = Tree::new();
16771677+ let root_id = other.insert(Node::new(0), AsRoot).unwrap();
16781678+ other.insert(Node::new(1), UnderNode(&root_id)).unwrap();
16791679+ other.insert(Node::new(2), UnderNode(&root_id)).unwrap();
16801680+ assert_ne!(tree, other);
16811681+ }
16821682+16831683+ // Ensure PartialEq doesn't work when the data is not equal.
16841684+ {
16851685+ let mut other = Tree::new();
16861686+ let root_id = other.insert(Node::new(0), AsRoot).unwrap();
16871687+ let id = other.insert(Node::new(1), UnderNode(&root_id)).unwrap();
16881688+ other.insert(Node::new(2), UnderNode(&root_id)).unwrap();
16891689+ other.insert(Node::new(4), UnderNode(&id)).unwrap();
16901690+ assert_ne!(tree, other);
16911691+ }
16921692+16931693+ // Ensure PartialEq doesn't work when the parents aren't equal.
16941694+ {
16951695+ let mut other = Tree::new();
16961696+ let root_id = other.insert(Node::new(0), AsRoot).unwrap();
16971697+ other.insert(Node::new(1), UnderNode(&root_id)).unwrap();
16981698+ let id = other.insert(Node::new(2), UnderNode(&root_id)).unwrap();
16991699+ other.insert(Node::new(3), UnderNode(&id)).unwrap();
17001700+ assert_ne!(tree, other);
17011701+ }
17021702+17031703+ // Ensure PartialEq works even if the number of free spots in Tree.
17041704+ // Node is different.
17051705+ {
17061706+ let mut other = Tree::new();
17071707+ let root_id = other.insert(Node::new(0), AsRoot).unwrap();
17081708+ let id = other.insert(Node::new(1), UnderNode(&root_id)).unwrap();
17091709+ other.insert(Node::new(2), UnderNode(&root_id)).unwrap();
17101710+ other.insert(Node::new(3), UnderNode(&id)).unwrap();
17111711+ let to_delete = other.insert(Node::new(42), UnderNode(&root_id)).unwrap();
17121712+ other.take_node(to_delete);
17131713+ assert_ne!(
17141714+ tree.nodes.iter().filter(|x| x.is_none()).count(),
17151715+ other.nodes.iter().filter(|x| x.is_none()).count()
17161716+ );
17171717+ assert_eq!(tree, other);
17181718+ }
17191719+17201720+ // Ensure PartialEq doesn't work when the Node's index are different.
17211721+ {
17221722+ let mut other = Tree::new();
17231723+ let root_id = other.insert(Node::new(0), AsRoot).unwrap();
17241724+ let to_delete = other.insert(Node::new(42), UnderNode(&root_id)).unwrap();
17251725+ let id = other.insert(Node::new(1), UnderNode(&root_id)).unwrap();
17261726+ other.insert(Node::new(2), UnderNode(&root_id)).unwrap();
17271727+ other.insert(Node::new(3), UnderNode(&id)).unwrap();
17281728+ other.take_node(to_delete);
17291729+ assert_ne!(tree, other);
17301730+ }
17311731+ }
17321732+}