1
- use base:: { Node , Entry , Sink , lefti, righti, parenti, SlotStack } ;
1
+ use base:: { Node , Entry , Sink , lefti, righti, parenti, SlotStack , Refill } ;
2
2
use base:: bulk_delete:: DeleteRangeCache ;
3
3
use std:: fmt:: { Debug , Formatter } ;
4
4
use std:: fmt;
@@ -21,11 +21,11 @@ impl<N: Node, T> TreeDerefMut<N> for T where T: Deref<Target=TreeRepr<N>> + Dere
21
21
22
22
#[ derive( Clone ) ]
23
23
pub struct TreeRepr < N : Node > {
24
- pub data : Vec < N > ,
25
- pub mask : Vec < bool > ,
24
+ data : Vec < N > ,
25
+ mask : Vec < bool > ,
26
26
pub size : usize ,
27
27
28
- pub delete_range_cache : DeleteRangeCache ,
28
+ delete_range_cache : DeleteRangeCache ,
29
29
}
30
30
31
31
@@ -119,14 +119,18 @@ impl<N: Node> TreeRepr<N> {
119
119
pub fn clear ( & mut self ) {
120
120
self . drop_items ( ) ;
121
121
}
122
+
123
+ pub fn capacity ( & self ) -> usize {
124
+ self . data . len ( )
125
+ }
122
126
}
123
127
124
128
125
129
//---- Accessors -----------------------------------------------------------------------------------
126
130
impl < N : Node > TreeRepr < N > {
127
131
// The caller must make sure idx is inside bounds.
128
132
#[ inline( always) ]
129
- fn mask ( & self , idx : usize ) -> bool {
133
+ pub fn mask ( & self , idx : usize ) -> bool {
130
134
debug_assert ! ( idx < self . data. len( ) ) ;
131
135
unsafe {
132
136
* self . mask . get_unchecked ( idx)
@@ -135,7 +139,7 @@ impl<N: Node> TreeRepr<N> {
135
139
136
140
// The caller must make sure idx is inside bounds.
137
141
#[ inline( always) ]
138
- fn mask_mut ( & mut self , idx : usize ) -> & mut bool {
142
+ pub fn mask_mut ( & mut self , idx : usize ) -> & mut bool {
139
143
debug_assert ! ( idx < self . data. len( ) ) ;
140
144
unsafe {
141
145
self . mask . get_unchecked_mut ( idx)
@@ -674,6 +678,19 @@ impl<N: Node> TraverseMut<N> for TreeRepr<N> {}
674
678
675
679
676
680
681
+ impl < N : Node > Refill for TreeRepr < N > where N :: K : Copy , N :: V : Copy {
682
+ fn refill ( & mut self , master : & TreeRepr < N > ) {
683
+ let len = self . data . len ( ) ;
684
+ debug_assert ! ( len == master. data. len( ) ) ;
685
+ unsafe {
686
+ ptr:: copy_nonoverlapping ( master. data . as_ptr ( ) , self . data . as_mut_ptr ( ) , len) ;
687
+ ptr:: copy_nonoverlapping ( master. mask . as_ptr ( ) , self . mask . as_mut_ptr ( ) , len) ;
688
+ }
689
+ self . size = master. size ;
690
+ }
691
+ }
692
+
693
+
677
694
/// Returns the closest subtree A enclosing `idx`, such that A is the left child (or 0 if no such
678
695
/// node is found). `idx` is considered to enclose itself, so we return `idx` if it is the left
679
696
/// child.
0 commit comments