@@ -4,6 +4,43 @@ use core::cell::Cell;
4
4
use core:: convert:: TryFrom ;
5
5
use core:: iter:: * ;
6
6
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
+
7
44
#[ test]
8
45
fn test_lt ( ) {
9
46
let empty: [ isize ; 0 ] = [ ] ;
@@ -148,14 +185,14 @@ fn test_iterator_chain_advance_by() {
148
185
let len = xs. len ( ) + ys. len ( ) ;
149
186
150
187
for i in 0 ..xs. len ( ) {
151
- let mut iter = xs . iter ( ) . chain ( ys ) ;
188
+ let mut iter = unfuse ( xs ) . chain ( unfuse ( ys ) ) ;
152
189
iter. advance_by ( i) . unwrap ( ) ;
153
190
assert_eq ! ( iter. next( ) , Some ( & xs[ i] ) ) ;
154
191
assert_eq ! ( iter. advance_by( 100 ) , Err ( len - i - 1 ) ) ;
155
192
}
156
193
157
194
for i in 0 ..ys. len ( ) {
158
- let mut iter = xs . iter ( ) . chain ( ys ) ;
195
+ let mut iter = unfuse ( xs ) . chain ( unfuse ( ys ) ) ;
159
196
iter. advance_by ( xs. len ( ) + i) . unwrap ( ) ;
160
197
assert_eq ! ( iter. next( ) , Some ( & ys[ i] ) ) ;
161
198
assert_eq ! ( iter. advance_by( 100 ) , Err ( ys. len( ) - i - 1 ) ) ;
@@ -181,14 +218,14 @@ fn test_iterator_chain_advance_back_by() {
181
218
let len = xs. len ( ) + ys. len ( ) ;
182
219
183
220
for i in 0 ..ys. len ( ) {
184
- let mut iter = xs . iter ( ) . chain ( ys ) ;
221
+ let mut iter = unfuse ( xs ) . chain ( unfuse ( ys ) ) ;
185
222
iter. advance_back_by ( i) . unwrap ( ) ;
186
223
assert_eq ! ( iter. next_back( ) , Some ( & ys[ ys. len( ) - i - 1 ] ) ) ;
187
224
assert_eq ! ( iter. advance_back_by( 100 ) , Err ( len - i - 1 ) ) ;
188
225
}
189
226
190
227
for i in 0 ..xs. len ( ) {
191
- let mut iter = xs . iter ( ) . chain ( ys ) ;
228
+ let mut iter = unfuse ( xs ) . chain ( unfuse ( ys ) ) ;
192
229
iter. advance_back_by ( ys. len ( ) + i) . unwrap ( ) ;
193
230
assert_eq ! ( iter. next_back( ) , Some ( & xs[ xs. len( ) - i - 1 ] ) ) ;
194
231
assert_eq ! ( iter. advance_back_by( 100 ) , Err ( xs. len( ) - i - 1 ) ) ;
0 commit comments