@@ -427,39 +427,35 @@ impl<T, A: Allocator + Clone> BTreeSet<T, A> {
427427 where
428428 T : Ord ,
429429 {
430- let ( self_min, self_max) =
431- if let ( Some ( self_min) , Some ( self_max) ) = ( self . first ( ) , self . last ( ) ) {
432- ( self_min, self_max)
433- } else {
434- return Difference { inner : DifferenceInner :: Iterate ( self . iter ( ) ) } ;
435- } ;
436- let ( other_min, other_max) =
437- if let ( Some ( other_min) , Some ( other_max) ) = ( other. first ( ) , other. last ( ) ) {
438- ( other_min, other_max)
439- } else {
440- return Difference { inner : DifferenceInner :: Iterate ( self . iter ( ) ) } ;
441- } ;
442- Difference {
443- inner : match ( self_min. cmp ( other_max) , self_max. cmp ( other_min) ) {
444- ( Greater , _) | ( _, Less ) => DifferenceInner :: Iterate ( self . iter ( ) ) ,
445- ( Equal , _) => {
446- let mut self_iter = self . iter ( ) ;
447- self_iter. next ( ) ;
448- DifferenceInner :: Iterate ( self_iter)
449- }
450- ( _, Equal ) => {
451- let mut self_iter = self . iter ( ) ;
452- self_iter. next_back ( ) ;
453- DifferenceInner :: Iterate ( self_iter)
454- }
455- _ if self . len ( ) <= other. len ( ) / ITER_PERFORMANCE_TIPPING_SIZE_DIFF => {
456- DifferenceInner :: Search { self_iter : self . iter ( ) , other_set : other }
457- }
458- _ => DifferenceInner :: Stitch {
459- self_iter : self . iter ( ) ,
460- other_iter : other. iter ( ) . peekable ( ) ,
430+ if let Some ( self_min) = self . first ( )
431+ && let Some ( self_max) = self . last ( )
432+ && let Some ( other_min) = other. first ( )
433+ && let Some ( other_max) = other. last ( )
434+ {
435+ Difference {
436+ inner : match ( self_min. cmp ( other_max) , self_max. cmp ( other_min) ) {
437+ ( Greater , _) | ( _, Less ) => DifferenceInner :: Iterate ( self . iter ( ) ) ,
438+ ( Equal , _) => {
439+ let mut self_iter = self . iter ( ) ;
440+ self_iter. next ( ) ;
441+ DifferenceInner :: Iterate ( self_iter)
442+ }
443+ ( _, Equal ) => {
444+ let mut self_iter = self . iter ( ) ;
445+ self_iter. next_back ( ) ;
446+ DifferenceInner :: Iterate ( self_iter)
447+ }
448+ _ if self . len ( ) <= other. len ( ) / ITER_PERFORMANCE_TIPPING_SIZE_DIFF => {
449+ DifferenceInner :: Search { self_iter : self . iter ( ) , other_set : other }
450+ }
451+ _ => DifferenceInner :: Stitch {
452+ self_iter : self . iter ( ) ,
453+ other_iter : other. iter ( ) . peekable ( ) ,
454+ } ,
461455 } ,
462- } ,
456+ }
457+ } else {
458+ Difference { inner : DifferenceInner :: Iterate ( self . iter ( ) ) }
463459 }
464460 }
465461
@@ -519,31 +515,27 @@ impl<T, A: Allocator + Clone> BTreeSet<T, A> {
519515 where
520516 T : Ord ,
521517 {
522- let ( self_min, self_max) =
523- if let ( Some ( self_min) , Some ( self_max) ) = ( self . first ( ) , self . last ( ) ) {
524- ( self_min, self_max)
525- } else {
526- return Intersection { inner : IntersectionInner :: Answer ( None ) } ;
527- } ;
528- let ( other_min, other_max) =
529- if let ( Some ( other_min) , Some ( other_max) ) = ( other. first ( ) , other. last ( ) ) {
530- ( other_min, other_max)
531- } else {
532- return Intersection { inner : IntersectionInner :: Answer ( None ) } ;
533- } ;
534- Intersection {
535- inner : match ( self_min. cmp ( other_max) , self_max. cmp ( other_min) ) {
536- ( Greater , _) | ( _, Less ) => IntersectionInner :: Answer ( None ) ,
537- ( Equal , _) => IntersectionInner :: Answer ( Some ( self_min) ) ,
538- ( _, Equal ) => IntersectionInner :: Answer ( Some ( self_max) ) ,
539- _ if self . len ( ) <= other. len ( ) / ITER_PERFORMANCE_TIPPING_SIZE_DIFF => {
540- IntersectionInner :: Search { small_iter : self . iter ( ) , large_set : other }
541- }
542- _ if other. len ( ) <= self . len ( ) / ITER_PERFORMANCE_TIPPING_SIZE_DIFF => {
543- IntersectionInner :: Search { small_iter : other. iter ( ) , large_set : self }
544- }
545- _ => IntersectionInner :: Stitch { a : self . iter ( ) , b : other. iter ( ) } ,
546- } ,
518+ if let Some ( self_min) = self . first ( )
519+ && let Some ( self_max) = self . last ( )
520+ && let Some ( other_min) = other. first ( )
521+ && let Some ( other_max) = other. last ( )
522+ {
523+ Intersection {
524+ inner : match ( self_min. cmp ( other_max) , self_max. cmp ( other_min) ) {
525+ ( Greater , _) | ( _, Less ) => IntersectionInner :: Answer ( None ) ,
526+ ( Equal , _) => IntersectionInner :: Answer ( Some ( self_min) ) ,
527+ ( _, Equal ) => IntersectionInner :: Answer ( Some ( self_max) ) ,
528+ _ if self . len ( ) <= other. len ( ) / ITER_PERFORMANCE_TIPPING_SIZE_DIFF => {
529+ IntersectionInner :: Search { small_iter : self . iter ( ) , large_set : other }
530+ }
531+ _ if other. len ( ) <= self . len ( ) / ITER_PERFORMANCE_TIPPING_SIZE_DIFF => {
532+ IntersectionInner :: Search { small_iter : other. iter ( ) , large_set : self }
533+ }
534+ _ => IntersectionInner :: Stitch { a : self . iter ( ) , b : other. iter ( ) } ,
535+ } ,
536+ }
537+ } else {
538+ Intersection { inner : IntersectionInner :: Answer ( None ) }
547539 }
548540 }
549541
@@ -694,55 +686,56 @@ impl<T, A: Allocator + Clone> BTreeSet<T, A> {
694686 // Same result as self.difference(other).next().is_none()
695687 // but the code below is faster (hugely in some cases).
696688 if self . len ( ) > other. len ( ) {
697- return false ;
689+ return false ; // self has more elements than other
698690 }
699- let ( self_min, self_max) =
700- if let ( Some ( self_min) , Some ( self_max) ) = ( self . first ( ) , self . last ( ) ) {
701- ( self_min, self_max)
702- } else {
703- return true ; // self is empty
704- } ;
705- let ( other_min, other_max) =
706- if let ( Some ( other_min) , Some ( other_max) ) = ( other. first ( ) , other. last ( ) ) {
707- ( other_min, other_max)
708- } else {
709- return false ; // other is empty
710- } ;
691+ let ( Some ( self_min) , Some ( self_max) ) = ( self . first ( ) , self . last ( ) ) else {
692+ return true ; // self is empty
693+ } ;
694+ let ( Some ( other_min) , Some ( other_max) ) = ( other. first ( ) , other. last ( ) ) else {
695+ return false ; // other is empty
696+ } ;
711697 let mut self_iter = self . iter ( ) ;
712698 match self_min. cmp ( other_min) {
713- Less => return false ,
699+ Less => return false , // other does not contain self_min
714700 Equal => {
715- self_iter. next ( ) ;
701+ self_iter. next ( ) ; // self_min is contained in other, so remove it from consideration
702+ // other_min is now not in self_iter (used below)
716703 }
717- Greater => ( ) ,
718- }
704+ Greater => { } // other_min is not in self_iter (used below)
705+ } ;
706+
719707 match self_max. cmp ( other_max) {
720- Greater => return false ,
708+ Greater => return false , // other does not contain self_max
721709 Equal => {
722- self_iter. next_back ( ) ;
710+ self_iter. next_back ( ) ; // self_max is contained in other, so remove it from consideration
711+ // other_max is now not in self_iter (used below)
723712 }
724- Less => ( ) ,
725- }
713+ Less => { } // other_max is not in self_iter (used below)
714+ } ;
726715 if self_iter. len ( ) <= other. len ( ) / ITER_PERFORMANCE_TIPPING_SIZE_DIFF {
727- for next in self_iter {
728- if !other. contains ( next) {
729- return false ;
730- }
731- }
716+ self_iter. all ( |e| other. contains ( e) )
732717 } else {
733718 let mut other_iter = other. iter ( ) ;
734- other_iter. next ( ) ;
735- other_iter. next_back ( ) ;
736- let mut self_next = self_iter. next ( ) ;
737- while let Some ( self1) = self_next {
738- match other_iter. next ( ) . map_or ( Less , |other1| self1. cmp ( other1) ) {
739- Less => return false ,
740- Equal => self_next = self_iter. next ( ) ,
741- Greater => ( ) ,
742- }
719+ {
720+ // remove other_min and other_max as they are not in self_iter (see above)
721+ other_iter. next ( ) ;
722+ other_iter. next_back ( ) ;
743723 }
724+ // custom `self_iter.all(|e| other.contains(e))`
725+ self_iter. all ( |self1| {
726+ while let Some ( other1) = other_iter. next ( ) {
727+ match other1. cmp ( self1) {
728+ // happens up to `ITER_PERFORMANCE_TIPPING_SIZE_DIFF * self.len() - 1` times
729+ Less => continue , // skip over elements that are smaller
730+ // happens `self.len()` times
731+ Equal => return true , // self1 is in other
732+ // happens only once
733+ Greater => return false , // self1 is not in other
734+ }
735+ }
736+ false
737+ } )
744738 }
745- true
746739 }
747740
748741 /// Returns `true` if the set is a superset of another,
0 commit comments