@@ -100,17 +100,28 @@ impl<Idx: PartialOrd<Idx>> Range<Idx> {
100100 /// ```
101101 /// #![feature(range_contains)]
102102 ///
103- /// assert!(!(3..5).contains(2));
104- /// assert!( (3..5).contains(3));
105- /// assert!( (3..5).contains(4));
106- /// assert!(!(3..5).contains(5));
103+ /// use std::f32;
107104 ///
108- /// assert!(!(3..3).contains(3));
109- /// assert!(!(3..2).contains(3));
105+ /// assert!(!(3..5).contains(&2));
106+ /// assert!( (3..5).contains(&3));
107+ /// assert!( (3..5).contains(&4));
108+ /// assert!(!(3..5).contains(&5));
109+ ///
110+ /// assert!(!(3..3).contains(&3));
111+ /// assert!(!(3..2).contains(&3));
112+ ///
113+ /// assert!( (0.0..1.0).contains(&0.5));
114+ /// assert!(!(0.0..1.0).contains(&f32::NAN));
115+ /// assert!(!(0.0..f32::NAN).contains(&0.5));
116+ /// assert!(!(f32::NAN..1.0).contains(&0.5));
110117 /// ```
111118 #[ unstable( feature = "range_contains" , reason = "recently added as per RFC" , issue = "32311" ) ]
112- pub fn contains ( & self , item : Idx ) -> bool {
113- ( self . start <= item) && ( item < self . end )
119+ pub fn contains < U > ( & self , item : & U ) -> bool
120+ where
121+ Idx : PartialOrd < U > ,
122+ U : ?Sized + PartialOrd < Idx > ,
123+ {
124+ <Self as RangeBounds < Idx > >:: contains ( self , item)
114125 }
115126
116127 /// Returns `true` if the range contains no items.
@@ -179,7 +190,6 @@ impl<Idx: fmt::Debug> fmt::Debug for RangeFrom<Idx> {
179190 }
180191}
181192
182- #[ unstable( feature = "range_contains" , reason = "recently added as per RFC" , issue = "32311" ) ]
183193impl < Idx : PartialOrd < Idx > > RangeFrom < Idx > {
184194 /// Returns `true` if `item` is contained in the range.
185195 ///
@@ -188,12 +198,23 @@ impl<Idx: PartialOrd<Idx>> RangeFrom<Idx> {
188198 /// ```
189199 /// #![feature(range_contains)]
190200 ///
191- /// assert!(!(3..).contains(2));
192- /// assert!( (3..).contains(3));
193- /// assert!( (3..).contains(1_000_000_000));
201+ /// use std::f32;
202+ ///
203+ /// assert!(!(3..).contains(&2));
204+ /// assert!( (3..).contains(&3));
205+ /// assert!( (3..).contains(&1_000_000_000));
206+ ///
207+ /// assert!( (0.0..).contains(&0.5));
208+ /// assert!(!(0.0..).contains(&f32::NAN));
209+ /// assert!(!(f32::NAN..).contains(&0.5));
194210 /// ```
195- pub fn contains ( & self , item : Idx ) -> bool {
196- ( self . start <= item)
211+ #[ unstable( feature = "range_contains" , reason = "recently added as per RFC" , issue = "32311" ) ]
212+ pub fn contains < U > ( & self , item : & U ) -> bool
213+ where
214+ Idx : PartialOrd < U > ,
215+ U : ?Sized + PartialOrd < Idx > ,
216+ {
217+ <Self as RangeBounds < Idx > >:: contains ( self , item)
197218 }
198219}
199220
@@ -250,7 +271,6 @@ impl<Idx: fmt::Debug> fmt::Debug for RangeTo<Idx> {
250271 }
251272}
252273
253- #[ unstable( feature = "range_contains" , reason = "recently added as per RFC" , issue = "32311" ) ]
254274impl < Idx : PartialOrd < Idx > > RangeTo < Idx > {
255275 /// Returns `true` if `item` is contained in the range.
256276 ///
@@ -259,12 +279,23 @@ impl<Idx: PartialOrd<Idx>> RangeTo<Idx> {
259279 /// ```
260280 /// #![feature(range_contains)]
261281 ///
262- /// assert!( (..5).contains(-1_000_000_000));
263- /// assert!( (..5).contains(4));
264- /// assert!(!(..5).contains(5));
282+ /// use std::f32;
283+ ///
284+ /// assert!( (..5).contains(&-1_000_000_000));
285+ /// assert!( (..5).contains(&4));
286+ /// assert!(!(..5).contains(&5));
287+ ///
288+ /// assert!( (..1.0).contains(&0.5));
289+ /// assert!(!(..1.0).contains(&f32::NAN));
290+ /// assert!(!(..f32::NAN).contains(&0.5));
265291 /// ```
266- pub fn contains ( & self , item : Idx ) -> bool {
267- ( item < self . end )
292+ #[ unstable( feature = "range_contains" , reason = "recently added as per RFC" , issue = "32311" ) ]
293+ pub fn contains < U > ( & self , item : & U ) -> bool
294+ where
295+ Idx : PartialOrd < U > ,
296+ U : ?Sized + PartialOrd < Idx > ,
297+ {
298+ <Self as RangeBounds < Idx > >:: contains ( self , item)
268299 }
269300}
270301
@@ -318,18 +349,29 @@ impl<Idx: PartialOrd<Idx>> RangeInclusive<Idx> {
318349 /// ```
319350 /// #![feature(range_contains)]
320351 ///
321- /// assert!(!(3..=5).contains(2));
322- /// assert!( (3..=5).contains(3));
323- /// assert!( (3..=5).contains(4));
324- /// assert!( (3..=5).contains(5));
325- /// assert!(!(3..=5).contains(6));
352+ /// use std::f32;
353+ ///
354+ /// assert!(!(3..=5).contains(&2));
355+ /// assert!( (3..=5).contains(&3));
356+ /// assert!( (3..=5).contains(&4));
357+ /// assert!( (3..=5).contains(&5));
358+ /// assert!(!(3..=5).contains(&6));
326359 ///
327- /// assert!( (3..=3).contains(3));
328- /// assert!(!(3..=2).contains(3));
360+ /// assert!( (3..=3).contains(&3));
361+ /// assert!(!(3..=2).contains(&3));
362+ ///
363+ /// assert!( (0.0..=1.0).contains(&1.0));
364+ /// assert!(!(0.0..=1.0).contains(&f32::NAN));
365+ /// assert!(!(0.0..=f32::NAN).contains(&0.0));
366+ /// assert!(!(f32::NAN..=1.0).contains(&1.0));
329367 /// ```
330368 #[ unstable( feature = "range_contains" , reason = "recently added as per RFC" , issue = "32311" ) ]
331- pub fn contains ( & self , item : Idx ) -> bool {
332- self . start <= item && item <= self . end
369+ pub fn contains < U > ( & self , item : & U ) -> bool
370+ where
371+ Idx : PartialOrd < U > ,
372+ U : ?Sized + PartialOrd < Idx > ,
373+ {
374+ <Self as RangeBounds < Idx > >:: contains ( self , item)
333375 }
334376
335377 /// Returns `true` if the range contains no items.
@@ -431,12 +473,23 @@ impl<Idx: PartialOrd<Idx>> RangeToInclusive<Idx> {
431473 /// ```
432474 /// #![feature(range_contains)]
433475 ///
434- /// assert!( (..=5).contains(-1_000_000_000));
435- /// assert!( (..=5).contains(5));
436- /// assert!(!(..=5).contains(6));
476+ /// use std::f32;
477+ ///
478+ /// assert!( (..=5).contains(&-1_000_000_000));
479+ /// assert!( (..=5).contains(&5));
480+ /// assert!(!(..=5).contains(&6));
481+ ///
482+ /// assert!( (..=1.0).contains(&1.0));
483+ /// assert!(!(..=1.0).contains(&f32::NAN));
484+ /// assert!(!(..=f32::NAN).contains(&0.5));
437485 /// ```
438- pub fn contains ( & self , item : Idx ) -> bool {
439- ( item <= self . end )
486+ #[ unstable( feature = "range_contains" , reason = "recently added as per RFC" , issue = "32311" ) ]
487+ pub fn contains < U > ( & self , item : & U ) -> bool
488+ where
489+ Idx : PartialOrd < U > ,
490+ U : ?Sized + PartialOrd < Idx > ,
491+ {
492+ <Self as RangeBounds < Idx > >:: contains ( self , item)
440493 }
441494}
442495
@@ -537,6 +590,42 @@ pub trait RangeBounds<T: ?Sized> {
537590 /// # }
538591 /// ```
539592 fn end ( & self ) -> Bound < & T > ;
593+
594+
595+ /// Returns `true` if `item` is contained in the range.
596+ ///
597+ /// # Examples
598+ ///
599+ /// ```
600+ /// #![feature(range_contains)]
601+ ///
602+ /// use std::f32;
603+ ///
604+ /// assert!( (3..5).contains(&4));
605+ /// assert!(!(3..5).contains(&2));
606+ ///
607+ /// assert!( (0.0..1.0).contains(&0.5));
608+ /// assert!(!(0.0..1.0).contains(&f32::NAN));
609+ /// assert!(!(0.0..f32::NAN).contains(&0.5));
610+ /// assert!(!(f32::NAN..1.0).contains(&0.5));
611+ #[ unstable( feature = "range_contains" , reason = "recently added as per RFC" , issue = "32311" ) ]
612+ fn contains < U > ( & self , item : & U ) -> bool
613+ where
614+ T : PartialOrd < U > ,
615+ U : ?Sized + PartialOrd < T > ,
616+ {
617+ ( match self . start ( ) {
618+ Included ( ref start) => * start <= item,
619+ Excluded ( ref start) => * start < item,
620+ Unbounded => true ,
621+ } )
622+ &&
623+ ( match self . end ( ) {
624+ Included ( ref end) => item <= * end,
625+ Excluded ( ref end) => item < * end,
626+ Unbounded => true ,
627+ } )
628+ }
540629}
541630
542631use self :: Bound :: { Excluded , Included , Unbounded } ;
0 commit comments