@@ -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