@@ -4,6 +4,43 @@ use core::cell::Cell;
44use core:: convert:: TryFrom ;
55use core:: iter:: * ;
66
7+ /// An iterator wrapper that panics whenever `next` or `next_back` is called
8+ /// after `None` has been returned.
9+ struct Unfuse < I > {
10+ iter : I ,
11+ exhausted : bool ,
12+ }
13+
14+ fn unfuse < I : IntoIterator > ( iter : I ) -> Unfuse < I :: IntoIter > {
15+ Unfuse { iter : iter. into_iter ( ) , exhausted : false }
16+ }
17+
18+ impl < I > Iterator for Unfuse < I >
19+ where
20+ I : Iterator ,
21+ {
22+ type Item = I :: Item ;
23+
24+ fn next ( & mut self ) -> Option < Self :: Item > {
25+ assert ! ( !self . exhausted) ;
26+ let next = self . iter . next ( ) ;
27+ self . exhausted = next. is_none ( ) ;
28+ next
29+ }
30+ }
31+
32+ impl < I > DoubleEndedIterator for Unfuse < I >
33+ where
34+ I : DoubleEndedIterator ,
35+ {
36+ fn next_back ( & mut self ) -> Option < Self :: Item > {
37+ assert ! ( !self . exhausted) ;
38+ let next = self . iter . next_back ( ) ;
39+ self . exhausted = next. is_none ( ) ;
40+ next
41+ }
42+ }
43+
744#[ test]
845fn test_lt ( ) {
946 let empty: [ isize ; 0 ] = [ ] ;
@@ -148,14 +185,14 @@ fn test_iterator_chain_advance_by() {
148185 let len = xs. len ( ) + ys. len ( ) ;
149186
150187 for i in 0 ..xs. len ( ) {
151- let mut iter = xs . iter ( ) . chain ( ys ) ;
188+ let mut iter = unfuse ( xs ) . chain ( unfuse ( ys ) ) ;
152189 iter. advance_by ( i) . unwrap ( ) ;
153190 assert_eq ! ( iter. next( ) , Some ( & xs[ i] ) ) ;
154191 assert_eq ! ( iter. advance_by( 100 ) , Err ( len - i - 1 ) ) ;
155192 }
156193
157194 for i in 0 ..ys. len ( ) {
158- let mut iter = xs . iter ( ) . chain ( ys ) ;
195+ let mut iter = unfuse ( xs ) . chain ( unfuse ( ys ) ) ;
159196 iter. advance_by ( xs. len ( ) + i) . unwrap ( ) ;
160197 assert_eq ! ( iter. next( ) , Some ( & ys[ i] ) ) ;
161198 assert_eq ! ( iter. advance_by( 100 ) , Err ( ys. len( ) - i - 1 ) ) ;
@@ -181,14 +218,14 @@ fn test_iterator_chain_advance_back_by() {
181218 let len = xs. len ( ) + ys. len ( ) ;
182219
183220 for i in 0 ..ys. len ( ) {
184- let mut iter = xs . iter ( ) . chain ( ys ) ;
221+ let mut iter = unfuse ( xs ) . chain ( unfuse ( ys ) ) ;
185222 iter. advance_back_by ( i) . unwrap ( ) ;
186223 assert_eq ! ( iter. next_back( ) , Some ( & ys[ ys. len( ) - i - 1 ] ) ) ;
187224 assert_eq ! ( iter. advance_back_by( 100 ) , Err ( len - i - 1 ) ) ;
188225 }
189226
190227 for i in 0 ..xs. len ( ) {
191- let mut iter = xs . iter ( ) . chain ( ys ) ;
228+ let mut iter = unfuse ( xs ) . chain ( unfuse ( ys ) ) ;
192229 iter. advance_back_by ( ys. len ( ) + i) . unwrap ( ) ;
193230 assert_eq ! ( iter. next_back( ) , Some ( & xs[ xs. len( ) - i - 1 ] ) ) ;
194231 assert_eq ! ( iter. advance_back_by( 100 ) , Err ( xs. len( ) - i - 1 ) ) ;
0 commit comments