@@ -9,7 +9,6 @@ use core::ops::{Index, RangeBounds};
99use core:: ptr;
1010
1111use super :: borrow:: DormantMutRef ;
12- use super :: merge_iter:: MergeIterInner ;
1312use super :: node:: { self , marker, ForceResult :: * , Handle , NodeRef } ;
1413use super :: search:: { self , SearchResult :: * } ;
1514use super :: unwrap_unchecked;
@@ -458,9 +457,6 @@ impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for RangeMut<'_, K, V> {
458457 }
459458}
460459
461- // An iterator for merging two sorted sequences into one
462- struct MergeIter < K , V , I : Iterator < Item = ( K , V ) > > ( MergeIterInner < I > ) ;
463-
464460impl < K : Ord , V > BTreeMap < K , V > {
465461 /// Makes a new empty BTreeMap.
466462 ///
@@ -908,13 +904,10 @@ impl<K: Ord, V> BTreeMap<K, V> {
908904 return ;
909905 }
910906
911- // First, we merge `self` and `other` into a sorted sequence in linear time.
912907 let self_iter = mem:: take ( self ) . into_iter ( ) ;
913908 let other_iter = mem:: take ( other) . into_iter ( ) ;
914- let iter = MergeIter ( MergeIterInner :: new ( self_iter, other_iter) ) ;
915-
916- // Second, we build a tree from the sorted sequence in linear time.
917- self . from_sorted_iter ( iter) ;
909+ let root = BTreeMap :: ensure_is_owned ( & mut self . root ) ;
910+ root. append_from_sorted_iters ( self_iter, other_iter, & mut self . length )
918911 }
919912
920913 /// Constructs a double-ended iterator over a sub-range of elements in the map.
@@ -1039,78 +1032,6 @@ impl<K: Ord, V> BTreeMap<K, V> {
10391032 }
10401033 }
10411034
1042- fn from_sorted_iter < I : Iterator < Item = ( K , V ) > > ( & mut self , iter : I ) {
1043- let root = Self :: ensure_is_owned ( & mut self . root ) ;
1044- let mut cur_node = root. node_as_mut ( ) . last_leaf_edge ( ) . into_node ( ) ;
1045- // Iterate through all key-value pairs, pushing them into nodes at the right level.
1046- for ( key, value) in iter {
1047- // Try to push key-value pair into the current leaf node.
1048- if cur_node. len ( ) < node:: CAPACITY {
1049- cur_node. push ( key, value) ;
1050- } else {
1051- // No space left, go up and push there.
1052- let mut open_node;
1053- let mut test_node = cur_node. forget_type ( ) ;
1054- loop {
1055- match test_node. ascend ( ) {
1056- Ok ( parent) => {
1057- let parent = parent. into_node ( ) ;
1058- if parent. len ( ) < node:: CAPACITY {
1059- // Found a node with space left, push here.
1060- open_node = parent;
1061- break ;
1062- } else {
1063- // Go up again.
1064- test_node = parent. forget_type ( ) ;
1065- }
1066- }
1067- Err ( _) => {
1068- // We are at the top, create a new root node and push there.
1069- open_node = root. push_internal_level ( ) ;
1070- break ;
1071- }
1072- }
1073- }
1074-
1075- // Push key-value pair and new right subtree.
1076- let tree_height = open_node. height ( ) - 1 ;
1077- let mut right_tree = node:: Root :: new_leaf ( ) ;
1078- for _ in 0 ..tree_height {
1079- right_tree. push_internal_level ( ) ;
1080- }
1081- open_node. push ( key, value, right_tree) ;
1082-
1083- // Go down to the right-most leaf again.
1084- cur_node = open_node. forget_type ( ) . last_leaf_edge ( ) . into_node ( ) ;
1085- }
1086-
1087- self . length += 1 ;
1088- }
1089- Self :: fix_right_edge ( root)
1090- }
1091-
1092- fn fix_right_edge ( root : & mut node:: Root < K , V > ) {
1093- // Handle underfull nodes, start from the top.
1094- let mut cur_node = root. node_as_mut ( ) ;
1095- while let Internal ( internal) = cur_node. force ( ) {
1096- // Check if right-most child is underfull.
1097- let mut last_edge = internal. last_edge ( ) ;
1098- let right_child_len = last_edge. reborrow ( ) . descend ( ) . len ( ) ;
1099- if right_child_len < MIN_LEN {
1100- // We need to steal.
1101- let mut last_kv = match last_edge. left_kv ( ) {
1102- Ok ( left) => left,
1103- Err ( _) => unreachable ! ( ) ,
1104- } ;
1105- last_kv. bulk_steal_left ( MIN_LEN - right_child_len) ;
1106- last_edge = last_kv. right_edge ( ) ;
1107- }
1108-
1109- // Go further down.
1110- cur_node = last_edge. descend ( ) ;
1111- }
1112- }
1113-
11141035 /// Splits the collection into two at the given key. Returns everything after the given key,
11151036 /// including the key.
11161037 ///
@@ -2220,18 +2141,5 @@ impl<K, V> BTreeMap<K, V> {
22202141 }
22212142}
22222143
2223- impl < K : Ord , V , I > Iterator for MergeIter < K , V , I >
2224- where
2225- I : Iterator < Item = ( K , V ) > + ExactSizeIterator + FusedIterator ,
2226- {
2227- type Item = ( K , V ) ;
2228-
2229- /// If two keys are equal, returns the key/value-pair from the right source.
2230- fn next ( & mut self ) -> Option < ( K , V ) > {
2231- let ( a_next, b_next) = self . 0 . nexts ( |a : & ( K , V ) , b : & ( K , V ) | K :: cmp ( & a. 0 , & b. 0 ) ) ;
2232- b_next. or ( a_next)
2233- }
2234- }
2235-
22362144#[ cfg( test) ]
22372145mod tests;
0 commit comments