@@ -100,17 +100,28 @@ impl<Idx: PartialOrd<Idx>> Range<Idx> {
100
100
/// ```
101
101
/// #![feature(range_contains)]
102
102
///
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;
107
104
///
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));
110
117
/// ```
111
118
#[ 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)
114
125
}
115
126
116
127
/// Returns `true` if the range contains no items.
@@ -179,7 +190,6 @@ impl<Idx: fmt::Debug> fmt::Debug for RangeFrom<Idx> {
179
190
}
180
191
}
181
192
182
- #[ unstable( feature = "range_contains" , reason = "recently added as per RFC" , issue = "32311" ) ]
183
193
impl < Idx : PartialOrd < Idx > > RangeFrom < Idx > {
184
194
/// Returns `true` if `item` is contained in the range.
185
195
///
@@ -188,12 +198,23 @@ impl<Idx: PartialOrd<Idx>> RangeFrom<Idx> {
188
198
/// ```
189
199
/// #![feature(range_contains)]
190
200
///
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));
194
210
/// ```
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)
197
218
}
198
219
}
199
220
@@ -250,7 +271,6 @@ impl<Idx: fmt::Debug> fmt::Debug for RangeTo<Idx> {
250
271
}
251
272
}
252
273
253
- #[ unstable( feature = "range_contains" , reason = "recently added as per RFC" , issue = "32311" ) ]
254
274
impl < Idx : PartialOrd < Idx > > RangeTo < Idx > {
255
275
/// Returns `true` if `item` is contained in the range.
256
276
///
@@ -259,12 +279,23 @@ impl<Idx: PartialOrd<Idx>> RangeTo<Idx> {
259
279
/// ```
260
280
/// #![feature(range_contains)]
261
281
///
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));
265
291
/// ```
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)
268
299
}
269
300
}
270
301
@@ -318,18 +349,29 @@ impl<Idx: PartialOrd<Idx>> RangeInclusive<Idx> {
318
349
/// ```
319
350
/// #![feature(range_contains)]
320
351
///
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));
326
359
///
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));
329
367
/// ```
330
368
#[ 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)
333
375
}
334
376
335
377
/// Returns `true` if the range contains no items.
@@ -431,12 +473,23 @@ impl<Idx: PartialOrd<Idx>> RangeToInclusive<Idx> {
431
473
/// ```
432
474
/// #![feature(range_contains)]
433
475
///
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));
437
485
/// ```
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)
440
493
}
441
494
}
442
495
@@ -537,6 +590,42 @@ pub trait RangeBounds<T: ?Sized> {
537
590
/// # }
538
591
/// ```
539
592
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
+ }
540
629
}
541
630
542
631
use self :: Bound :: { Excluded , Included , Unbounded } ;
0 commit comments