@@ -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/// ``` 
539592fn  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