@@ -9,7 +9,6 @@ use core::ops::{Index, RangeBounds};
9
9
use core:: ptr;
10
10
11
11
use super :: borrow:: DormantMutRef ;
12
- use super :: merge_iter:: MergeIterInner ;
13
12
use super :: node:: { self , marker, ForceResult :: * , Handle , NodeRef } ;
14
13
use super :: search:: { self , SearchResult :: * } ;
15
14
use super :: unwrap_unchecked;
@@ -458,9 +457,6 @@ impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for RangeMut<'_, K, V> {
458
457
}
459
458
}
460
459
461
- // An iterator for merging two sorted sequences into one
462
- struct MergeIter < K , V , I : Iterator < Item = ( K , V ) > > ( MergeIterInner < I > ) ;
463
-
464
460
impl < K : Ord , V > BTreeMap < K , V > {
465
461
/// Makes a new empty BTreeMap.
466
462
///
@@ -908,13 +904,10 @@ impl<K: Ord, V> BTreeMap<K, V> {
908
904
return ;
909
905
}
910
906
911
- // First, we merge `self` and `other` into a sorted sequence in linear time.
912
907
let self_iter = mem:: take ( self ) . into_iter ( ) ;
913
908
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 )
918
911
}
919
912
920
913
/// 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> {
1039
1032
}
1040
1033
}
1041
1034
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
-
1114
1035
/// Splits the collection into two at the given key. Returns everything after the given key,
1115
1036
/// including the key.
1116
1037
///
@@ -2220,18 +2141,5 @@ impl<K, V> BTreeMap<K, V> {
2220
2141
}
2221
2142
}
2222
2143
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
-
2236
2144
#[ cfg( test) ]
2237
2145
mod tests;
0 commit comments