@@ -1698,75 +1698,58 @@ pub fn overlapping<T>(ranges: &[SpannedRange<T>]) -> Option<(&SpannedRange<T>, &
1698
1698
where
1699
1699
T : Copy + Ord ,
1700
1700
{
1701
- #[ derive( Copy , Clone , Debug , Eq , PartialEq ) ]
1702
- enum Kind < ' a , T > {
1703
- Start ( T , & ' a SpannedRange < T > ) ,
1704
- End ( EndBound < T > , & ' a SpannedRange < T > ) ,
1701
+ #[ derive( Copy , Clone , Debug , Eq , Ord , PartialEq , PartialOrd ) ]
1702
+ enum BoundKind {
1703
+ EndExcluded ,
1704
+ Start ,
1705
+ EndIncluded ,
1705
1706
}
1706
1707
1707
- impl < ' a , T : Copy > Kind < ' a , T > {
1708
- fn value ( self ) -> T {
1709
- match self {
1710
- Kind :: Start ( t, _) | Kind :: End ( EndBound :: Included ( t) | EndBound :: Excluded ( t) , _) => t,
1711
- }
1712
- }
1713
- }
1708
+ #[ derive( Copy , Clone , Debug , Eq , PartialEq ) ]
1709
+ struct RangeBound < ' a , T > ( T , BoundKind , & ' a SpannedRange < T > ) ;
1714
1710
1715
- impl < ' a , T : Copy + Ord > PartialOrd for Kind < ' a , T > {
1711
+ impl < ' a , T : Copy + Ord > PartialOrd for RangeBound < ' a , T > {
1716
1712
fn partial_cmp ( & self , other : & Self ) -> Option < Ordering > {
1717
1713
Some ( self . cmp ( other) )
1718
1714
}
1719
1715
}
1720
1716
1721
- impl < ' a , T : Copy + Ord > Ord for Kind < ' a , T > {
1722
- fn cmp ( & self , other : & Self ) -> Ordering {
1723
- match self . value ( ) . cmp ( & other. value ( ) ) {
1724
- Ordering :: Equal => match ( self , other) {
1725
- // End excluded before start and end included
1726
- ( Kind :: End ( EndBound :: Excluded ( _) , _) , Kind :: Start ( ..) | Kind :: End ( EndBound :: Included ( _) , _) ) => {
1727
- Ordering :: Less
1728
- } ,
1729
- ( Kind :: Start ( ..) | Kind :: End ( EndBound :: Included ( _) , _) , Kind :: End ( EndBound :: Excluded ( _) , _) ) => {
1730
- Ordering :: Greater
1731
- } ,
1732
-
1733
- // Start before end included
1734
- ( Kind :: Start ( ..) , Kind :: End ( EndBound :: Included ( _) , _) ) => Ordering :: Less ,
1735
- ( Kind :: End ( EndBound :: Included ( _) , _) , Kind :: Start ( ..) ) => Ordering :: Greater ,
1736
-
1737
- _ => Ordering :: Equal ,
1738
- } ,
1739
- other => other,
1740
- }
1717
+ impl < ' a , T : Copy + Ord > Ord for RangeBound < ' a , T > {
1718
+ fn cmp ( & self , RangeBound ( other_value, other_kind, _) : & Self ) -> Ordering {
1719
+ let RangeBound ( self_value, self_kind, _) = * self ;
1720
+ ( self_value, self_kind) . cmp ( & ( * other_value, * other_kind) )
1741
1721
}
1742
1722
}
1743
1723
1744
1724
let mut values = Vec :: with_capacity ( 2 * ranges. len ( ) ) ;
1745
1725
1746
- for r in ranges {
1747
- values. push ( Kind :: Start ( r. node . 0 , r) ) ;
1748
- values. push ( Kind :: End ( r. node . 1 , r) ) ;
1726
+ for r @ SpannedRange { node : ( start, end) , .. } in ranges {
1727
+ values. push ( RangeBound ( * start, BoundKind :: Start , r) ) ;
1728
+ values. push ( match end {
1729
+ EndBound :: Excluded ( val) => RangeBound ( * val, BoundKind :: EndExcluded , r) ,
1730
+ EndBound :: Included ( val) => RangeBound ( * val, BoundKind :: EndIncluded , r) ,
1731
+ } ) ;
1749
1732
}
1750
1733
1751
1734
values. sort ( ) ;
1752
1735
1753
1736
let mut started = vec ! [ ] ;
1754
1737
1755
- for value in values {
1756
- match value {
1757
- Kind :: Start ( _ , r ) => started. push ( r) ,
1758
- Kind :: End ( _ , er ) => {
1738
+ for RangeBound ( _ , kind , r ) in values {
1739
+ match kind {
1740
+ BoundKind :: Start => started. push ( r) ,
1741
+ BoundKind :: EndExcluded | BoundKind :: EndIncluded => {
1759
1742
let mut overlap = None ;
1760
1743
1761
1744
while let Some ( sr) = started. pop ( ) {
1762
- if sr == er {
1745
+ if sr == r {
1763
1746
break ;
1764
1747
}
1765
1748
overlap = Some ( sr) ;
1766
1749
}
1767
1750
1768
1751
if let Some ( sr) = overlap {
1769
- return Some ( ( er , sr) ) ;
1752
+ return Some ( ( r , sr) ) ;
1770
1753
}
1771
1754
} ,
1772
1755
}
0 commit comments