File tree 2 files changed +56
-0
lines changed
2 files changed +56
-0
lines changed Original file line number Diff line number Diff line change @@ -1237,6 +1237,43 @@ macro_rules! iterator {
1237
1237
}
1238
1238
accum
1239
1239
}
1240
+
1241
+ #[ inline]
1242
+ #[ rustc_inherit_overflow_checks]
1243
+ fn position<P >( & mut self , mut predicate: P ) -> Option <usize > where
1244
+ Self : Sized ,
1245
+ P : FnMut ( Self :: Item ) -> bool ,
1246
+ {
1247
+ // The addition might panic on overflow
1248
+ let n = self . len( ) ;
1249
+ self . try_fold( 0 , move |i, x| {
1250
+ if predicate( x) { Err ( i) }
1251
+ else { Ok ( i + 1 ) }
1252
+ } ) . err( )
1253
+ . map( |i| {
1254
+ unsafe { assume( i < n) } ;
1255
+ i
1256
+ } )
1257
+ }
1258
+
1259
+ #[ inline]
1260
+ fn rposition<P >( & mut self , mut predicate: P ) -> Option <usize > where
1261
+ P : FnMut ( Self :: Item ) -> bool ,
1262
+ Self : Sized + ExactSizeIterator + DoubleEndedIterator
1263
+ {
1264
+ // No need for an overflow check here, because `ExactSizeIterator`
1265
+ // implies that the number of elements fits into a `usize`.
1266
+ let n = self . len( ) ;
1267
+ self . try_rfold( n, move |i, x| {
1268
+ let i = i - 1 ;
1269
+ if predicate( x) { Err ( i) }
1270
+ else { Ok ( i) }
1271
+ } ) . err( )
1272
+ . map( |i| {
1273
+ unsafe { assume( i < n) } ;
1274
+ i
1275
+ } )
1276
+ }
1240
1277
}
1241
1278
1242
1279
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
Original file line number Diff line number Diff line change 10
10
11
11
use core:: result:: Result :: { Ok , Err } ;
12
12
13
+
14
+ #[ test]
15
+ fn test_position ( ) {
16
+ let b = [ 1 , 2 , 3 , 5 , 5 ] ;
17
+ assert ! ( b. iter( ) . position( |& v| v == 9 ) == None ) ;
18
+ assert ! ( b. iter( ) . position( |& v| v == 5 ) == Some ( 3 ) ) ;
19
+ assert ! ( b. iter( ) . position( |& v| v == 3 ) == Some ( 2 ) ) ;
20
+ assert ! ( b. iter( ) . position( |& v| v == 0 ) == None ) ;
21
+ }
22
+
23
+ #[ test]
24
+ fn test_rposition ( ) {
25
+ let b = [ 1 , 2 , 3 , 5 , 5 ] ;
26
+ assert ! ( b. iter( ) . rposition( |& v| v == 9 ) == None ) ;
27
+ assert ! ( b. iter( ) . rposition( |& v| v == 5 ) == Some ( 4 ) ) ;
28
+ assert ! ( b. iter( ) . rposition( |& v| v == 3 ) == Some ( 2 ) ) ;
29
+ assert ! ( b. iter( ) . rposition( |& v| v == 0 ) == None ) ;
30
+ }
31
+
13
32
#[ test]
14
33
fn test_binary_search ( ) {
15
34
let b: [ i32 ; 0 ] = [ ] ;
You can’t perform that action at this time.
0 commit comments