File tree Expand file tree Collapse file tree 2 files changed +56
-0
lines changed
Expand file tree Collapse file tree 2 files changed +56
-0
lines changed Original file line number Diff line number Diff line change @@ -1237,6 +1237,43 @@ macro_rules! iterator {
12371237 }
12381238 accum
12391239 }
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+ }
12401277 }
12411278
12421279 #[ stable( feature = "rust1" , since = "1.0.0" ) ]
Original file line number Diff line number Diff line change 1010
1111use core:: result:: Result :: { Ok , Err } ;
1212
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+
1332#[ test]
1433fn test_binary_search ( ) {
1534 let b: [ i32 ; 0 ] = [ ] ;
You can’t perform that action at this time.
0 commit comments