@@ -409,6 +409,48 @@ impl<K: Ord + Clone, V> MarkMap<K, V> {
409409 Ok ( ( ) )
410410 }
411411
412+ /// Similar to `merge_from` except the `MergeBehavior` of self is used when merging into `*other*`.
413+ #[ doc( hidden) ]
414+ pub fn merge_into ( mut self , other : & ' _ mut Self ) -> Result < ( ) , MergeError < K , Box < V > > > {
415+ for ( src_key, src_mark, src_val) in self . contents . drain ( ..) {
416+ let pos = other. contents . binary_search_by ( |x| x. 0 . cmp ( & src_key) ) ;
417+ match pos {
418+ Ok ( pos) => {
419+ let ( _, dest_mark, dest_val) = & mut other. contents [ pos] ;
420+ let theirs_mark = Mark :: MergeBehavior ( MergeBehavior :: Theirs ) . repr ( ) ;
421+ let ours_mark = Mark :: MergeBehavior ( MergeBehavior :: Ours ) . repr ( ) ;
422+ let exclusive_mark =
423+ Mark :: MergeBehavior ( MergeBehavior :: MutuallyExclusive ) . repr ( ) ;
424+ let merge_behavior = ( src_mark & exclusive_mark)
425+ | ( src_mark & ours_mark)
426+ | ( src_mark & theirs_mark) ;
427+ if merge_behavior == exclusive_mark || merge_behavior == 0 {
428+ // If only clippy could convince me and the borrow checker this is actually unnecessary.
429+ #[ allow( clippy:: unnecessary_unwrap) ]
430+ if src_val. is_some ( ) && dest_val. is_some ( ) {
431+ return Err ( MergeError :: Exclusivity (
432+ src_key,
433+ Box :: new ( src_val. unwrap ( ) ) ,
434+ ) ) ;
435+ } else if dest_val. is_none ( ) {
436+ * dest_val = src_val;
437+ }
438+ } else if merge_behavior == ours_mark && src_val. is_some ( )
439+ || merge_behavior == theirs_mark && dest_val. is_none ( )
440+ {
441+ * dest_mark = src_mark;
442+ * dest_val = src_val;
443+ }
444+ }
445+ Err ( pos) => {
446+ other. contents
447+ . insert ( pos, ( src_key, src_mark, src_val) ) ;
448+ }
449+ }
450+ }
451+ Ok ( ( ) )
452+ }
453+
412454 /// Returns whether `key` has been marked as used.
413455 #[ doc( hidden) ]
414456 pub fn is_used < Q > ( & self , key : & Q ) -> bool
0 commit comments