@@ -27,6 +27,7 @@ use core::ptr::Unique;
2727use  core:: { slice,  mem,  ptr,  cmp,  raw} ; 
2828use  alloc:: heap:: { self ,  EMPTY } ; 
2929
30+ use  vec:: Vec ; 
3031use  borrow:: Borrow ; 
3132
3233/// 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
904905            marker :  PhantomData , 
905906        } 
906907    } 
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+     } 
907919} 
908920
909921impl < ' 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> {
12301242    } 
12311243} 
12321244
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+ 
12331402// Private implementation details 
12341403impl < K ,  V >  Node < K ,  V >  { 
12351404    /// Node is full, so split it into two nodes, and yield the middle-most key-value pair 
0 commit comments