patricia_tree/
node.rs

1//! A node which represents a subtree of a patricia tree.
2use crate::{BorrowedBytes, Bytes};
3use alloc::alloc::{Layout, alloc, dealloc, handle_alloc_error};
4use alloc::vec::Vec;
5use core::marker::PhantomData;
6use core::{mem, ptr, slice};
7
8macro_rules! assert_some {
9    ($expr:expr) => {
10        if let Some(value) = $expr {
11            value
12        } else {
13            panic!("`{}` must be `Some(..)`", stringify!($expr));
14        }
15    };
16}
17
18#[derive(Debug, Clone, Copy)]
19pub(crate) struct Flags(u8);
20
21impl Flags {
22    pub(crate) const VALUE_ALLOCATED: Flags = Flags(0b0000_0001);
23    pub(crate) const VALUE_INITIALIZED: Flags = Flags(0b0000_0010);
24    pub(crate) const CHILD_ALLOCATED: Flags = Flags(0b0000_0100);
25    pub(crate) const CHILD_INITIALIZED: Flags = Flags(0b0000_1000);
26    pub(crate) const SIBLING_ALLOCATED: Flags = Flags(0b0001_0000);
27    pub(crate) const SIBLING_INITIALIZED: Flags = Flags(0b0010_0000);
28
29    const VALID_BITS_MASK: u8 = 0b0011_1111; // Mask of all valid flag bits.
30
31    const fn empty() -> Self {
32        Flags(0)
33    }
34
35    pub(crate) const fn from_bits_truncate(bits: u8) -> Self {
36        Flags(bits & Self::VALID_BITS_MASK)
37    }
38
39    pub(crate) const fn bits(self) -> u8 {
40        self.0
41    }
42
43    pub(crate) const fn contains(self, other: Flags) -> bool {
44        (self.0 & other.0) == other.0
45    }
46
47    const fn intersects(self, other: Flags) -> bool {
48        (self.0 & other.0) != 0
49    }
50
51    fn insert(&mut self, other: Flags) {
52        self.0 |= other.0;
53    }
54
55    fn set(&mut self, other: Flags, value: bool) {
56        if value {
57            self.0 |= other.0;
58        } else {
59            self.0 &= !other.0;
60        }
61    }
62}
63
64impl core::ops::BitOr for Flags {
65    type Output = Self;
66
67    fn bitor(self, other: Self) -> Self {
68        Flags(self.0 | other.0)
69    }
70}
71
72const FLAGS_OFFSET: isize = 0;
73const LABEL_LEN_OFFSET: isize = 1;
74const LABEL_OFFSET: isize = 2;
75
76const MAX_LABEL_LEN: usize = 255;
77
78/// A node which represents a subtree of a patricia tree.
79///
80/// Note that this is a low level building block.
81/// Usually it is recommended to use more high level data structures (e.g., `PatriciaTree`).
82#[derive(Debug)]
83pub struct Node<V> {
84    // layout:
85    //   - flags: u8
86    //   - label_len: u8
87    //   - label: [u8; label_len]
88    //   - value: Option<V>
89    //   - child: Option<Node<V>>
90    //   - sibling: Option<Node<V>>
91    ptr: *mut u8,
92
93    _value: PhantomData<V>,
94}
95unsafe impl<V: Send> Send for Node<V> {}
96unsafe impl<V: Sync> Sync for Node<V> {}
97impl<V> Node<V> {
98    /// Makes a new node which represents an empty tree.
99    pub fn root() -> Self {
100        Node::new(b"", None, None, None)
101    }
102
103    /// Makes a new node.
104    pub fn new(
105        mut label: &[u8],
106        mut value: Option<V>,
107        mut child: Option<Self>,
108        sibling: Option<Self>,
109    ) -> Self {
110        if label.len() > MAX_LABEL_LEN {
111            child = Some(Node::new(&label[MAX_LABEL_LEN..], value, child, None));
112            label = &label[..MAX_LABEL_LEN];
113            value = None;
114        }
115
116        let mut flags = Flags::empty();
117        let mut layout = Self::initial_layout(label.len());
118        let value = value.map(|value| {
119            flags.insert(Flags::VALUE_ALLOCATED | Flags::VALUE_INITIALIZED);
120            let (new_layout, offset) = layout.extend(Layout::new::<V>()).expect("unreachable");
121            layout = new_layout;
122            (value, offset)
123        });
124        let child = child.map(|child| {
125            flags.insert(Flags::CHILD_ALLOCATED | Flags::CHILD_INITIALIZED);
126            let (new_layout, offset) = layout.extend(Layout::new::<Self>()).expect("unreachable");
127            layout = new_layout;
128            (child, offset)
129        });
130        let sibling = sibling.map(|sibling| {
131            flags.insert(Flags::SIBLING_ALLOCATED | Flags::SIBLING_INITIALIZED);
132            let (new_layout, offset) = layout.extend(Layout::new::<Self>()).expect("unreachable");
133            layout = new_layout;
134            (sibling, offset)
135        });
136
137        unsafe {
138            let ptr = alloc(layout.pad_to_align());
139            if ptr.is_null() {
140                handle_alloc_error(layout)
141            }
142
143            ptr::write(ptr.offset(FLAGS_OFFSET), flags.bits());
144            ptr::write(ptr.offset(LABEL_LEN_OFFSET), label.len() as u8);
145            ptr::copy_nonoverlapping(label.as_ptr(), ptr.offset(LABEL_OFFSET), label.len());
146
147            if let Some((value, offset)) = value {
148                ptr::write(ptr.add(offset) as _, value);
149            }
150            if let Some((child, offset)) = child {
151                ptr::write(ptr.add(offset) as _, child);
152            }
153            if let Some((sibling, offset)) = sibling {
154                ptr::write(ptr.add(offset) as _, sibling);
155            }
156            Node {
157                ptr,
158                _value: PhantomData,
159            }
160        }
161    }
162
163    #[cfg(feature = "serde")]
164    pub(crate) fn new_for_decoding(flags: Flags, label_len: u8) -> Self {
165        let mut init_flags = Flags::empty();
166        let mut layout = Self::initial_layout(label_len as usize);
167        if flags.contains(Flags::VALUE_INITIALIZED) {
168            init_flags.insert(Flags::VALUE_ALLOCATED);
169            layout = layout.extend(Layout::new::<V>()).expect("unreachable").0;
170        }
171        if flags.contains(Flags::CHILD_INITIALIZED) {
172            init_flags.insert(Flags::CHILD_ALLOCATED);
173            layout = layout.extend(Layout::new::<Self>()).expect("unreachable").0;
174        }
175        if flags.contains(Flags::SIBLING_INITIALIZED) {
176            init_flags.insert(Flags::SIBLING_ALLOCATED);
177            layout = layout.extend(Layout::new::<Self>()).expect("unreachable").0;
178        }
179
180        let ptr = unsafe { alloc(layout.pad_to_align()) };
181        assert_ne!(ptr, ptr::null_mut());
182
183        unsafe {
184            ptr::write(ptr.offset(FLAGS_OFFSET), init_flags.bits());
185            ptr::write(ptr.offset(LABEL_LEN_OFFSET), label_len);
186        }
187        Node {
188            ptr,
189            _value: PhantomData,
190        }
191    }
192
193    /// Returns the label of this node.
194    pub fn label(&self) -> &[u8] {
195        unsafe {
196            let label_len = *self.ptr.offset(LABEL_LEN_OFFSET) as usize;
197            slice::from_raw_parts(self.ptr.offset(LABEL_OFFSET), label_len)
198        }
199    }
200
201    #[cfg(feature = "serde")]
202    pub(crate) fn label_mut(&mut self) -> &mut [u8] {
203        unsafe {
204            let label_len = *self.ptr.offset(LABEL_LEN_OFFSET) as usize;
205            slice::from_raw_parts_mut(self.ptr.offset(LABEL_OFFSET), label_len)
206        }
207    }
208
209    /// Returns the reference to the value of this node.
210    pub fn value(&self) -> Option<&V> {
211        if let Some(offset) = self.value_offset() {
212            if self.flags().contains(Flags::VALUE_INITIALIZED) {
213                unsafe {
214                    let value = self.ptr.offset(offset) as *const V;
215                    return Some(&*value);
216                }
217            }
218        }
219        None
220    }
221
222    /// Returns the mutable reference to the value of this node.
223    pub fn value_mut(&mut self) -> Option<&mut V> {
224        if let Some(offset) = self.value_offset() {
225            if self.flags().contains(Flags::VALUE_INITIALIZED) {
226                unsafe {
227                    let value = self.ptr.offset(offset) as *mut V;
228                    return Some(&mut *value);
229                }
230            }
231        }
232        None
233    }
234
235    /// Returns the reference to the child of this node.
236    pub fn child(&self) -> Option<&Self> {
237        if let Some(offset) = self.child_offset() {
238            if self.flags().contains(Flags::CHILD_INITIALIZED) {
239                unsafe {
240                    let child = self.ptr.offset(offset) as *const Self;
241                    return Some(&*child);
242                }
243            }
244        }
245        None
246    }
247
248    /// Returns the mutable reference to the child of this node.
249    pub fn child_mut(&mut self) -> Option<&mut Self> {
250        if let Some(offset) = self.child_offset() {
251            if self.flags().contains(Flags::CHILD_INITIALIZED) {
252                unsafe {
253                    let child = self.ptr.offset(offset) as *mut Self;
254                    return Some(&mut *child);
255                }
256            }
257        }
258        None
259    }
260
261    /// Returns the reference to the sibling of this node.
262    pub fn sibling(&self) -> Option<&Self> {
263        if let Some(offset) = self.sibling_offset() {
264            if self.flags().contains(Flags::SIBLING_INITIALIZED) {
265                unsafe {
266                    let sibling = self.ptr.offset(offset) as *const Self;
267                    return Some(&*sibling);
268                }
269            }
270        }
271        None
272    }
273
274    /// Returns the mutable reference to the sibling of this node.
275    pub fn sibling_mut(&mut self) -> Option<&mut Self> {
276        if let Some(offset) = self.sibling_offset() {
277            if self.flags().contains(Flags::SIBLING_INITIALIZED) {
278                unsafe {
279                    let sibling = self.ptr.offset(offset) as *mut Self;
280                    return Some(&mut *sibling);
281                }
282            }
283        }
284        None
285    }
286
287    /// Returns mutable references to the node itself with its sibling and child
288    pub fn as_mut(&mut self) -> NodeMut<'_, V> {
289        let mut sibling_result = None;
290        let mut child_result = None;
291        let mut value_result = None;
292
293        if let Some(offset) = self.child_offset() {
294            if self.flags().contains(Flags::CHILD_INITIALIZED) {
295                unsafe {
296                    let child = self.ptr.offset(offset) as *mut Self;
297                    child_result.replace(&mut *child);
298                }
299            }
300        }
301
302        if let Some(offset) = self.sibling_offset() {
303            if self.flags().contains(Flags::SIBLING_INITIALIZED) {
304                unsafe {
305                    let sibling = self.ptr.offset(offset) as *mut Self;
306                    sibling_result.replace(&mut *sibling);
307                }
308            }
309        }
310
311        if let Some(offset) = self.value_offset() {
312            if self.flags().contains(Flags::VALUE_INITIALIZED) {
313                unsafe {
314                    let value = self.ptr.offset(offset) as *mut V;
315                    value_result.replace(&mut *value);
316                }
317            }
318        }
319
320        NodeMut {
321            label: self.label(),
322            sibling: sibling_result,
323            child: child_result,
324            value: value_result,
325        }
326    }
327
328    /// Takes the value out of this node.
329    pub fn take_value(&mut self) -> Option<V> {
330        if let Some(offset) = self.value_offset() {
331            if self.flags().contains(Flags::VALUE_INITIALIZED) {
332                self.set_flags(Flags::VALUE_INITIALIZED, false);
333                unsafe {
334                    let value = self.ptr.offset(offset) as *const V;
335                    return Some(ptr::read(value));
336                }
337            }
338        }
339        None
340    }
341
342    /// Takes the child out of this node.
343    pub fn take_child(&mut self) -> Option<Self> {
344        if let Some(offset) = self.child_offset() {
345            if self.flags().contains(Flags::CHILD_INITIALIZED) {
346                self.set_flags(Flags::CHILD_INITIALIZED, false);
347                unsafe {
348                    let child = self.ptr.offset(offset) as *mut Self;
349                    return Some(ptr::read(child));
350                }
351            }
352        }
353        None
354    }
355
356    /// Takes the sibling out of this node.
357    pub fn take_sibling(&mut self) -> Option<Self> {
358        if let Some(offset) = self.sibling_offset() {
359            if self.flags().contains(Flags::SIBLING_INITIALIZED) {
360                self.set_flags(Flags::SIBLING_INITIALIZED, false);
361                unsafe {
362                    let sibling = self.ptr.offset(offset) as *mut Self;
363                    return Some(ptr::read(sibling));
364                }
365            }
366        }
367        None
368    }
369
370    /// Sets the value of this node.
371    pub fn set_value(&mut self, value: V) {
372        self.take_value();
373        if let Some(offset) = self.value_offset() {
374            self.set_flags(Flags::VALUE_INITIALIZED, true);
375            unsafe { ptr::write(self.ptr.offset(offset) as _, value) };
376        } else {
377            let child = self.take_child();
378            let sibling = self.take_sibling();
379            let node = Node::new(self.label(), Some(value), child, sibling);
380            *self = node;
381        }
382    }
383
384    /// Sets the child of this node.
385    pub fn set_child(&mut self, child: Self) {
386        self.take_child();
387        if let Some(offset) = self.child_offset() {
388            self.set_flags(Flags::CHILD_INITIALIZED, true);
389            unsafe { ptr::write(self.ptr.offset(offset) as _, child) };
390        } else {
391            let value = self.take_value();
392            let sibling = self.take_sibling();
393            let node = Node::new(self.label(), value, Some(child), sibling);
394            *self = node;
395        }
396    }
397
398    /// Sets the sibling of this node.
399    pub fn set_sibling(&mut self, sibling: Self) {
400        self.take_sibling();
401        if let Some(offset) = self.sibling_offset() {
402            self.set_flags(Flags::SIBLING_INITIALIZED, true);
403            unsafe { ptr::write(self.ptr.offset(offset) as _, sibling) };
404        } else {
405            let value = self.take_value();
406            let child = self.take_child();
407            let node = Node::new(self.label(), value, child, Some(sibling));
408            *self = node;
409        }
410    }
411
412    /// Gets an iterator which traverses the nodes in this tree, in depth first order.
413    pub fn iter(&self) -> Iter<'_, V> {
414        Iter {
415            stack: vec![(0, self)],
416        }
417    }
418
419    /// Gets a mutable iterator which traverses the nodes in this tree, in depth first order.
420    pub fn iter_mut(&mut self) -> IterMut<'_, V> {
421        IterMut {
422            stack: vec![(0, self)],
423        }
424    }
425
426    pub(crate) fn iter_descendant(&self) -> Iter<'_, V> {
427        Iter {
428            stack: vec![(0, self)],
429        }
430    }
431
432    pub(crate) fn iter_descendant_mut(&mut self) -> IterMut<'_, V> {
433        IterMut {
434            stack: vec![(0, self)],
435        }
436    }
437
438    pub(crate) fn common_prefixes<'a, 'b, K>(
439        &'a self,
440        key: &'b K,
441    ) -> CommonPrefixesIter<'a, 'b, K, V>
442    where
443        K: ?Sized + BorrowedBytes,
444    {
445        CommonPrefixesIter {
446            key,
447            stack: vec![(0, self)],
448        }
449    }
450
451    pub(crate) fn common_prefixes_owned<'a, K: Bytes>(
452        &'a self,
453        key: K,
454    ) -> CommonPrefixesIterOwned<'a, K, V> {
455        CommonPrefixesIterOwned {
456            key,
457            stack: vec![(0, self)],
458        }
459    }
460
461    pub(crate) fn get<K: ?Sized + BorrowedBytes>(&self, key: &K) -> Option<&V> {
462        let (next, common_prefix_len) = key.strip_common_prefix_and_len(self.label());
463        if common_prefix_len == self.label().len() {
464            if next.is_empty() {
465                self.value()
466            } else {
467                self.child().and_then(|child| child.get(next))
468            }
469        } else if common_prefix_len == 0 && key.cmp_first_item(self.label()).is_ge() {
470            self.sibling().and_then(|sibling| sibling.get(next))
471        } else {
472            None
473        }
474    }
475
476    pub(crate) fn get_mut<K: ?Sized + BorrowedBytes>(&mut self, key: &K) -> Option<&mut V> {
477        let (next, common_prefix_len) = key.strip_common_prefix_and_len(self.label());
478        if common_prefix_len == self.label().len() {
479            if next.is_empty() {
480                self.value_mut()
481            } else {
482                self.child_mut().and_then(|child| child.get_mut(next))
483            }
484        } else if common_prefix_len == 0 && key.cmp_first_item(self.label()).is_ge() {
485            self.sibling_mut().and_then(|sibling| sibling.get_mut(next))
486        } else {
487            None
488        }
489    }
490    pub(crate) fn longest_common_prefix_len<K: ?Sized + BorrowedBytes>(
491        &self,
492        key: &K,
493        offset: usize,
494    ) -> usize {
495        let (next, common_prefix_len) = key.strip_common_prefix_and_len(self.label());
496        let next_offset = offset + common_prefix_len;
497        if common_prefix_len == self.label().len() {
498            if next.is_empty() {
499                next_offset
500            } else {
501                self.child()
502                    .map(|child| child.longest_common_prefix_len(next, next_offset))
503                    .unwrap_or(next_offset)
504            }
505        } else if common_prefix_len == 0 && key.cmp_first_item(self.label()).is_ge() {
506            self.sibling()
507                .map(|sibling| sibling.longest_common_prefix_len(next, offset))
508                .unwrap_or(next_offset)
509        } else {
510            next_offset
511        }
512    }
513    pub(crate) fn get_longest_common_prefix<K: ?Sized + BorrowedBytes>(
514        &self,
515        key: &K,
516        offset: usize,
517    ) -> Option<(usize, &V)> {
518        let (next, common_prefix_len) = key.strip_common_prefix_and_len(self.label());
519        if common_prefix_len == self.label().len() {
520            let offset = offset + common_prefix_len;
521            if next.is_empty() {
522                self.value().map(|v| (offset, v))
523            } else {
524                self.child()
525                    .and_then(|child| child.get_longest_common_prefix(next, offset))
526                    .or_else(|| self.value().map(|v| (offset, v)))
527            }
528        } else if common_prefix_len == 0 && key.cmp_first_item(self.label()).is_ge() {
529            self.sibling()
530                .and_then(|sibling| sibling.get_longest_common_prefix(next, offset))
531        } else {
532            None
533        }
534    }
535    pub(crate) fn get_longest_common_prefix_mut<K: ?Sized + BorrowedBytes>(
536        &mut self,
537        key: &K,
538        offset: usize,
539    ) -> Option<(usize, &mut V)> {
540        let (next, common_prefix_len) = key.strip_common_prefix_and_len(self.label());
541        if common_prefix_len == self.label().len() {
542            let offset = offset + common_prefix_len;
543            if next.is_empty() {
544                self.value_mut().map(|v| (offset, v))
545            } else {
546                let this = self.as_mut();
547                this.child
548                    .and_then(|child| child.get_longest_common_prefix_mut(next, offset))
549                    .or_else(|| this.value.map(|v| (offset, v)))
550            }
551        } else if common_prefix_len == 0 && key.cmp_first_item(self.label()).is_ge() {
552            self.sibling_mut()
553                .and_then(|sibling| sibling.get_longest_common_prefix_mut(next, offset))
554        } else {
555            None
556        }
557    }
558
559    pub(crate) fn get_prefix_node<K: ?Sized + BorrowedBytes>(
560        &self,
561        key: &K,
562    ) -> Option<(usize, &Self)> {
563        let (next, common_prefix_len) = key.strip_common_prefix_and_len(self.label());
564        if next.is_empty() {
565            Some((common_prefix_len, self))
566        } else if common_prefix_len == self.label().len() {
567            self.child().and_then(|child| child.get_prefix_node(next))
568        } else if common_prefix_len == 0 && key.cmp_first_item(self.label()).is_ge() {
569            self.sibling()
570                .and_then(|sibling| sibling.get_prefix_node(next))
571        } else {
572            None
573        }
574    }
575
576    pub(crate) fn get_prefix_node_mut<K: ?Sized + BorrowedBytes>(
577        &mut self,
578        key: &K,
579    ) -> Option<(usize, &mut Self)> {
580        let (next, common_prefix_len) = key.strip_common_prefix_and_len(self.label());
581        if next.is_empty() {
582            Some((common_prefix_len, self))
583        } else if common_prefix_len == self.label().len() {
584            self.child_mut()
585                .and_then(|child| child.get_prefix_node_mut(next))
586        } else if common_prefix_len == 0 && key.cmp_first_item(self.label()).is_ge() {
587            self.sibling_mut()
588                .and_then(|sibling| sibling.get_prefix_node_mut(next))
589        } else {
590            None
591        }
592    }
593
594    pub(crate) fn split_by_prefix<K: ?Sized + BorrowedBytes>(
595        &mut self,
596        prefix: &K,
597        level: usize,
598    ) -> Option<Self> {
599        let (next, common_prefix_len) = prefix.strip_common_prefix_and_len(self.label());
600        if common_prefix_len == prefix.as_bytes().len() {
601            let value = self.take_value();
602            let child = self.take_child();
603            let node = Node::new(&self.label()[common_prefix_len..], value, child, None);
604            if let Some(sibling) = self.take_sibling() {
605                *self = sibling;
606            }
607            Some(node)
608        } else if common_prefix_len == self.label().len() {
609            self.child_mut()
610                .and_then(|child| child.split_by_prefix(next, level + 1))
611                .inspect(|_old| {
612                    self.try_reclaim_child();
613                    self.try_merge_with_child(level);
614                })
615        } else if common_prefix_len == 0 && prefix.cmp_first_item(self.label()).is_ge() {
616            self.sibling_mut()
617                .and_then(|sibling| sibling.split_by_prefix(next, level))
618                .inspect(|_old| {
619                    self.try_reclaim_sibling();
620                })
621        } else {
622            None
623        }
624    }
625    pub(crate) fn remove<K: ?Sized + BorrowedBytes>(&mut self, key: &K, level: usize) -> Option<V> {
626        let (next, common_prefix_len) = key.strip_common_prefix_and_len(self.label());
627        if common_prefix_len == self.label().len() {
628            if next.is_empty() {
629                self.take_value().inspect(|_old| {
630                    self.try_merge_with_child(level);
631                })
632            } else {
633                self.child_mut()
634                    .and_then(|child| child.remove(next, level + 1))
635                    .inspect(|_old| {
636                        self.try_reclaim_child();
637                        self.try_merge_with_child(level);
638                    })
639            }
640        } else if common_prefix_len == 0 && key.cmp_first_item(self.label()).is_ge() {
641            self.sibling_mut()
642                .and_then(|sibling| sibling.remove(next, level))
643                .inspect(|_old| {
644                    self.try_reclaim_sibling();
645                })
646        } else {
647            None
648        }
649    }
650    pub(crate) fn insert<K: ?Sized + BorrowedBytes>(&mut self, key: &K, value: V) -> Option<V> {
651        if key.cmp_first_item(self.label()).is_lt() {
652            let this = Node {
653                ptr: self.ptr,
654                _value: PhantomData,
655            };
656            let node = Node::new(key.as_bytes(), Some(value), None, Some(this));
657            self.ptr = node.ptr;
658            mem::forget(node);
659            return None;
660        }
661
662        let (next, common_prefix_len) = key.strip_common_prefix_and_len(self.label());
663        let is_label_matched = common_prefix_len == self.label().len();
664        if next.as_bytes().is_empty() {
665            if is_label_matched {
666                let old = self.take_value();
667                self.set_value(value);
668                old
669            } else {
670                self.split_at(common_prefix_len);
671                self.set_value(value);
672                None
673            }
674        } else if is_label_matched {
675            if let Some(child) = self.child_mut() {
676                return child.insert(next, value);
677            }
678            let child = Node::new(next.as_bytes(), Some(value), None, None);
679            self.set_child(child);
680            None
681        } else if common_prefix_len == 0 {
682            if let Some(sibling) = self.sibling_mut() {
683                return sibling.insert(next, value);
684            }
685            let sibling = Node::new(next.as_bytes(), Some(value), None, None);
686            self.set_sibling(sibling);
687            None
688        } else {
689            self.split_at(common_prefix_len);
690            assert_some!(self.child_mut()).insert(next, value);
691            None
692        }
693    }
694    pub(crate) fn flags(&self) -> Flags {
695        Flags::from_bits_truncate(unsafe { *self.ptr })
696    }
697    fn set_flags(&mut self, other: Flags, value: bool) {
698        let mut flags = self.flags();
699        flags.set(other, value);
700        unsafe { ptr::write(self.ptr, flags.bits()) };
701    }
702    fn label_len(&self) -> usize {
703        unsafe { *self.ptr.offset(LABEL_LEN_OFFSET) as usize }
704    }
705    fn value_offset(&self) -> Option<isize> {
706        let flags = self.flags();
707        if flags.contains(Flags::VALUE_ALLOCATED) {
708            let layout = Self::initial_layout(self.label_len());
709            let offset = layout.extend(Layout::new::<V>()).expect("unreachable").1;
710            Some(offset as isize)
711        } else {
712            None
713        }
714    }
715    fn child_offset(&self) -> Option<isize> {
716        let flags = self.flags();
717        if flags.contains(Flags::CHILD_ALLOCATED) {
718            let mut layout = Self::initial_layout(self.label_len());
719            if flags.contains(Flags::VALUE_ALLOCATED) {
720                layout = layout.extend(Layout::new::<V>()).expect("unreachable").0;
721            }
722            let offset = layout.extend(Layout::new::<Self>()).expect("unreachable").1;
723            Some(offset as isize)
724        } else {
725            None
726        }
727    }
728    fn sibling_offset(&self) -> Option<isize> {
729        let flags = self.flags();
730        if flags.contains(Flags::SIBLING_ALLOCATED) {
731            let mut layout = Self::initial_layout(self.label_len());
732            if flags.contains(Flags::VALUE_ALLOCATED) {
733                layout = layout.extend(Layout::new::<V>()).expect("unreachable").0;
734            }
735            if flags.contains(Flags::CHILD_ALLOCATED) {
736                layout = layout.extend(Layout::new::<Self>()).expect("unreachable").0;
737            }
738            let offset = layout.extend(Layout::new::<Self>()).expect("unreachable").1;
739            Some(offset as isize)
740        } else {
741            None
742        }
743    }
744    fn split_at(&mut self, position: usize) {
745        debug_assert!(position < self.label_len());
746        let value = self.take_value();
747        let child = self.take_child();
748        let sibling = self.take_sibling();
749
750        let child = Node::new(&self.label()[position..], value, child, None);
751        let parent = Node::new(&self.label()[..position], None, Some(child), sibling);
752        *self = parent;
753    }
754    fn try_reclaim_sibling(&mut self) {
755        let flags = assert_some!(self.sibling()).flags();
756        if flags.intersects(Flags::VALUE_INITIALIZED | Flags::CHILD_INITIALIZED) {
757            return;
758        }
759        if let Some(sibling) = self.take_sibling().and_then(|mut n| n.take_sibling()) {
760            self.set_sibling(sibling);
761        }
762    }
763    fn try_reclaim_child(&mut self) {
764        let flags = assert_some!(self.child()).flags();
765        if flags.intersects(Flags::VALUE_INITIALIZED | Flags::CHILD_INITIALIZED) {
766            return;
767        }
768        if let Some(child) = self.take_child().and_then(|mut n| n.take_sibling()) {
769            self.set_child(child);
770        }
771    }
772    pub(crate) fn try_merge_with_child(&mut self, level: usize) {
773        if level == 0 {
774            return;
775        }
776
777        if self.flags().contains(Flags::VALUE_INITIALIZED)
778            || !self.flags().contains(Flags::CHILD_INITIALIZED)
779        {
780            return;
781        }
782
783        let flags = assert_some!(self.child()).flags();
784        if !flags.contains(Flags::SIBLING_INITIALIZED)
785            && (self.label_len() + assert_some!(self.child()).label_len()) <= MAX_LABEL_LEN
786        {
787            let mut child = assert_some!(self.take_child());
788            let sibling = self.take_sibling();
789            let value = child.take_value();
790            let grandchild = child.take_child();
791
792            let mut label = Vec::with_capacity(self.label_len() + child.label_len());
793            label.extend(self.label());
794            label.extend(child.label());
795            let node = Self::new(&label, value, grandchild, sibling);
796            *self = node;
797        }
798    }
799
800    #[inline]
801    fn initial_layout(label_len: usize) -> Layout {
802        Layout::from_size_align(LABEL_OFFSET as usize + label_len, 1).expect("unreachable")
803    }
804}
805
806impl<V> Drop for Node<V> {
807    fn drop(&mut self) {
808        let _ = self.take_value();
809        let _ = self.take_child();
810        let _ = self.take_sibling();
811
812        let mut layout = Self::initial_layout(self.label_len());
813        if self.flags().contains(Flags::VALUE_ALLOCATED) {
814            layout = layout.extend(Layout::new::<V>()).expect("unreachable").0;
815        }
816        if self.flags().contains(Flags::CHILD_ALLOCATED) {
817            layout = layout.extend(Layout::new::<Self>()).expect("unreachable").0;
818        }
819        if self.flags().contains(Flags::SIBLING_ALLOCATED) {
820            layout = layout.extend(Layout::new::<Self>()).expect("unreachable").0;
821        }
822
823        unsafe { dealloc(self.ptr, layout.pad_to_align()) }
824    }
825}
826impl<V: Clone> Clone for Node<V> {
827    fn clone(&self) -> Self {
828        let label = self.label();
829        let value = self.value().cloned();
830        let child = self.child().cloned();
831        let sibling = self.sibling().cloned();
832        Node::new(label, value, child, sibling)
833    }
834}
835impl<V> IntoIterator for Node<V> {
836    type Item = (usize, Node<V>);
837    type IntoIter = IntoIter<V>;
838    fn into_iter(self) -> Self::IntoIter {
839        IntoIter {
840            stack: vec![(0, self)],
841        }
842    }
843}
844
845/// An iterator which traverses the nodes in a tree, in depth first order.
846///
847/// The first element of an item is the level of the traversing node.
848#[derive(Debug)]
849pub struct Iter<'a, V: 'a> {
850    stack: Vec<(usize, &'a Node<V>)>,
851}
852impl<'a, V: 'a> Iterator for Iter<'a, V> {
853    type Item = (usize, &'a Node<V>);
854    fn next(&mut self) -> Option<Self::Item> {
855        if let Some((level, node)) = self.stack.pop() {
856            if level != 0 {
857                if let Some(sibling) = node.sibling() {
858                    self.stack.push((level, sibling));
859                }
860            }
861            if let Some(child) = node.child() {
862                self.stack.push((level + 1, child));
863            }
864            Some((level, node))
865        } else {
866            None
867        }
868    }
869}
870
871/// A mutable iterator which traverses the nodes in a tree, in depth first order.
872///
873/// The first element of an item is the level of the traversing node.
874#[derive(Debug)]
875pub struct IterMut<'a, V: 'a> {
876    stack: Vec<(usize, &'a mut Node<V>)>,
877}
878
879/// A reference to an immediate node (without child or sibling) with its
880/// label and a mutable reference to its value, if present.
881pub struct NodeMut<'a, V: 'a> {
882    label: &'a [u8],
883    value: Option<&'a mut V>,
884    sibling: Option<&'a mut Node<V>>,
885    child: Option<&'a mut Node<V>>,
886}
887impl<'a, V: 'a> NodeMut<'a, V> {
888    /// Returns the label of the node.
889    pub fn label(&self) -> &'a [u8] {
890        self.label
891    }
892
893    /// Converts into a mutable reference to the value.
894    pub fn into_value_mut(self) -> Option<&'a mut V> {
895        self.value
896    }
897}
898
899impl<'a, V: 'a> Iterator for IterMut<'a, V> {
900    type Item = (usize, NodeMut<'a, V>);
901    fn next(&mut self) -> Option<Self::Item> {
902        if let Some((level, node)) = self.stack.pop() {
903            let mut node = node.as_mut();
904            if level != 0 {
905                if let Some(sibling) = node.sibling.take() {
906                    self.stack.push((level, sibling));
907                }
908            }
909            if let Some(child) = node.child.take() {
910                self.stack.push((level + 1, child));
911            }
912            Some((level, node))
913        } else {
914            None
915        }
916    }
917}
918
919/// An iterator over entries in that collects all values up to
920/// until the key stops matching.
921#[derive(Debug)]
922pub(crate) struct CommonPrefixesIter<'a, 'b, K: ?Sized, V> {
923    key: &'b K,
924    stack: Vec<(usize, &'a Node<V>)>,
925}
926
927impl<'a, K, V> Iterator for CommonPrefixesIter<'a, '_, K, V>
928where
929    K: ?Sized + BorrowedBytes,
930{
931    type Item = (usize, &'a Node<V>);
932    fn next(&mut self) -> Option<Self::Item> {
933        while let Some((offset, node)) = self.stack.pop() {
934            let key = self.key.strip_n_prefix(offset);
935            let (_next, common_prefix_len) = key.strip_common_prefix_and_len(node.label());
936            if common_prefix_len == 0 && key.cmp_first_item(node.label()).is_ge() {
937                if let Some(sibling) = node.sibling() {
938                    self.stack.push((offset, sibling));
939                }
940            }
941
942            if common_prefix_len == node.label().len() {
943                let prefix_len = offset + common_prefix_len;
944                if let Some(child) = node.child() {
945                    self.stack.push((prefix_len, child));
946                }
947                return Some((prefix_len, node));
948            }
949        }
950        None
951    }
952}
953
954/// An iterator over entries in that collects all values up to
955/// until the key stops matching.
956#[derive(Debug)]
957pub(crate) struct CommonPrefixesIterOwned<'a, K, V> {
958    key: K,
959    stack: Vec<(usize, &'a Node<V>)>,
960}
961
962impl<'a, K, V> Iterator for CommonPrefixesIterOwned<'a, K, V>
963where
964    K: Bytes + AsRef<K::Borrowed>,
965{
966    type Item = (usize, &'a Node<V>);
967    fn next(&mut self) -> Option<Self::Item> {
968        while let Some((offset, node)) = self.stack.pop() {
969            let key = self.key.as_ref().strip_n_prefix(offset);
970            let (_next, common_prefix_len) = key.strip_common_prefix_and_len(node.label());
971            if common_prefix_len == 0 && key.cmp_first_item(node.label()).is_ge() {
972                if let Some(sibling) = node.sibling() {
973                    self.stack.push((offset, sibling));
974                }
975            }
976
977            if common_prefix_len == node.label().len() {
978                let prefix_len = offset + common_prefix_len;
979                if let Some(child) = node.child() {
980                    self.stack.push((prefix_len, child));
981                }
982                return Some((prefix_len, node));
983            }
984        }
985        None
986    }
987}
988
989/// An owning iterator which traverses the nodes in a tree, in depth first order.
990///
991/// The first element of an item is the level of the traversing node.
992#[derive(Debug)]
993pub struct IntoIter<V> {
994    stack: Vec<(usize, Node<V>)>,
995}
996impl<V> Iterator for IntoIter<V> {
997    type Item = (usize, Node<V>);
998    fn next(&mut self) -> Option<Self::Item> {
999        if let Some((level, mut node)) = self.stack.pop() {
1000            if let Some(sibling) = node.take_sibling() {
1001                self.stack.push((level, sibling));
1002            }
1003            if let Some(child) = node.take_child() {
1004                self.stack.push((level + 1, child));
1005            }
1006            Some((level, node))
1007        } else {
1008            None
1009        }
1010    }
1011}
1012
1013#[cfg(test)]
1014mod tests {
1015    use super::*;
1016    use crate::{PatriciaSet, StringPatriciaMap};
1017    use std::str;
1018
1019    #[test]
1020    fn root_works() {
1021        let node = Node::<()>::root();
1022        assert!(node.label().is_empty());
1023        assert!(node.value().is_none());
1024        assert!(node.child().is_none());
1025        assert!(node.sibling().is_none());
1026    }
1027
1028    #[test]
1029    fn new_works() {
1030        let node0 = Node::new("foo".as_ref(), Some(3), None, None);
1031        assert_eq!(node0.label(), b"foo");
1032        assert_eq!(node0.value(), Some(&3));
1033        assert_eq!(node0.child().map(|n| n.label()), None);
1034        assert_eq!(node0.sibling().map(|n| n.label()), None);
1035
1036        let node1 = Node::new("bar".as_ref(), None, None, Some(node0));
1037        assert_eq!(node1.label(), b"bar");
1038        assert_eq!(node1.value(), None);
1039        assert_eq!(node1.child().map(|n| n.label()), None);
1040        assert_eq!(node1.sibling().map(|n| n.label()), Some(&b"foo"[..]));
1041
1042        // If the length of a label name is longer than 255, it will be splitted to two nodes.
1043        let node2 = Node::new([b'a'; 256].as_ref(), Some(4), Some(node1), None);
1044        assert_eq!(node2.label(), [b'a'; 255].as_ref());
1045        assert_eq!(node2.value(), None);
1046        assert_eq!(node2.child().map(|n| n.label()), Some(&b"a"[..]));
1047        assert_eq!(node2.sibling().map(|n| n.label()), None);
1048
1049        assert_eq!(node2.child().unwrap().value(), Some(&4));
1050        assert_eq!(node2.child().unwrap().child().unwrap().label(), b"bar");
1051    }
1052
1053    #[test]
1054    fn ietr_works() {
1055        let mut set = PatriciaSet::new();
1056        set.insert("foo");
1057        set.insert("bar");
1058        set.insert("baz");
1059
1060        let root = set.into_node();
1061        let nodes = root
1062            .iter()
1063            .map(|(level, node)| (level, node.label()))
1064            .collect::<Vec<_>>();
1065        assert_eq!(
1066            nodes,
1067            [
1068                (0, "".as_ref()),
1069                (1, "ba".as_ref()),
1070                (2, "r".as_ref()),
1071                (2, "z".as_ref()),
1072                (1, "foo".as_ref())
1073            ]
1074        );
1075    }
1076
1077    #[test]
1078    fn iter_mut_works() {
1079        let mut set = PatriciaSet::new();
1080        set.insert("foo");
1081        set.insert("bar");
1082        set.insert("baz");
1083
1084        let mut root = set.into_node();
1085        let nodes = root
1086            .iter_mut()
1087            .map(|(level, node)| (level, node.label()))
1088            .collect::<Vec<_>>();
1089        assert_eq!(
1090            nodes,
1091            [
1092                (0, "".as_ref()),
1093                (1, "ba".as_ref()),
1094                (2, "r".as_ref()),
1095                (2, "z".as_ref()),
1096                (1, "foo".as_ref())
1097            ]
1098        );
1099    }
1100
1101    #[test]
1102    fn long_label_works() {
1103        let node = Node::new(&[b'a'; 256][..], Some(10), None, None);
1104        assert_eq!(node.label(), &[b'a'; 255][..]);
1105        assert_eq!(node.value(), None);
1106        assert!(node.child().is_some());
1107
1108        let child = node.child().unwrap();
1109        assert_eq!(child.label(), b"a");
1110        assert_eq!(child.value(), Some(&10));
1111    }
1112
1113    #[test]
1114    fn reclaim_works() {
1115        let mut set = ["123", "123456", "123abc", "123def"]
1116            .iter()
1117            .collect::<PatriciaSet>();
1118        assert_eq!(
1119            set_to_labels(&set),
1120            [(0, ""), (1, "123"), (2, "456"), (2, "abc"), (2, "def")]
1121        );
1122
1123        set.remove("123def");
1124        assert_eq!(
1125            set_to_labels(&set),
1126            [(0, ""), (1, "123"), (2, "456"), (2, "abc")]
1127        );
1128
1129        set.remove("123456");
1130        assert_eq!(set_to_labels(&set), [(0, ""), (1, "123"), (2, "abc")]);
1131
1132        set.remove("123");
1133        assert_eq!(set_to_labels(&set), [(0, ""), (1, "123abc")]);
1134    }
1135
1136    #[test]
1137    fn get_longest_common_prefix_works() {
1138        let set = ["123", "123456", "1234_67", "123abc", "123def"]
1139            .iter()
1140            .collect::<PatriciaSet>();
1141
1142        let lcp = |key| set.get_longest_common_prefix(key);
1143        assert_eq!(lcp(""), None);
1144        assert_eq!(lcp("12"), None);
1145        assert_eq!(lcp("123"), Some("123".as_bytes()));
1146        assert_eq!(lcp("1234"), Some("123".as_bytes()));
1147        assert_eq!(lcp("123456"), Some("123456".as_bytes()));
1148        assert_eq!(lcp("1234_6"), Some("123".as_bytes()));
1149        assert_eq!(lcp("123456789"), Some("123456".as_bytes()));
1150    }
1151
1152    #[test]
1153    fn get_longest_common_prefix_mut_works() {
1154        let mut map = [
1155            ("123", 1),
1156            ("123456", 2),
1157            ("1234_67", 3),
1158            ("123abc", 4),
1159            ("123def", 5),
1160        ]
1161        .iter()
1162        .cloned()
1163        .map(|(k, v)| (String::from(k), v))
1164        .collect::<StringPatriciaMap<usize>>();
1165
1166        assert_eq!(map.get_longest_common_prefix_mut(""), None);
1167        assert_eq!(map.get_longest_common_prefix_mut("12"), None);
1168        assert_eq!(
1169            map.get_longest_common_prefix_mut("123"),
1170            Some(("123", &mut 1))
1171        );
1172        *map.get_longest_common_prefix_mut("123").unwrap().1 = 10;
1173        assert_eq!(
1174            map.get_longest_common_prefix_mut("1234"),
1175            Some(("123", &mut 10))
1176        );
1177        assert_eq!(
1178            map.get_longest_common_prefix_mut("123456"),
1179            Some(("123456", &mut 2))
1180        );
1181        *map.get_longest_common_prefix_mut("1234567").unwrap().1 = 20;
1182        assert_eq!(
1183            map.get_longest_common_prefix_mut("1234_6"),
1184            Some(("123", &mut 10))
1185        );
1186        assert_eq!(
1187            map.get_longest_common_prefix_mut("123456789"),
1188            Some(("123456", &mut 20))
1189        );
1190    }
1191
1192    fn set_to_labels(set: &PatriciaSet) -> Vec<(usize, &str)> {
1193        set.as_node()
1194            .iter()
1195            .map(|(level, n)| (level, str::from_utf8(n.label()).unwrap()))
1196            .collect()
1197    }
1198}