@@ -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 ] = [ ] ;
@@ -142,6 +179,72 @@ fn test_iterator_chain() {
142
179
assert_eq ! ( i, expected. len( ) ) ;
143
180
}
144
181
182
+ #[ test]
183
+ fn test_iterator_chain_advance_by ( ) {
184
+ fn test_chain ( xs : & [ i32 ] , ys : & [ i32 ] ) {
185
+ let len = xs. len ( ) + ys. len ( ) ;
186
+
187
+ for i in 0 ..xs. len ( ) {
188
+ let mut iter = unfuse ( xs) . chain ( unfuse ( ys) ) ;
189
+ iter. advance_by ( i) . unwrap ( ) ;
190
+ assert_eq ! ( iter. next( ) , Some ( & xs[ i] ) ) ;
191
+ assert_eq ! ( iter. advance_by( 100 ) , Err ( len - i - 1 ) ) ;
192
+ }
193
+
194
+ for i in 0 ..ys. len ( ) {
195
+ let mut iter = unfuse ( xs) . chain ( unfuse ( ys) ) ;
196
+ iter. advance_by ( xs. len ( ) + i) . unwrap ( ) ;
197
+ assert_eq ! ( iter. next( ) , Some ( & ys[ i] ) ) ;
198
+ assert_eq ! ( iter. advance_by( 100 ) , Err ( ys. len( ) - i - 1 ) ) ;
199
+ }
200
+
201
+ let mut iter = xs. iter ( ) . chain ( ys) ;
202
+ iter. advance_by ( len) . unwrap ( ) ;
203
+ assert_eq ! ( iter. next( ) , None ) ;
204
+
205
+ let mut iter = xs. iter ( ) . chain ( ys) ;
206
+ assert_eq ! ( iter. advance_by( len + 1 ) , Err ( len) ) ;
207
+ }
208
+
209
+ test_chain ( & [ ] , & [ ] ) ;
210
+ test_chain ( & [ ] , & [ 0 , 1 , 2 , 3 , 4 , 5 ] ) ;
211
+ test_chain ( & [ 0 , 1 , 2 , 3 , 4 , 5 ] , & [ ] ) ;
212
+ test_chain ( & [ 0 , 1 , 2 , 3 , 4 , 5 ] , & [ 30 , 40 , 50 , 60 ] ) ;
213
+ }
214
+
215
+ #[ test]
216
+ fn test_iterator_chain_advance_back_by ( ) {
217
+ fn test_chain ( xs : & [ i32 ] , ys : & [ i32 ] ) {
218
+ let len = xs. len ( ) + ys. len ( ) ;
219
+
220
+ for i in 0 ..ys. len ( ) {
221
+ let mut iter = unfuse ( xs) . chain ( unfuse ( ys) ) ;
222
+ iter. advance_back_by ( i) . unwrap ( ) ;
223
+ assert_eq ! ( iter. next_back( ) , Some ( & ys[ ys. len( ) - i - 1 ] ) ) ;
224
+ assert_eq ! ( iter. advance_back_by( 100 ) , Err ( len - i - 1 ) ) ;
225
+ }
226
+
227
+ for i in 0 ..xs. len ( ) {
228
+ let mut iter = unfuse ( xs) . chain ( unfuse ( ys) ) ;
229
+ iter. advance_back_by ( ys. len ( ) + i) . unwrap ( ) ;
230
+ assert_eq ! ( iter. next_back( ) , Some ( & xs[ xs. len( ) - i - 1 ] ) ) ;
231
+ assert_eq ! ( iter. advance_back_by( 100 ) , Err ( xs. len( ) - i - 1 ) ) ;
232
+ }
233
+
234
+ let mut iter = xs. iter ( ) . chain ( ys) ;
235
+ iter. advance_back_by ( len) . unwrap ( ) ;
236
+ assert_eq ! ( iter. next_back( ) , None ) ;
237
+
238
+ let mut iter = xs. iter ( ) . chain ( ys) ;
239
+ assert_eq ! ( iter. advance_back_by( len + 1 ) , Err ( len) ) ;
240
+ }
241
+
242
+ test_chain ( & [ ] , & [ ] ) ;
243
+ test_chain ( & [ ] , & [ 0 , 1 , 2 , 3 , 4 , 5 ] ) ;
244
+ test_chain ( & [ 0 , 1 , 2 , 3 , 4 , 5 ] , & [ ] ) ;
245
+ test_chain ( & [ 0 , 1 , 2 , 3 , 4 , 5 ] , & [ 30 , 40 , 50 , 60 ] ) ;
246
+ }
247
+
145
248
#[ test]
146
249
fn test_iterator_chain_nth ( ) {
147
250
let xs = [ 0 , 1 , 2 , 3 , 4 , 5 ] ;
0 commit comments