indextree/
node.rs

1//! Node.
2
3#[cfg(not(feature = "std"))]
4use core::fmt;
5
6#[cfg(feature = "deser")]
7use serde::{Deserialize, Serialize};
8
9#[cfg(feature = "std")]
10use std::fmt;
11
12use crate::{id::NodeStamp, NodeId};
13
14#[derive(PartialEq, Eq, Clone, Debug)]
15#[cfg_attr(feature = "deser", derive(Deserialize, Serialize))]
16pub(crate) enum NodeData<T> {
17    /// The actual data store
18    Data(T),
19    /// The next free node position.
20    NextFree(Option<usize>),
21}
22
23#[derive(PartialEq, Eq, Clone, Debug)]
24#[cfg_attr(feature = "deser", derive(Deserialize, Serialize))]
25/// A node within a particular `Arena`.
26pub struct Node<T> {
27    // Keep these private (with read-only accessors) so that we can keep them
28    // consistent. E.g. the parent of a node’s child is that node.
29    pub(crate) parent: Option<NodeId>,
30    pub(crate) previous_sibling: Option<NodeId>,
31    pub(crate) next_sibling: Option<NodeId>,
32    pub(crate) first_child: Option<NodeId>,
33    pub(crate) last_child: Option<NodeId>,
34    pub(crate) stamp: NodeStamp,
35    /// The actual data which will be stored within the tree.
36    pub(crate) data: NodeData<T>,
37}
38
39impl<T> Node<T> {
40    /// Returns a reference to the node data.
41    pub fn get(&self) -> &T {
42        if let NodeData::Data(ref data) = self.data {
43            data
44        } else {
45            unreachable!("Try to access a freed node")
46        }
47    }
48
49    /// Returns a mutable reference to the node data.
50    pub fn get_mut(&mut self) -> &mut T {
51        if let NodeData::Data(ref mut data) = self.data {
52            data
53        } else {
54            unreachable!("Try to access a freed node")
55        }
56    }
57
58    /// Creates a new `Node` with the default state and the given data.
59    pub(crate) fn new(data: T) -> Self {
60        Self {
61            parent: None,
62            previous_sibling: None,
63            next_sibling: None,
64            first_child: None,
65            last_child: None,
66            stamp: NodeStamp::default(),
67            data: NodeData::Data(data),
68        }
69    }
70
71    /// Convert a removed `Node` to normal with default state and given data.
72    pub(crate) fn reuse(&mut self, data: T) {
73        debug_assert!(matches!(self.data, NodeData::NextFree(_)));
74        debug_assert!(self.stamp.is_removed());
75        self.stamp.reuse();
76        self.parent = None;
77        self.previous_sibling = None;
78        self.next_sibling = None;
79        self.first_child = None;
80        self.last_child = None;
81        self.data = NodeData::Data(data);
82    }
83
84    /// Returns the ID of the parent node, unless this node is the root of the
85    /// tree.
86    ///
87    /// # Examples
88    ///
89    /// ```
90    /// # use indextree::Arena;
91    /// # let mut arena = Arena::new();
92    /// # let n1 = arena.new_node("1");
93    /// # let n1_1 = arena.new_node("1_1");
94    /// # let n1_2 = arena.new_node("1_2");
95    /// # n1.append(n1_2, &mut arena);
96    /// # let n1_3 = arena.new_node("1_3");
97    /// # n1.append(n1_3, &mut arena);
98    /// # n1.append(n1_1, &mut arena);
99    /// // arena
100    /// // `-- 1
101    /// //     |-- 1_1
102    /// //     |-- 1_2
103    /// //     `-- 1_3
104    /// assert_eq!(arena[n1].parent(), None);
105    /// assert_eq!(arena[n1_1].parent(), Some(n1));
106    /// assert_eq!(arena[n1_2].parent(), Some(n1));
107    /// assert_eq!(arena[n1_3].parent(), Some(n1));
108    /// ```
109    pub fn parent(&self) -> Option<NodeId> {
110        self.parent
111    }
112
113    /// Returns the ID of the first child of this node, unless it has no child.
114    ///
115    /// # Examples
116    ///
117    /// ```
118    /// # use indextree::Arena;
119    /// # let mut arena = Arena::new();
120    /// # let n1 = arena.new_node("1");
121    /// # let n1_1 = arena.new_node("1_1");
122    /// # n1.append(n1_1, &mut arena);
123    /// # let n1_2 = arena.new_node("1_2");
124    /// # n1.append(n1_2, &mut arena);
125    /// # let n1_3 = arena.new_node("1_3");
126    /// # n1.append(n1_3, &mut arena);
127    /// // arena
128    /// // `-- 1
129    /// //     |-- 1_1
130    /// //     |-- 1_2
131    /// //     `-- 1_3
132    /// assert_eq!(arena[n1].first_child(), Some(n1_1));
133    /// assert_eq!(arena[n1_1].first_child(), None);
134    /// assert_eq!(arena[n1_2].first_child(), None);
135    /// assert_eq!(arena[n1_3].first_child(), None);
136    /// ```
137    pub fn first_child(&self) -> Option<NodeId> {
138        self.first_child
139    }
140
141    /// Returns the ID of the last child of this node, unless it has no child.
142    ///
143    /// # Examples
144    ///
145    /// ```
146    /// # use indextree::Arena;
147    /// # let mut arena = Arena::new();
148    /// # let n1 = arena.new_node("1");
149    /// # let n1_1 = arena.new_node("1_1");
150    /// # n1.append(n1_1, &mut arena);
151    /// # let n1_2 = arena.new_node("1_2");
152    /// # n1.append(n1_2, &mut arena);
153    /// # let n1_3 = arena.new_node("1_3");
154    /// # n1.append(n1_3, &mut arena);
155    /// // arena
156    /// // `-- 1
157    /// //     |-- 1_1
158    /// //     |-- 1_2
159    /// //     `-- 1_3
160    /// assert_eq!(arena[n1].last_child(), Some(n1_3));
161    /// assert_eq!(arena[n1_1].last_child(), None);
162    /// assert_eq!(arena[n1_2].last_child(), None);
163    /// assert_eq!(arena[n1_3].last_child(), None);
164    /// ```
165    pub fn last_child(&self) -> Option<NodeId> {
166        self.last_child
167    }
168
169    /// Returns the ID of the previous sibling of this node, unless it is a
170    /// first child.
171    ///
172    /// # Examples
173    ///
174    /// ```
175    /// # use indextree::Arena;
176    /// # let mut arena = Arena::new();
177    /// # let n1 = arena.new_node("1");
178    /// # let n1_1 = arena.new_node("1_1");
179    /// # n1.append(n1_1, &mut arena);
180    /// # let n1_2 = arena.new_node("1_2");
181    /// # n1.append(n1_2, &mut arena);
182    /// # let n1_3 = arena.new_node("1_3");
183    /// # n1.append(n1_3, &mut arena);
184    /// // arena
185    /// // `-- 1
186    /// //     |-- 1_1
187    /// //     |-- 1_2
188    /// //     `-- 1_3
189    /// assert_eq!(arena[n1].previous_sibling(), None);
190    /// assert_eq!(arena[n1_1].previous_sibling(), None);
191    /// assert_eq!(arena[n1_2].previous_sibling(), Some(n1_1));
192    /// assert_eq!(arena[n1_3].previous_sibling(), Some(n1_2));
193    /// ```
194    ///
195    /// Note that newly created nodes are independent toplevel nodes, and they
196    /// are not siblings by default.
197    ///
198    /// ```
199    /// # use indextree::Arena;
200    /// let mut arena = Arena::new();
201    /// let n1 = arena.new_node("1");
202    /// let n2 = arena.new_node("2");
203    /// // arena
204    /// // |-- (implicit)
205    /// // |   `-- 1
206    /// // `-- (implicit)
207    /// //     `-- 2
208    /// assert_eq!(arena[n1].previous_sibling(), None);
209    /// assert_eq!(arena[n2].previous_sibling(), None);
210    ///
211    /// n1.insert_after(n2, &mut arena);
212    /// // arena
213    /// // `-- (implicit)
214    /// //     |-- 1
215    /// //     `-- 2
216    /// assert_eq!(arena[n1].previous_sibling(), None);
217    /// assert_eq!(arena[n2].previous_sibling(), Some(n1));
218    /// ```
219    pub fn previous_sibling(&self) -> Option<NodeId> {
220        self.previous_sibling
221    }
222
223    /// Returns the ID of the next sibling of this node, unless it is a
224    /// last child.
225    ///
226    /// # Examples
227    ///
228    /// ```
229    /// # use indextree::Arena;
230    /// # let mut arena = Arena::new();
231    /// # let n1 = arena.new_node("1");
232    /// # let n1_1 = arena.new_node("1_1");
233    /// # n1.append(n1_1, &mut arena);
234    /// # let n1_2 = arena.new_node("1_2");
235    /// # n1.append(n1_2, &mut arena);
236    /// # let n1_3 = arena.new_node("1_3");
237    /// # n1.append(n1_3, &mut arena);
238    /// // arena
239    /// // `-- 1
240    /// //     |-- 1_1
241    /// //     |-- 1_2
242    /// //     `-- 1_3
243    /// assert_eq!(arena[n1].next_sibling(), None);
244    /// assert_eq!(arena[n1_1].next_sibling(), Some(n1_2));
245    /// assert_eq!(arena[n1_2].next_sibling(), Some(n1_3));
246    /// assert_eq!(arena[n1_3].next_sibling(), None);
247    /// ```
248    ///
249    /// Note that newly created nodes are independent toplevel nodes, and they
250    /// are not siblings by default.
251    ///
252    /// ```
253    /// # use indextree::Arena;
254    /// let mut arena = Arena::new();
255    /// let n1 = arena.new_node("1");
256    /// let n2 = arena.new_node("2");
257    /// // arena
258    /// // |-- (implicit)
259    /// // |   `-- 1
260    /// // `-- (implicit)
261    /// //     `-- 2
262    /// assert_eq!(arena[n1].next_sibling(), None);
263    /// assert_eq!(arena[n2].next_sibling(), None);
264    ///
265    /// n1.insert_after(n2, &mut arena);
266    /// // arena
267    /// // `-- (implicit)
268    /// //     |-- 1
269    /// //     `-- 2
270    /// assert_eq!(arena[n1].next_sibling(), Some(n2));
271    /// assert_eq!(arena[n2].next_sibling(), None);
272    /// ```
273    pub fn next_sibling(&self) -> Option<NodeId> {
274        self.next_sibling
275    }
276
277    /// Checks if the node is marked as removed.
278    ///
279    /// # Examples
280    ///
281    /// ```
282    /// # use indextree::Arena;
283    /// # let mut arena = Arena::new();
284    /// # let n1 = arena.new_node("1");
285    /// # let n1_1 = arena.new_node("1_1");
286    /// # n1.append(n1_1, &mut arena);
287    /// # let n1_2 = arena.new_node("1_2");
288    /// # n1.append(n1_2, &mut arena);
289    /// # let n1_3 = arena.new_node("1_3");
290    /// # n1.append(n1_3, &mut arena);
291    /// // arena
292    /// // `-- 1
293    /// //     |-- 1_1
294    /// //     |-- 1_2 *
295    /// //     `-- 1_3
296    /// assert_eq!(arena[n1_1].next_sibling(), Some(n1_2));
297    /// assert_eq!(arena[n1_2].parent(), Some(n1));
298    /// assert!(!arena[n1_2].is_removed());
299    /// assert_eq!(arena[n1_3].previous_sibling(), Some(n1_2));
300    ///
301    /// n1_2.remove(&mut arena);
302    /// // arena
303    /// // `-- 1
304    /// //     |-- 1_1
305    /// //     `-- 1_3
306    /// assert_eq!(arena[n1_1].next_sibling(), Some(n1_3));
307    /// assert_eq!(arena[n1_2].parent(), None);
308    /// assert!(arena[n1_2].is_removed());
309    /// assert_eq!(arena[n1_3].previous_sibling(), Some(n1_1));
310    /// ```
311    pub fn is_removed(&self) -> bool {
312        self.stamp.is_removed()
313    }
314
315    /// Checks if the node is detached.
316    pub(crate) fn is_detached(&self) -> bool {
317        self.parent.is_none() && self.previous_sibling.is_none() && self.next_sibling.is_none()
318    }
319}
320
321impl<T> fmt::Display for Node<T> {
322    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
323        if let Some(parent) = self.parent {
324            write!(f, "parent: {}; ", parent)?;
325        } else {
326            write!(f, "no parent; ")?;
327        }
328        if let Some(previous_sibling) = self.previous_sibling {
329            write!(f, "previous sibling: {}; ", previous_sibling)?;
330        } else {
331            write!(f, "no previous sibling; ")?;
332        }
333        if let Some(next_sibling) = self.next_sibling {
334            write!(f, "next sibling: {}; ", next_sibling)?;
335        } else {
336            write!(f, "no next sibling; ")?;
337        }
338        if let Some(first_child) = self.first_child {
339            write!(f, "first child: {}; ", first_child)?;
340        } else {
341            write!(f, "no first child; ")?;
342        }
343        if let Some(last_child) = self.last_child {
344            write!(f, "last child: {}; ", last_child)?;
345        } else {
346            write!(f, "no last child; ")?;
347        }
348        Ok(())
349    }
350}