@@ -130,6 +130,16 @@ fn full_range<BorrowType, K, V>(
130
130
}
131
131
}
132
132
133
+ impl < BorrowType , K , V , Type > NodeRef < BorrowType , K , V , Type > {
134
+ /// Duplicates a NodeRef, even for a non-immutable borrow type.
135
+ /// # Safety
136
+ /// Never visit the same KV twice, and never end up with overlapping
137
+ /// value references.
138
+ unsafe fn fork ( self ) -> ( Self , Self ) {
139
+ unsafe { ( ptr:: read ( & self ) , self ) }
140
+ }
141
+ }
142
+
133
143
impl < ' a , K : ' a , V : ' a > NodeRef < marker:: Immut < ' a > , K , V , marker:: LeafOrInternal > {
134
144
/// Creates a pair of leaf edges delimiting a specified range in or underneath a node.
135
145
///
@@ -180,10 +190,8 @@ impl<'a, K: 'a, V: 'a> NodeRef<marker::ValMut<'a>, K, V, marker::LeafOrInternal>
180
190
K : Borrow < Q > ,
181
191
R : RangeBounds < Q > ,
182
192
{
183
- // We duplicate the root NodeRef here -- we will never visit the same KV
184
- // twice, and never end up with overlapping value references.
185
- let self2 = unsafe { ptr:: read ( & self ) } ;
186
- range_search ( self , self2, range)
193
+ let ( self1, self2) = unsafe { self . fork ( ) } ;
194
+ range_search ( self1, self2, range)
187
195
}
188
196
189
197
/// Splits a unique reference into a pair of leaf edges delimiting the full range of the tree.
@@ -195,10 +203,8 @@ impl<'a, K: 'a, V: 'a> NodeRef<marker::ValMut<'a>, K, V, marker::LeafOrInternal>
195
203
Handle < NodeRef < marker:: ValMut < ' a > , K , V , marker:: Leaf > , marker:: Edge > ,
196
204
Handle < NodeRef < marker:: ValMut < ' a > , K , V , marker:: Leaf > , marker:: Edge > ,
197
205
) {
198
- // We duplicate the root NodeRef here -- we will never visit the same KV
199
- // twice, and never end up with overlapping value references.
200
- let self2 = unsafe { ptr:: read ( & self ) } ;
201
- full_range ( self , self2)
206
+ let ( self1, self2) = unsafe { self . fork ( ) } ;
207
+ full_range ( self1, self2)
202
208
}
203
209
}
204
210
@@ -212,10 +218,8 @@ impl<K, V> NodeRef<marker::Owned, K, V, marker::LeafOrInternal> {
212
218
Handle < NodeRef < marker:: Owned , K , V , marker:: Leaf > , marker:: Edge > ,
213
219
Handle < NodeRef < marker:: Owned , K , V , marker:: Leaf > , marker:: Edge > ,
214
220
) {
215
- // We duplicate the root NodeRef here -- we will never access it in a way
216
- // that overlaps references obtained from the root.
217
- let self2 = unsafe { ptr:: read ( & self ) } ;
218
- full_range ( self , self2)
221
+ let ( self1, self2) = unsafe { self . fork ( ) } ;
222
+ full_range ( self1, self2)
219
223
}
220
224
}
221
225
0 commit comments