@@ -27,6 +27,7 @@ use core::ptr::Unique;
27
27
use core:: { slice, mem, ptr, cmp, raw} ;
28
28
use alloc:: heap:: { self , EMPTY } ;
29
29
30
+ use vec:: Vec ;
30
31
use borrow:: Borrow ;
31
32
32
33
/// Represents the result of an Insertion: either the item fit, or the node had to split
@@ -904,6 +905,17 @@ impl<'a, K: 'a, V: 'a, NodeType> Handle<&'a mut Node<K, V>, handle::KV, NodeType
904
905
marker : PhantomData ,
905
906
}
906
907
}
908
+
909
+ /// Convert this handle into one pointing at the edge immediately to the right of the key/value
910
+ /// pair pointed-to by this handle. This is useful because it returns a reference with larger
911
+ /// lifetime than `right_edge`.
912
+ pub fn into_right_edge ( self ) -> Handle < & ' a mut Node < K , V > , handle:: Edge , NodeType > {
913
+ Handle {
914
+ node : & mut * self . node ,
915
+ index : self . index + 1 ,
916
+ marker : PhantomData ,
917
+ }
918
+ }
907
919
}
908
920
909
921
impl < ' a , K : ' a , V : ' a , NodeRef : Deref < Target =Node < K , V > > + ' a , NodeType > Handle < NodeRef , handle:: KV ,
@@ -1230,6 +1242,163 @@ impl<K, V> Node<K, V> {
1230
1242
}
1231
1243
}
1232
1244
1245
+ impl < K , V > Node < K , V > {
1246
+ pub fn from_sorted_iter < I > ( iter : I , b : usize ) -> ( usize , usize , Option < Node < K , V > > )
1247
+ where I : Iterator < Item =( K , V ) > {
1248
+ let capacity = capacity_from_b ( b) ;
1249
+ let minimum = min_load_from_capacity ( capacity) ;
1250
+
1251
+ // Holds the current level.
1252
+ let mut num_level = 0 ;
1253
+ // Needed to count the number of key-value pairs in `iter`.
1254
+ let mut length = 0 ;
1255
+ // `levels` contains the current node on every level, going from the leaves level to the
1256
+ // root level.
1257
+ let mut levels: Vec < Option < Node < K , V > > > = Vec :: new ( ) ;
1258
+
1259
+ // Iterate through all key-value pairs, pushing them into nodes of appropriate size at the
1260
+ // right level.
1261
+ for ( key, value) in iter {
1262
+ // Always go down to a leaf after inserting an element into an internal node.
1263
+ if num_level > 0 {
1264
+ num_level = 0 ;
1265
+ }
1266
+
1267
+ loop {
1268
+ // If we are in an internal node, extract node from the level below to insert it as
1269
+ // edge on the level above; `unsafe` is needed for unchecked access.
1270
+ let new_edge = unsafe {
1271
+ if num_level > 0 {
1272
+ levels. get_unchecked_mut ( num_level - 1 ) . take ( )
1273
+ } else {
1274
+ None
1275
+ }
1276
+ } ;
1277
+
1278
+ // Get current node on current level.
1279
+ // If we are past the top-most level, insert a new level.
1280
+ if num_level == levels. len ( ) {
1281
+ levels. push ( None ) ;
1282
+ }
1283
+ // If there is no node on this level, create a new node. `unsafe`
1284
+ // is needed for unchecked access.
1285
+ let level = unsafe { levels. get_unchecked_mut ( num_level) } ;
1286
+ if level. is_none ( ) {
1287
+ * level = if num_level == 0 {
1288
+ Some ( Node :: new_leaf ( capacity) )
1289
+ } else {
1290
+ // `unsafe` is needed for `new_internal`.
1291
+ unsafe {
1292
+ Some ( Node :: new_internal ( capacity) )
1293
+ }
1294
+ } ;
1295
+ }
1296
+ let node = level. as_mut ( ) . unwrap ( ) ;
1297
+
1298
+ // Insert edge from the level below; `unsafe` is needed for `push_edge`.
1299
+ if let Some ( edge) = new_edge {
1300
+ unsafe {
1301
+ node. push_edge ( edge) ;
1302
+ }
1303
+ }
1304
+
1305
+ // If node is already full, we have to go up one level before we can insert the
1306
+ // key-value pair.
1307
+ if !node. is_full ( ) {
1308
+ // Insert key-value pair into node; `unsafe` is needed for `push_kv`.
1309
+ unsafe {
1310
+ node. push_kv ( key, value) ;
1311
+ }
1312
+ break ;
1313
+ }
1314
+ num_level += 1 ;
1315
+ }
1316
+
1317
+ length += 1 ;
1318
+ }
1319
+
1320
+ // Fix "right edge" of the tree.
1321
+ if levels. len ( ) > 1 {
1322
+
1323
+ num_level = 0 ;
1324
+ while num_level < levels. len ( ) - 1 {
1325
+ // Extract node from this level or create a new one if there isn't any. `unsafe` is
1326
+ // needed for unchecked access and `new_internal`.
1327
+ let edge = unsafe {
1328
+ match levels. get_unchecked_mut ( num_level) . take ( ) {
1329
+ Some ( n) => n,
1330
+ None => {
1331
+ if num_level == 0 {
1332
+ Node :: new_leaf ( capacity)
1333
+ } else {
1334
+ Node :: new_internal ( capacity)
1335
+ }
1336
+ } ,
1337
+ }
1338
+ } ;
1339
+
1340
+ // Go to the level above.
1341
+ num_level += 1 ;
1342
+
1343
+ // Get node on this level, create one if there isn't any; `unsafe` is needed for
1344
+ // unchecked access.
1345
+ let level = unsafe { levels. get_unchecked_mut ( num_level) } ;
1346
+ if level. is_none ( ) {
1347
+ // `unsafe` is needed for `new_internal`.
1348
+ unsafe {
1349
+ * level = Some ( Node :: new_internal ( capacity) ) ;
1350
+ }
1351
+ }
1352
+ let mut node = level. as_mut ( ) . unwrap ( ) ;
1353
+
1354
+ // Insert `edge` as new edge in `node`; `unsafe` is needed for `push_edge`.
1355
+ unsafe {
1356
+ node. push_edge ( edge) ;
1357
+ }
1358
+ }
1359
+
1360
+ // Start at the root and steal to fix underfull nodes on the "right edge" of the tree.
1361
+ let root_index = levels. len ( ) - 1 ;
1362
+ let mut node = unsafe { levels. get_unchecked_mut ( root_index) . as_mut ( ) . unwrap ( ) } ;
1363
+
1364
+ loop {
1365
+ let mut temp_node = node;
1366
+ let index = temp_node. len ( ) - 1 ;
1367
+ let mut handle = match temp_node. kv_handle ( index) . force ( ) {
1368
+ ForceResult :: Internal ( h) => h,
1369
+ ForceResult :: Leaf ( _) => break ,
1370
+ } ;
1371
+
1372
+ // Check if we need to steal, i.e. is the length of the right edge less than
1373
+ // `minimum`?
1374
+ let right_len = handle. right_edge ( ) . node ( ) . len ( ) ;
1375
+ if right_len < minimum {
1376
+ // Steal!
1377
+ let num_steals = minimum - right_len;
1378
+ for _ in 0 ..num_steals {
1379
+ // `unsafe` is needed for stealing.
1380
+ unsafe {
1381
+ handle. steal_rightward ( ) ;
1382
+ }
1383
+ }
1384
+ }
1385
+
1386
+ // Go down the right edge.
1387
+ node = handle. into_right_edge ( ) . into_edge_mut ( ) ;
1388
+ }
1389
+ }
1390
+
1391
+ // Get root node from `levels`.
1392
+ let root = match levels. pop ( ) {
1393
+ Some ( option) => option,
1394
+ _ => None ,
1395
+ } ;
1396
+
1397
+ // Return (length, depth, root_node).
1398
+ ( length, levels. len ( ) , root)
1399
+ }
1400
+ }
1401
+
1233
1402
// Private implementation details
1234
1403
impl < K , V > Node < K , V > {
1235
1404
/// Node is full, so split it into two nodes, and yield the middle-most key-value pair
0 commit comments