1pub trait NodeRefTrait:
6 Copy + Clone + Encodable + Decodable + PartialEq + Debug
7{
8}
9
10impl NodeRefTrait for MerkleHash {}
11
12#[derive(Clone, Debug, PartialEq, MallocSizeOfDerive)]
13pub struct VanillaChildrenTable<NodeRefT: NodeRefTrait> {
14 table: [NodeRefT; CHILDREN_COUNT],
15 children_count: u8,
18}
19
20impl From<ChildrenMerkleTable> for VanillaChildrenTable<MerkleHash> {
21 fn from(x: ChildrenMerkleTable) -> Self {
22 let mut children_count = 0;
23 for merkle in &x {
24 if !merkle.eq(ChildrenTableItem::<MerkleHash>::no_child()) {
25 children_count += 1;
26 }
27 }
28 Self {
29 table: x,
30 children_count,
31 }
32 }
33}
34
35impl From<MaybeMerkleTable> for VanillaChildrenTable<MerkleHash> {
36 fn from(x: MaybeMerkleTable) -> Self {
37 match x {
38 None => Self::default(),
39 Some(t) => t.into(),
40 }
41 }
42}
43
44pub trait DefaultChildrenItem<NodeRefT: NodeRefTrait> {
45 fn no_child() -> &'static NodeRefT;
46}
47
48pub struct ChildrenTableItem<NodeRefT: NodeRefTrait> {
49 _marker: PhantomData<NodeRefT>,
50}
51
52impl DefaultChildrenItem<MerkleHash> for ChildrenTableItem<MerkleHash> {
53 fn no_child() -> &'static MerkleHash { &MERKLE_NULL_NODE }
54}
55
56impl<NodeRefT: NodeRefTrait> WrappedCreateFrom<NodeRefT, NodeRefT>
57 for ChildrenTableItem<NodeRefT>
58{
59 fn take(x: NodeRefT) -> NodeRefT { x }
60}
61
62impl<'x, NodeRefT: NodeRefTrait> WrappedCreateFrom<&'x NodeRefT, NodeRefT>
63 for ChildrenTableItem<NodeRefT>
64{
65 fn take(x: &'x NodeRefT) -> NodeRefT { x.clone() }
66
67 fn take_from(dest: &mut NodeRefT, x: &'x NodeRefT) { dest.clone_from(x); }
68}
69
70impl<NodeRefT: 'static + NodeRefTrait> Default
71 for VanillaChildrenTable<NodeRefT>
72where ChildrenTableItem<NodeRefT>: DefaultChildrenItem<NodeRefT>
73{
74 fn default() -> Self {
75 Self {
76 children_count: 0,
77 table: [ChildrenTableItem::<NodeRefT>::no_child().clone();
78 CHILDREN_COUNT],
79 }
80 }
81}
82
83impl<NodeRefT: 'static + NodeRefTrait> VanillaChildrenTable<NodeRefT> {
84 pub fn new_from_one_child(child_index: u8, child: &NodeRefT) -> Self
87 where ChildrenTableItem<NodeRefT>: DefaultChildrenItem<NodeRefT> {
88 let mut table = VanillaChildrenTable::default();
89 table.children_count = 1;
90 table.table[child_index as usize] = child.clone();
91 table
92 }
93
94 pub fn get_children_table(&self) -> &[NodeRefT; CHILDREN_COUNT] {
95 &self.table
96 }
97
98 pub fn get_children_count(&self) -> u8 { self.children_count }
99
100 pub unsafe fn get_children_count_mut(&mut self) -> &mut u8 {
101 &mut self.children_count
102 }
103
104 pub fn get_child(&self, child_index: u8) -> Option<&NodeRefT>
105 where ChildrenTableItem<NodeRefT>: DefaultChildrenItem<NodeRefT> {
106 let child_ref =
107 unsafe { self.table.get_unchecked(child_index as usize) };
108 if child_ref.eq(ChildrenTableItem::<NodeRefT>::no_child()) {
109 None
110 } else {
111 Some(child_ref)
112 }
113 }
114
115 pub unsafe fn get_child_mut_unchecked(
116 &mut self, child_index: u8,
117 ) -> &mut NodeRefT {
118 self.table.get_unchecked_mut(child_index as usize)
119 }
120
121 pub fn iter(&self) -> VanillaChildrenTableIterator<'_, NodeRefT> {
122 VanillaChildrenTableIterator {
123 next_child_index: 0,
124 table: &self.table,
125 }
126 }
127}
128
129impl<NodeRefT: 'static + NodeRefTrait> Encodable
132 for VanillaChildrenTable<NodeRefT>
133where ChildrenTableItem<NodeRefT>: DefaultChildrenItem<NodeRefT>
134{
135 fn rlp_append(&self, s: &mut RlpStream) {
136 if self.children_count == 0 {
137 s.begin_list(0);
138 } else {
139 s.append_list(&self.table[..]);
140 };
141 }
142}
143
144impl<NodeRefT: 'static + NodeRefTrait> Decodable
145 for VanillaChildrenTable<NodeRefT>
146where ChildrenTableItem<NodeRefT>: DefaultChildrenItem<NodeRefT>
147{
148 fn decode(rlp: &Rlp) -> std::result::Result<Self, DecoderError> {
149 if rlp.is_empty() {
150 Ok(Default::default())
151 } else {
152 let mut table_uninit: MaybeUninit<[NodeRefT; CHILDREN_COUNT]> =
153 MaybeUninit::uninit();
154 let table = unsafe { &mut *table_uninit.as_mut_ptr() };
155 let mut children_count = 0;
156 for i in 0..16 {
157 (*table)[i] = rlp.val_at::<NodeRefT>(i)?;
158 if !(*table)[i].eq(ChildrenTableItem::<NodeRefT>::no_child()) {
159 children_count += 1;
160 }
161 }
162
163 Ok(VanillaChildrenTable {
164 table: unsafe { table_uninit.assume_init() },
165 children_count,
166 })
167 }
168 }
169}
170
171impl<NodeRefT: NodeRefTrait + Serialize> Serialize
172 for VanillaChildrenTable<NodeRefT>
173{
174 fn serialize<S>(
175 &self, serializer: S,
176 ) -> std::result::Result<S::Ok, S::Error>
177 where S: Serializer {
178 let seq = if self.children_count == 0 {
179 serializer.serialize_seq(Some(0))?
180 } else {
181 let mut seq = serializer.serialize_seq(Some(self.table.len()))?;
182 for element in self.table.iter() {
183 seq.serialize_element(element)?;
184 }
185 seq
186 };
187
188 seq.end()
189 }
190}
191
192impl<'a, NodeRefT: 'static + NodeRefTrait + Deserialize<'a>> Deserialize<'a>
193 for VanillaChildrenTable<NodeRefT>
194where ChildrenTableItem<NodeRefT>: DefaultChildrenItem<NodeRefT>
195{
196 fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
197 where D: Deserializer<'a> {
198 let nodes: Vec<NodeRefT> = Deserialize::deserialize(deserializer)?;
199
200 if nodes.len() == 0 {
201 Ok(Default::default())
202 } else {
203 let mut table_uninit: MaybeUninit<[NodeRefT; CHILDREN_COUNT]> =
204 MaybeUninit::uninit();
205 let table = unsafe { &mut *table_uninit.as_mut_ptr() };
206 let mut children_count = 0;
207 for i in 0..16 {
208 (*table)[i] = nodes[i];
209 if !(*table)[i].eq(ChildrenTableItem::<NodeRefT>::no_child()) {
210 children_count += 1;
211 }
212 }
213
214 Ok(VanillaChildrenTable {
215 table: unsafe { table_uninit.assume_init() },
216 children_count,
217 })
218 }
219 }
220}
221
222pub struct VanillaChildrenTableIterator<'a, NodeRefT: NodeRefTrait> {
223 next_child_index: u8,
224 table: &'a [NodeRefT; CHILDREN_COUNT],
225}
226
227impl<'a, NodeRefT: 'static + NodeRefTrait> Iterator
228 for VanillaChildrenTableIterator<'a, NodeRefT>
229where ChildrenTableItem<NodeRefT>: DefaultChildrenItem<NodeRefT>
230{
231 type Item = (u8, &'a NodeRefT);
232
233 fn next(&mut self) -> Option<Self::Item> {
234 while (self.next_child_index as usize) < CHILDREN_COUNT {
235 let child_index = self.next_child_index;
236 let child_ref = unsafe {
237 self.table.get_unchecked(self.next_child_index as usize)
238 };
239 self.next_child_index = child_index + 1;
240 if !child_ref.eq(ChildrenTableItem::<NodeRefT>::no_child()) {
241 return Some((child_index, child_ref));
242 }
243 }
244 None
245 }
246}
247
248impl<'a, NodeRefT: NodeRefTrait> ChildrenTableIteratorStartIndex
249 for VanillaChildrenTableIterator<'a, NodeRefT>
250{
251 fn set_start_index(mut self, index: u8) -> Self {
252 self.next_child_index = index;
253 self
254 }
255}
256
257pub struct CompactedChildrenTable<NodeRefT: NodeRefTrait> {
259 bitmap: u16,
261 children_count: u8,
263 table_ptr: *mut NodeRefT,
265}
266
267impl<NodeRefT: NodeRefTrait> MallocSizeOf for CompactedChildrenTable<NodeRefT> {
268 fn size_of(&self, ops: &mut MallocSizeOfOps) -> usize {
269 unsafe { ops.malloc_size_of(self.table_ptr) }
271 }
272}
273
274pub const CHILDREN_COUNT: usize = 16;
275
276impl<NodeRefT: NodeRefTrait> Default for CompactedChildrenTable<NodeRefT> {
277 fn default() -> Self {
278 Self {
279 bitmap: 0,
280 children_count: 0,
281 table_ptr: null_mut(),
282 }
283 }
284}
285
286impl<NodeRefT: NodeRefTrait> Clone for CompactedChildrenTable<NodeRefT> {
287 fn clone(&self) -> Self { self.to_ref().into() }
288}
289
290impl<NodeRefT: NodeRefTrait> Debug for CompactedChildrenTable<NodeRefT> {
291 fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
292 write!(f, "ChildrenTable{{ {:?} }}", self.to_ref())
293 }
294}
295
296impl<NodeRefT: NodeRefTrait> CompactedChildrenTable<NodeRefT> {
297 pub fn get_children_count(&self) -> u8 { self.children_count }
298
299 pub fn get_child(&self, index: u8) -> Option<NodeRefT> {
300 if Self::has_index(self.bitmap, index) {
301 Some(unsafe {
302 (*self.table_ptr.add(Self::lower_bound(self.bitmap, index)))
303 .clone()
304 })
305 } else {
306 None
307 }
308 }
309
310 pub unsafe fn get_child_mut_unchecked(
311 &mut self, index: u8,
312 ) -> &mut NodeRefT {
313 &mut *self.table_ptr.add(Self::lower_bound(self.bitmap, index))
314 }
315
316 pub unsafe fn set_child_unchecked(&mut self, index: u8, value: NodeRefT) {
318 *self.table_ptr.add(Self::lower_bound(self.bitmap, index)) =
319 value.clone();
320 }
321
322 pub fn new_from_one_child(index: u8, value: NodeRefT) -> Self {
323 Self {
324 bitmap: Self::bit(index.into()),
325 children_count: 1,
326 table_ptr: unsafe {
327 Self::managed_slice_into_raw(vec![value].into_boxed_slice())
328 },
329 }
330 }
331
332 pub unsafe fn insert_child_unchecked(
333 old_table: ChildrenTableRef<NodeRefT>, index: u8, value: NodeRefT,
334 ) -> Self {
335 let insertion_pos = Self::lower_bound(old_table.bitmap, index);
336 Self {
337 bitmap: old_table.bitmap | Self::bit(index.into()),
338 children_count: old_table.table.len() as u8 + 1,
339 table_ptr: Self::managed_slice_into_raw(
340 [
341 &old_table.table[0..insertion_pos],
342 &[value],
343 &old_table.table[insertion_pos..],
344 ]
345 .concat()
346 .into_boxed_slice(),
347 ),
348 }
349 }
350
351 pub unsafe fn delete_child_unchecked(
352 old_table: ChildrenTableRef<NodeRefT>, index: u8,
353 ) -> Self {
354 let deletion_pos = Self::lower_bound(old_table.bitmap, index);
355 Self {
356 bitmap: old_table.bitmap & (!Self::bit(index.into())),
357 children_count: old_table.table.len() as u8 - 1,
358 table_ptr: Self::managed_slice_into_raw(
359 [
360 &old_table.table[0..deletion_pos],
361 &old_table.table[deletion_pos + 1..],
362 ]
363 .concat()
364 .into_boxed_slice(),
365 ),
366 }
367 }
368}
369
370#[cfg(test)]
371impl<NodeRefT: NodeRefTrait> CompactedChildrenTable<NodeRefT> {
372 pub fn assert_no_alloc_in_empty_children_table(&self) {
373 assert_eq!(
374 true,
375 self.children_count != 0
376 || self.table_ptr == null_mut()
377 || self.table_ptr as usize == mem::align_of::<NodeRefT>()
378 )
379 }
380}
381
382impl<NodeRefT: NodeRefTrait> Drop for CompactedChildrenTable<NodeRefT> {
383 fn drop(&mut self) {
384 if self.children_count != 0 {
385 drop(unsafe { self.into_managed_slice() });
386 } else {
387 }
400 }
401}
402
403impl<NodeRefT: NodeRefTrait> CompactedChildrenTable<NodeRefT> {
404 unsafe fn into_managed_slice(&self) -> Option<Vec<NodeRefT>> {
405 if self.children_count != 0 {
406 assert_ne!(self.table_ptr, null_mut());
407 Some(Vec::from_raw_parts(
408 self.table_ptr,
409 self.children_count.into(),
410 self.children_count.into(),
411 ))
412 } else {
413 None
414 }
415 }
416
417 unsafe fn managed_slice_into_raw(
418 mut managed: Box<[NodeRefT]>,
419 ) -> *mut NodeRefT {
420 let ret = managed.as_mut_ptr();
425
426 mem::forget(managed);
427 ret
428 }
429
430 pub fn from_managed(managed: ChildrenTable<NodeRefT>) -> Self {
431 let children_count = managed.table.len() as u8;
432 Self {
433 bitmap: managed.bitmap,
434 table_ptr: unsafe { Self::managed_slice_into_raw(managed.table) },
435 children_count,
436 }
437 }
438
439 pub fn to_ref(&self) -> ChildrenTableRef<'_, NodeRefT> {
440 debug_assert!(!self.table_ptr.is_null() || self.children_count == 0);
441 ChildrenTableRef {
442 table: unsafe {
443 slice::from_raw_parts(
444 if self.table_ptr.is_null() {
445 NonNull::dangling().as_ptr()
446 } else {
447 self.table_ptr
448 },
449 self.children_count.into(),
450 )
451 },
452 bitmap: self.bitmap,
453 }
454 }
455
456 pub fn from_ref<'a>(r: ChildrenTableRef<'a, NodeRefT>) -> Self {
457 Self {
458 bitmap: r.bitmap,
459 table_ptr: unsafe {
460 Self::managed_slice_into_raw(r.table.to_vec().into())
461 },
462 children_count: r.table.len() as u8,
463 }
464 }
465}
466
467impl<NodeRefT: NodeRefTrait> CompactedChildrenTable<NodeRefT> {
468 fn bit(index: u16) -> u16 { 1 << index }
469
470 fn has_index(bitmap: u16, index: u8) -> bool {
471 Self::bit(index.into()) & bitmap != 0
472 }
473
474 fn lower_bits(index: u16) -> u16 { (1 << index) - 1 }
475
476 fn all_bits() -> u16 { !0 }
477
478 fn count_bits(bitmap: u16) -> u16 {
479 let mut count = (bitmap & 0b0101010101010101)
480 + ((bitmap >> 1) & 0b0101010101010101);
481 count =
482 (count & 0b0011001100110011) + ((count >> 2) & 0b0011001100110011);
483 count =
484 (count & 0b0000111100001111) + ((count >> 4) & 0b0000111100001111);
485 (count & 0b0000000011111111) + (count >> 8)
486 }
487
488 fn lowest_bit_at(bitmap: u16) -> u8 {
489 Self::count_bits(1 ^ bitmap ^ (bitmap - 1)) as u8
490 }
491
492 fn remove_lowest_bit(bitmap: u16) -> u16 { bitmap & (bitmap - 1) }
493
494 fn lower_bound(bitmap: u16, index: u8) -> usize {
495 Self::count_bits(bitmap & Self::lower_bits(index.into())).into()
496 }
497}
498
499impl<NodeRefT: NodeRefTrait> CompactedChildrenTable<NodeRefT> {
500 pub fn iter(&self) -> CompactedChildrenTableIterator<'_, NodeRefT> {
501 CompactedChildrenTableIterator {
502 elements: self.table_ptr,
503 bitmap: self.bitmap,
504 __marker: PhantomData,
505 }
506 }
507
508 pub fn iter_mut(
509 &mut self,
510 ) -> CompactedChildrenTableIteratorMut<'_, NodeRefT> {
511 CompactedChildrenTableIteratorMut {
512 elements: self.table_ptr,
513 bitmap: self.bitmap,
514 __marker: PhantomData,
515 }
516 }
517
518 pub fn iter_non_skip(
519 &self,
520 ) -> CompactedChildrenTableIteratorNonSkip<'_, NodeRefT> {
521 CompactedChildrenTableIteratorNonSkip {
522 next_child_index: 0,
523 elements: self.table_ptr,
524 bitmap: self.bitmap,
525 __marker: PhantomData,
526 }
527 }
528
529 pub fn iter_non_skip_mut(
530 &mut self,
531 ) -> CompactedChildrenTableIteratorNonSkipMut<'_, NodeRefT> {
532 CompactedChildrenTableIteratorNonSkipMut {
533 next_child_index: 0,
534 elements: self.table_ptr,
535 bitmap: self.bitmap,
536 __marker: PhantomData,
537 }
538 }
539}
540
541impl<NodeRefT: NodeRefTrait> PartialEq for CompactedChildrenTable<NodeRefT> {
542 fn eq(&self, other: &Self) -> bool { self.to_ref() == other.to_ref() }
543}
544
545pub trait ChildrenTableIteratorStartIndex {
546 fn set_start_index(self, index: u8) -> Self;
547}
548
549trait CompactedChildrenTableIteratorTrait: ChildrenTableIteratorStartIndex {
550 type NodeRefT: NodeRefTrait;
551 type RefType;
552
553 fn get_bitmap(&self) -> u16;
554
555 fn set_bitmap(&mut self, bitmap: u16);
557
558 fn set_next_child_index(&mut self, child_index: u8);
560
561 fn get_current_element(&self) -> Self::RefType;
562
563 fn advance_elements(&mut self);
564}
565
566trait CompactedChildrenTableIteratorNonSkipImplTrait:
567 CompactedChildrenTableIteratorTrait
568{
569 fn set_start_index_impl(&mut self, index: u8) {
570 self.set_next_child_index(index);
571 }
572
573 fn next_impl(
574 &mut self, child_index: u8,
575 ) -> Option<(u8, Option<Self::RefType>)> {
576 if child_index as usize == CHILDREN_COUNT {
577 return None;
578 }
579
580 let ret;
581 if CompactedChildrenTable::<Self::NodeRefT>::has_index(
582 self.get_bitmap(),
583 child_index,
584 ) {
585 ret = Some((child_index, Some(self.get_current_element())));
586 self.advance_elements();
587 } else {
588 ret = Some((child_index, None));
589 }
590 self.set_next_child_index(child_index + 1);
591
592 ret
593 }
594}
595
596trait CompactedChildrenTableIteratorImplTrait:
597 CompactedChildrenTableIteratorTrait
598{
599 fn set_start_index_impl(&mut self, index: u8) {
600 self.set_bitmap(
601 self.get_bitmap()
602 & !CompactedChildrenTable::<Self::NodeRefT>::lower_bits(
603 index.into(),
604 ),
605 );
606 }
607
608 fn next_impl(&mut self) -> Option<(u8, Self::RefType)> {
609 let ret;
610 if self.get_bitmap() != 0 {
611 ret = Some((
612 CompactedChildrenTable::<Self::NodeRefT>::lowest_bit_at(
613 self.get_bitmap(),
614 ),
615 self.get_current_element(),
616 ));
617 } else {
618 return None;
619 }
620
621 self.advance_elements();
622 self.set_bitmap(
623 CompactedChildrenTable::<Self::NodeRefT>::remove_lowest_bit(
624 self.get_bitmap(),
625 ),
626 );
627
628 ret
629 }
630}
631
632pub struct CompactedChildrenTableIteratorNonSkip<'a, NodeRefT> {
633 next_child_index: u8,
634 elements: *const NodeRefT,
635 bitmap: u16,
636 __marker: PhantomData<&'a NodeRefT>,
637}
638
639impl<'a, NodeRefT: NodeRefTrait> CompactedChildrenTableIteratorTrait
640 for CompactedChildrenTableIteratorNonSkip<'a, NodeRefT>
641{
642 type NodeRefT = NodeRefT;
643 type RefType = &'a NodeRefT;
644
645 fn get_bitmap(&self) -> u16 { self.bitmap }
646
647 fn set_bitmap(&mut self, _bitmap: u16) { unreachable!() }
649
650 fn set_next_child_index(&mut self, child_index: u8) {
651 self.next_child_index = child_index;
652 }
653
654 fn get_current_element(&self) -> &'a NodeRefT { unsafe { &*self.elements } }
655
656 fn advance_elements(&mut self) {
657 unsafe {
658 self.elements = self.elements.offset(1);
659 }
660 }
661}
662
663impl<'a, NodeRefT: NodeRefTrait> CompactedChildrenTableIteratorNonSkipImplTrait
664 for CompactedChildrenTableIteratorNonSkip<'a, NodeRefT>
665{
666}
667
668impl<'a, NodeRefT: NodeRefTrait> Iterator
669 for CompactedChildrenTableIteratorNonSkip<'a, NodeRefT>
670{
671 type Item = (u8, Option<&'a NodeRefT>);
672
673 fn next(&mut self) -> Option<Self::Item> {
674 self.next_impl(self.next_child_index)
675 }
676}
677
678impl<'a, NodeRefT: NodeRefTrait> ChildrenTableIteratorStartIndex
679 for CompactedChildrenTableIteratorNonSkip<'a, NodeRefT>
680{
681 fn set_start_index(mut self, index: u8) -> Self {
682 self.set_start_index_impl(index);
683 self
684 }
685}
686
687pub struct CompactedChildrenTableIteratorNonSkipMut<'a, NodeRefT> {
688 next_child_index: u8,
689 elements: *mut NodeRefT,
690 bitmap: u16,
691 __marker: PhantomData<&'a mut NodeRefT>,
692}
693
694impl<'a, NodeRefT: NodeRefTrait> CompactedChildrenTableIteratorTrait
695 for CompactedChildrenTableIteratorNonSkipMut<'a, NodeRefT>
696{
697 type NodeRefT = NodeRefT;
698 type RefType = &'a mut NodeRefT;
699
700 fn get_bitmap(&self) -> u16 { self.bitmap }
701
702 fn set_bitmap(&mut self, _bitmap: u16) { unreachable!() }
704
705 fn set_next_child_index(&mut self, child_index: u8) {
706 self.next_child_index = child_index;
707 }
708
709 fn get_current_element(&self) -> &'a mut NodeRefT {
710 unsafe { &mut *self.elements }
711 }
712
713 fn advance_elements(&mut self) {
714 unsafe {
715 self.elements = self.elements.offset(1);
716 }
717 }
718}
719
720impl<'a, NodeRefT: NodeRefTrait> CompactedChildrenTableIteratorNonSkipImplTrait
721 for CompactedChildrenTableIteratorNonSkipMut<'a, NodeRefT>
722{
723}
724
725impl<'a, NodeRefT: NodeRefTrait> Iterator
726 for CompactedChildrenTableIteratorNonSkipMut<'a, NodeRefT>
727{
728 type Item = (u8, Option<&'a mut NodeRefT>);
729
730 fn next(&mut self) -> Option<Self::Item> {
731 self.next_impl(self.next_child_index)
732 }
733}
734
735impl<'a, NodeRefT: NodeRefTrait> ChildrenTableIteratorStartIndex
736 for CompactedChildrenTableIteratorNonSkipMut<'a, NodeRefT>
737{
738 fn set_start_index(mut self, index: u8) -> Self {
739 self.set_start_index_impl(index);
740 self
741 }
742}
743
744pub struct CompactedChildrenTableIterator<'a, NodeRefT> {
745 elements: *const NodeRefT,
746 bitmap: u16,
747 __marker: PhantomData<&'a NodeRefT>,
748}
749
750impl<'a, NodeRefT: NodeRefTrait> CompactedChildrenTableIteratorTrait
751 for CompactedChildrenTableIterator<'a, NodeRefT>
752{
753 type NodeRefT = NodeRefT;
754 type RefType = &'a NodeRefT;
755
756 fn get_bitmap(&self) -> u16 { self.bitmap }
757
758 fn set_bitmap(&mut self, bitmap: u16) { self.bitmap = bitmap }
759
760 fn set_next_child_index(&mut self, _child_index: u8) { unreachable!() }
762
763 fn get_current_element(&self) -> &'a NodeRefT { unsafe { &*self.elements } }
764
765 fn advance_elements(&mut self) {
766 unsafe {
767 self.elements = self.elements.offset(1);
768 }
769 }
770}
771
772impl<'a, NodeRefT: NodeRefTrait> CompactedChildrenTableIteratorImplTrait
773 for CompactedChildrenTableIterator<'a, NodeRefT>
774{
775}
776
777impl<'a, NodeRefT: NodeRefTrait> Iterator
778 for CompactedChildrenTableIterator<'a, NodeRefT>
779{
780 type Item = (u8, &'a NodeRefT);
781
782 fn next(&mut self) -> Option<Self::Item> { self.next_impl() }
783}
784
785impl<'a, NodeRefT: NodeRefTrait> ChildrenTableIteratorStartIndex
786 for CompactedChildrenTableIterator<'a, NodeRefT>
787{
788 fn set_start_index(mut self, index: u8) -> Self {
789 self.set_start_index_impl(index);
790 self
791 }
792}
793
794pub struct CompactedChildrenTableIteratorMut<'a, NodeRefT> {
795 elements: *mut NodeRefT,
796 bitmap: u16,
797 __marker: PhantomData<&'a mut NodeRefT>,
798}
799
800impl<'a, NodeRefT: NodeRefTrait> CompactedChildrenTableIteratorTrait
801 for CompactedChildrenTableIteratorMut<'a, NodeRefT>
802{
803 type NodeRefT = NodeRefT;
804 type RefType = &'a mut NodeRefT;
805
806 fn get_bitmap(&self) -> u16 { self.bitmap }
807
808 fn set_bitmap(&mut self, bitmap: u16) { self.bitmap = bitmap }
809
810 fn set_next_child_index(&mut self, _child_index: u8) { unreachable!() }
812
813 fn get_current_element(&self) -> &'a mut NodeRefT {
814 unsafe { &mut *self.elements }
815 }
816
817 fn advance_elements(&mut self) {
818 unsafe {
819 self.elements = self.elements.offset(1);
820 }
821 }
822}
823
824impl<'a, NodeRefT: NodeRefTrait> CompactedChildrenTableIteratorImplTrait
825 for CompactedChildrenTableIteratorMut<'a, NodeRefT>
826{
827}
828
829impl<'a, NodeRefT: NodeRefTrait> Iterator
830 for CompactedChildrenTableIteratorMut<'a, NodeRefT>
831{
832 type Item = (u8, &'a mut NodeRefT);
833
834 fn next(&mut self) -> Option<Self::Item> { self.next_impl() }
835}
836
837impl<'a, NodeRefT: NodeRefTrait> ChildrenTableIteratorStartIndex
838 for CompactedChildrenTableIteratorMut<'a, NodeRefT>
839{
840 fn set_start_index(mut self, index: u8) -> Self {
841 self.set_start_index_impl(index);
842 self
843 }
844}
845
846#[derive(MallocSizeOfDerive)]
847pub struct ChildrenTable<NodeRefT: NodeRefTrait> {
848 table: Box<[NodeRefT]>,
850 bitmap: u16,
852}
853
854impl<NodeRefT: NodeRefTrait> Default for ChildrenTable<NodeRefT> {
855 fn default() -> Self {
856 Self {
857 table: vec![].into_boxed_slice(),
858 bitmap: 0,
859 }
860 }
861}
862
863#[derive(Clone, Debug, PartialEq)]
864pub struct ChildrenTableRef<'a, NodeRefT: NodeRefTrait> {
865 table: &'a [NodeRefT],
866 bitmap: u16,
867}
868
869impl<'a, NodeRefT: NodeRefTrait> From<ChildrenTableRef<'a, NodeRefT>>
870 for CompactedChildrenTable<NodeRefT>
871{
872 fn from(x: ChildrenTableRef<'a, NodeRefT>) -> Self { Self::from_ref(x) }
873}
874
875impl<NodeRefT: NodeRefTrait> From<ChildrenTable<NodeRefT>>
876 for CompactedChildrenTable<NodeRefT>
877{
878 fn from(x: ChildrenTable<NodeRefT>) -> Self { Self::from_managed(x) }
879}
880
881impl<'a, NodeRefT: NodeRefTrait> Encodable for ChildrenTableRef<'a, NodeRefT> {
882 fn rlp_append(&self, s: &mut RlpStream) {
883 match self.table.len() {
884 0 => s.begin_list(0),
885 16 => s.append_list(self.table),
887 _ => s.begin_list(2).append(&self.bitmap).append_list(self.table),
891 };
892 }
893}
894
895impl<NodeRefT: NodeRefTrait> Decodable for ChildrenTable<NodeRefT> {
896 fn decode(rlp: &Rlp) -> ::std::result::Result<Self, DecoderError> {
897 let item_count = rlp.item_count()?;
898 Ok(match item_count {
899 0..=1 => Self::default(),
900 16 => Self {
901 bitmap: CompactedChildrenTable::<NodeRefT>::all_bits(),
902 table: rlp.as_list::<NodeRefT>()?.into_boxed_slice(),
903 },
904 _ => Self {
905 bitmap: rlp.val_at::<u16>(0)?,
906 table: rlp.list_at::<NodeRefT>(1)?.into_boxed_slice(),
907 },
908 })
909 }
910}
911
912use super::{
913 super::super::utils::WrappedCreateFrom,
914 merkle::{ChildrenMerkleTable, MaybeMerkleTable},
915};
916use malloc_size_of::{MallocSizeOf, MallocSizeOfOps};
917use malloc_size_of_derive::MallocSizeOf as MallocSizeOfDerive;
918use primitives::{MerkleHash, MERKLE_NULL_NODE};
919use rlp::*;
920use serde::{
921 ser::SerializeSeq, Deserialize, Deserializer, Serialize, Serializer,
922};
923use std::{
924 fmt::*,
925 marker::PhantomData,
926 mem::{self, MaybeUninit},
927 ptr::{null_mut, NonNull},
928 slice,
929};