1use 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; 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#[derive(Debug)]
83pub struct Node<V> {
84 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 pub fn root() -> Self {
100 Node::new(b"", None, None, None)
101 }
102
103 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 pub fn iter(&self) -> Iter<'_, V> {
414 Iter {
415 stack: vec![(0, self)],
416 }
417 }
418
419 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#[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#[derive(Debug)]
875pub struct IterMut<'a, V: 'a> {
876 stack: Vec<(usize, &'a mut Node<V>)>,
877}
878
879pub 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 pub fn label(&self) -> &'a [u8] {
890 self.label
891 }
892
893 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#[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#[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#[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 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}