@@ -1236,10 +1236,10 @@ impl<K: Ord, V> BTreeMap<K, V> {
1236
1236
right_root. fix_left_border ( ) ;
1237
1237
1238
1238
if left_root. height ( ) < right_root. height ( ) {
1239
- self . recalc_length ( ) ;
1239
+ self . length = left_root . node_as_ref ( ) . calc_length ( ) ;
1240
1240
right. length = total_num - self . len ( ) ;
1241
1241
} else {
1242
- right. recalc_length ( ) ;
1242
+ right. length = right_root . node_as_ref ( ) . calc_length ( ) ;
1243
1243
self . length = total_num - right. len ( ) ;
1244
1244
}
1245
1245
@@ -1283,42 +1283,13 @@ impl<K: Ord, V> BTreeMap<K, V> {
1283
1283
{
1284
1284
DrainFilter { pred, inner : self . drain_filter_inner ( ) }
1285
1285
}
1286
+
1286
1287
pub ( super ) fn drain_filter_inner ( & mut self ) -> DrainFilterInner < ' _ , K , V > {
1287
1288
let root_node = self . root . as_mut ( ) . map ( |r| r. node_as_mut ( ) ) ;
1288
1289
let front = root_node. map ( |rn| rn. first_leaf_edge ( ) ) ;
1289
1290
DrainFilterInner { length : & mut self . length , cur_leaf_edge : front }
1290
1291
}
1291
1292
1292
- /// Calculates the number of elements if it is incorrect.
1293
- fn recalc_length ( & mut self ) {
1294
- fn dfs < ' a , K , V > ( node : NodeRef < marker:: Immut < ' a > , K , V , marker:: LeafOrInternal > ) -> usize
1295
- where
1296
- K : ' a ,
1297
- V : ' a ,
1298
- {
1299
- let mut res = node. len ( ) ;
1300
-
1301
- if let Internal ( node) = node. force ( ) {
1302
- let mut edge = node. first_edge ( ) ;
1303
- loop {
1304
- res += dfs ( edge. reborrow ( ) . descend ( ) ) ;
1305
- match edge. right_kv ( ) {
1306
- Ok ( right_kv) => {
1307
- edge = right_kv. right_edge ( ) ;
1308
- }
1309
- Err ( _) => {
1310
- break ;
1311
- }
1312
- }
1313
- }
1314
- }
1315
-
1316
- res
1317
- }
1318
-
1319
- self . length = dfs ( self . root . as_ref ( ) . unwrap ( ) . node_as_ref ( ) ) ;
1320
- }
1321
-
1322
1293
/// Creates a consuming iterator visiting all the keys, in sorted order.
1323
1294
/// The map cannot be used after calling this.
1324
1295
/// The iterator element type is `K`.
0 commit comments