@@ -2,14 +2,13 @@ use core::borrow::Borrow;
2
2
use core:: cmp:: Ordering ;
3
3
use core:: fmt:: { self , Debug } ;
4
4
use core:: hash:: { Hash , Hasher } ;
5
- use core:: iter:: { FromIterator , FusedIterator } ;
5
+ use core:: iter:: { FromIterator , FusedIterator , Peekable } ;
6
6
use core:: marker:: PhantomData ;
7
7
use core:: mem:: { self , ManuallyDrop } ;
8
8
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;
@@ -459,7 +458,10 @@ impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for RangeMut<'_, K, V> {
459
458
}
460
459
461
460
// An iterator for merging two sorted sequences into one
462
- struct MergeIter < K , V , I : Iterator < Item = ( K , V ) > > ( MergeIterInner < I > ) ;
461
+ struct MergeIter < K , V , I : Iterator < Item = ( K , V ) > > {
462
+ left : Peekable < I > ,
463
+ right : Peekable < I > ,
464
+ }
463
465
464
466
impl < K : Ord , V > BTreeMap < K , V > {
465
467
/// Makes a new empty BTreeMap.
@@ -911,7 +913,7 @@ impl<K: Ord, V> BTreeMap<K, V> {
911
913
// First, we merge `self` and `other` into a sorted sequence in linear time.
912
914
let self_iter = mem:: take ( self ) . into_iter ( ) ;
913
915
let other_iter = mem:: take ( other) . into_iter ( ) ;
914
- let iter = MergeIter ( MergeIterInner :: new ( self_iter, other_iter) ) ;
916
+ let iter = MergeIter { left : self_iter. peekable ( ) , right : other_iter. peekable ( ) } ;
915
917
916
918
// Second, we build a tree from the sorted sequence in linear time.
917
919
self . from_sorted_iter ( iter) ;
@@ -2224,10 +2226,24 @@ where
2224
2226
{
2225
2227
type Item = ( K , V ) ;
2226
2228
2227
- /// If two keys are equal, returns the key/value-pair from the right source.
2228
2229
fn next ( & mut self ) -> Option < ( K , V ) > {
2229
- let ( a_next, b_next) = self . 0 . nexts ( |a : & ( K , V ) , b : & ( K , V ) | K :: cmp ( & a. 0 , & b. 0 ) ) ;
2230
- b_next. or ( a_next)
2230
+ let res = match ( self . left . peek ( ) , self . right . peek ( ) ) {
2231
+ ( Some ( & ( ref left_key, _) ) , Some ( & ( ref right_key, _) ) ) => left_key. cmp ( right_key) ,
2232
+ ( Some ( _) , None ) => Ordering :: Less ,
2233
+ ( None , Some ( _) ) => Ordering :: Greater ,
2234
+ ( None , None ) => return None ,
2235
+ } ;
2236
+
2237
+ // Check which elements comes first and only advance the corresponding iterator.
2238
+ // If two keys are equal, take the value from `right`.
2239
+ match res {
2240
+ Ordering :: Less => self . left . next ( ) ,
2241
+ Ordering :: Greater => self . right . next ( ) ,
2242
+ Ordering :: Equal => {
2243
+ self . left . next ( ) ;
2244
+ self . right . next ( )
2245
+ }
2246
+ }
2231
2247
}
2232
2248
}
2233
2249
0 commit comments