38
38
//! just a required `next` method, operations like `filter` would be impossible to define.
39
39
#![ doc( html_root_url = "https://docs.rs/streaming-iterator/0.1" ) ]
40
40
#![ warn( missing_docs) ]
41
+ // for compatibility down to Rust 1.19 (`dyn` needs 1.27)
42
+ #![ allow( unknown_lints, bare_trait_objects) ]
41
43
#![ cfg_attr( not( feature = "std" ) , no_std) ]
42
44
43
45
#[ cfg( feature = "std" ) ]
@@ -92,6 +94,11 @@ pub trait StreamingIterator {
92
94
( 0 , None )
93
95
}
94
96
97
+ /// Checks if `get()` will return `None`.
98
+ fn is_done ( & self ) -> bool {
99
+ self . get ( ) . is_none ( )
100
+ }
101
+
95
102
/// Determines if all elements of the iterator satisfy a predicate.
96
103
#[ inline]
97
104
fn all < F > ( & mut self , mut f : F ) -> bool
@@ -223,9 +230,11 @@ pub trait StreamingIterator {
223
230
loop {
224
231
self . advance ( ) ;
225
232
match self . get ( ) {
226
- Some ( i) => if f ( i) {
227
- break ;
228
- } ,
233
+ Some ( i) => {
234
+ if f ( i) {
235
+ break ;
236
+ }
237
+ }
229
238
None => break ,
230
239
}
231
240
}
@@ -288,6 +297,10 @@ pub trait StreamingIterator {
288
297
/// Creates an iterator which transforms elements of this iterator by passing them to a closure.
289
298
///
290
299
/// Unlike `map`, this method takes a closure that returns a reference into the original value.
300
+ ///
301
+ /// The mapping function is only guaranteed to be called at some point before an element
302
+ /// is actually consumed. This allows an expensive mapping function to be ignored
303
+ /// during skipping (e.g. `nth`).
291
304
#[ inline]
292
305
fn map_ref < B : ?Sized , F > ( self , f : F ) -> MapRef < Self , F >
293
306
where
@@ -302,7 +315,7 @@ pub trait StreamingIterator {
302
315
fn nth ( & mut self , n : usize ) -> Option < & Self :: Item > {
303
316
for _ in 0 ..n {
304
317
self . advance ( ) ;
305
- if self . get ( ) . is_none ( ) {
318
+ if self . is_done ( ) {
306
319
return None ;
307
320
}
308
321
}
@@ -437,6 +450,11 @@ where
437
450
( * * self ) . advance ( )
438
451
}
439
452
453
+ #[ inline]
454
+ fn is_done ( & self ) -> bool {
455
+ ( * * self ) . is_done ( )
456
+ }
457
+
440
458
#[ inline]
441
459
fn get ( & self ) -> Option < & Self :: Item > {
442
460
( * * self ) . get ( )
@@ -465,6 +483,11 @@ where
465
483
( * * self ) . advance ( )
466
484
}
467
485
486
+ #[ inline]
487
+ fn is_done ( & self ) -> bool {
488
+ ( * * self ) . is_done ( )
489
+ }
490
+
468
491
#[ inline]
469
492
fn get ( & self ) -> Option < & Self :: Item > {
470
493
( * * self ) . get ( )
@@ -550,7 +573,8 @@ where
550
573
551
574
match self . state {
552
575
BothForward | BothBackward => {
553
- self . state = if self . a . next ( ) . is_none ( ) {
576
+ self . a . advance ( ) ;
577
+ self . state = if self . a . is_done ( ) {
554
578
self . b . advance ( ) ;
555
579
Back
556
580
} else {
@@ -562,6 +586,16 @@ where
562
586
}
563
587
}
564
588
589
+ #[ inline]
590
+ fn is_done ( & self ) -> bool {
591
+ use ChainState :: * ;
592
+
593
+ match self . state {
594
+ BothForward | Front => self . a . is_done ( ) ,
595
+ BothBackward | Back => self . b . is_done ( ) ,
596
+ }
597
+ }
598
+
565
599
#[ inline]
566
600
fn get ( & self ) -> Option < & Self :: Item > {
567
601
use ChainState :: * ;
@@ -602,7 +636,8 @@ where
602
636
603
637
match self . state {
604
638
BothForward | BothBackward => {
605
- self . state = if self . b . next_back ( ) . is_none ( ) {
639
+ self . b . advance_back ( ) ;
640
+ self . state = if self . b . is_done ( ) {
606
641
self . a . advance_back ( ) ;
607
642
Front
608
643
} else {
@@ -699,6 +734,11 @@ where
699
734
}
700
735
}
701
736
737
+ #[ inline]
738
+ fn is_done ( & self ) -> bool {
739
+ self . it . is_done ( )
740
+ }
741
+
702
742
#[ inline]
703
743
fn get ( & self ) -> Option < & I :: Item > {
704
744
self . it . get ( )
@@ -782,10 +822,12 @@ where
782
822
fn advance ( & mut self ) {
783
823
loop {
784
824
match self . it . next ( ) {
785
- Some ( i) => if let Some ( i) = ( self . f ) ( i) {
786
- self . item = Some ( i) ;
787
- break ;
788
- } ,
825
+ Some ( i) => {
826
+ if let Some ( i) = ( self . f ) ( i) {
827
+ self . item = Some ( i) ;
828
+ break ;
829
+ }
830
+ }
789
831
None => {
790
832
self . item = None ;
791
833
break ;
@@ -827,10 +869,12 @@ where
827
869
fn advance_back ( & mut self ) {
828
870
loop {
829
871
match self . it . next_back ( ) {
830
- Some ( i) => if let Some ( i) = ( self . f ) ( i) {
831
- self . item = Some ( i) ;
832
- break ;
833
- } ,
872
+ Some ( i) => {
873
+ if let Some ( i) = ( self . f ) ( i) {
874
+ self . item = Some ( i) ;
875
+ break ;
876
+ }
877
+ }
834
878
None => {
835
879
self . item = None ;
836
880
break ;
@@ -872,7 +916,13 @@ where
872
916
873
917
#[ inline]
874
918
fn advance ( & mut self ) {
875
- while self . sub_iter . as_mut ( ) . and_then ( J :: next) . is_none ( ) {
919
+ loop {
920
+ if let Some ( ref mut iter) = self . sub_iter {
921
+ iter. advance ( ) ;
922
+ if !iter. is_done ( ) {
923
+ break ;
924
+ }
925
+ }
876
926
if let Some ( item) = self . it . next ( ) {
877
927
self . sub_iter = Some ( ( self . f ) ( item) ) ;
878
928
} else {
@@ -881,6 +931,14 @@ where
881
931
}
882
932
}
883
933
934
+ #[ inline]
935
+ fn is_done ( & self ) -> bool {
936
+ match self . sub_iter {
937
+ Some ( ref iter) => iter. is_done ( ) ,
938
+ None => true ,
939
+ }
940
+ }
941
+
884
942
#[ inline]
885
943
fn get ( & self ) -> Option < & Self :: Item > {
886
944
self . sub_iter . as_ref ( ) . and_then ( J :: get)
@@ -982,21 +1040,30 @@ where
982
1040
match self . state {
983
1041
FuseState :: Start => {
984
1042
self . it . advance ( ) ;
985
- self . state = match self . it . get ( ) {
986
- Some ( _) => FuseState :: Middle ,
987
- None => FuseState :: End ,
1043
+ self . state = if self . it . is_done ( ) {
1044
+ FuseState :: End
1045
+ } else {
1046
+ FuseState :: Middle
988
1047
} ;
989
1048
}
990
1049
FuseState :: Middle => {
991
1050
self . it . advance ( ) ;
992
- if let None = self . it . get ( ) {
1051
+ if self . it . is_done ( ) {
993
1052
self . state = FuseState :: End ;
994
1053
}
995
1054
}
996
1055
FuseState :: End => { }
997
1056
}
998
1057
}
999
1058
1059
+ #[ inline]
1060
+ fn is_done ( & self ) -> bool {
1061
+ match self . state {
1062
+ FuseState :: Start | FuseState :: End => true ,
1063
+ FuseState :: Middle => false ,
1064
+ }
1065
+ }
1066
+
1000
1067
#[ inline]
1001
1068
fn get ( & self ) -> Option < & I :: Item > {
1002
1069
match self . state {
@@ -1054,6 +1121,7 @@ where
1054
1121
}
1055
1122
}
1056
1123
}
1124
+
1057
1125
/// A streaming iterator that calls a function with element before yielding it.
1058
1126
#[ derive( Debug ) ]
1059
1127
pub struct Inspect < I , F > {
@@ -1074,6 +1142,11 @@ where
1074
1142
}
1075
1143
}
1076
1144
1145
+ #[ inline]
1146
+ fn is_done ( & self ) -> bool {
1147
+ self . it . is_done ( )
1148
+ }
1149
+
1077
1150
fn get ( & self ) -> Option < & Self :: Item > {
1078
1151
self . it . get ( )
1079
1152
}
@@ -1248,6 +1321,11 @@ where
1248
1321
self . it . advance ( ) ;
1249
1322
}
1250
1323
1324
+ #[ inline]
1325
+ fn is_done ( & self ) -> bool {
1326
+ self . it . is_done ( )
1327
+ }
1328
+
1251
1329
#[ inline]
1252
1330
fn get ( & self ) -> Option < & B > {
1253
1331
self . it . get ( ) . map ( & self . f )
@@ -1341,6 +1419,11 @@ where
1341
1419
self . n = 0 ;
1342
1420
}
1343
1421
1422
+ #[ inline]
1423
+ fn is_done ( & self ) -> bool {
1424
+ self . it . is_done ( )
1425
+ }
1426
+
1344
1427
#[ inline]
1345
1428
fn get ( & self ) -> Option < & I :: Item > {
1346
1429
self . it . get ( )
@@ -1397,6 +1480,11 @@ where
1397
1480
}
1398
1481
}
1399
1482
1483
+ #[ inline]
1484
+ fn is_done ( & self ) -> bool {
1485
+ self . it . is_done ( )
1486
+ }
1487
+
1400
1488
#[ inline]
1401
1489
fn get ( & self ) -> Option < & I :: Item > {
1402
1490
self . it . get ( )
@@ -1448,6 +1536,11 @@ where
1448
1536
}
1449
1537
}
1450
1538
1539
+ #[ inline]
1540
+ fn is_done ( & self ) -> bool {
1541
+ self . done || self . it . is_done ( )
1542
+ }
1543
+
1451
1544
#[ inline]
1452
1545
fn get ( & self ) -> Option < & I :: Item > {
1453
1546
if self . done {
@@ -1491,6 +1584,11 @@ where
1491
1584
}
1492
1585
}
1493
1586
1587
+ #[ inline]
1588
+ fn is_done ( & self ) -> bool {
1589
+ self . done || self . it . is_done ( )
1590
+ }
1591
+
1494
1592
#[ inline]
1495
1593
fn get ( & self ) -> Option < & I :: Item > {
1496
1594
if self . done {
@@ -1506,12 +1604,14 @@ where
1506
1604
None
1507
1605
} else {
1508
1606
match self . it . next ( ) {
1509
- Some ( i) => if ( self . f ) ( i) {
1510
- Some ( i)
1511
- } else {
1512
- self . done = true ;
1513
- None
1514
- } ,
1607
+ Some ( i) => {
1608
+ if ( self . f ) ( i) {
1609
+ Some ( i)
1610
+ } else {
1611
+ self . done = true ;
1612
+ None
1613
+ }
1614
+ }
1515
1615
None => None ,
1516
1616
}
1517
1617
}
@@ -1542,6 +1642,11 @@ where
1542
1642
self . 0 . advance_back ( ) ;
1543
1643
}
1544
1644
1645
+ #[ inline]
1646
+ fn is_done ( & self ) -> bool {
1647
+ self . 0 . is_done ( )
1648
+ }
1649
+
1545
1650
#[ inline]
1546
1651
fn get ( & self ) -> Option < & I :: Item > {
1547
1652
self . 0 . get ( )
@@ -1923,6 +2028,24 @@ mod test {
1923
2028
assert_eq ! ( it. next( ) , None ) ;
1924
2029
}
1925
2030
2031
+ #[ test]
2032
+ fn is_done_empty ( ) {
2033
+ let mut empty = empty :: < u8 > ( ) ;
2034
+ empty. advance ( ) ;
2035
+ assert ! ( empty. is_done( ) ) ;
2036
+ }
2037
+
2038
+ #[ test]
2039
+ fn is_done_map ( ) {
2040
+ let items = [ 1 ] ;
2041
+ let mut it = convert ( items. iter ( ) . cloned ( ) )
2042
+ . map_ref :: < u16 , _ > ( |_| panic ! ( "only called during get()" ) ) ;
2043
+ it. advance ( ) ;
2044
+ assert ! ( !it. is_done( ) ) ;
2045
+ it. advance ( ) ;
2046
+ assert ! ( it. is_done( ) ) ;
2047
+ }
2048
+
1926
2049
#[ test]
1927
2050
fn rev ( ) {
1928
2051
let items = [ 0 , 1 , 2 , 3 ] ;
0 commit comments