1
+ use crate :: convert:: Infallible ;
1
2
use crate :: intrinsics;
2
3
use crate :: iter:: {
3
4
DoubleEndedIterator , ExactSizeIterator , FusedIterator , Iterator , TrustedRandomAccess ,
4
5
} ;
5
6
use crate :: ops:: Try ;
6
7
8
+ trait Stop : Sized {
9
+ /// Switch internal state of `Fuse` to indicate that underlying iterator returned `None`
10
+ fn stop < I > ( state : & mut Result < I , Self > ) ;
11
+ }
12
+
13
+ impl Stop for ( ) {
14
+ fn stop < I > ( state : & mut Result < I , Self > ) {
15
+ * state = Err ( ( ) )
16
+ }
17
+ }
18
+
19
+ impl Stop for Infallible {
20
+ #[ inline( always) ]
21
+ fn stop < I > ( _state : & mut Result < I , Self > ) {
22
+ // Intentionally does nothing: fused iterator returns `None`s after returning `None`,
23
+ // so there is no need to alter state
24
+ }
25
+ }
26
+
27
+ trait StopState {
28
+ /// Type of value used to indicate that iterator returned `None`
29
+ type State : Stop + crate :: fmt:: Debug + Clone ;
30
+ }
31
+
32
+ impl < I : ?Sized > StopState for I {
33
+ default type State = ( ) ;
34
+ }
35
+
36
+ impl < I : FusedIterator + ?Sized > StopState for I {
37
+ type State = Infallible ;
38
+ }
39
+
40
+ type StopStateOf < I > = <I as StopState >:: State ;
41
+
7
42
/// An iterator that yields `None` forever after the underlying iterator
8
43
/// yields `None` once.
9
44
///
@@ -16,12 +51,17 @@ use crate::ops::Try;
16
51
#[ must_use = "iterators are lazy and do nothing unless consumed" ]
17
52
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
18
53
pub struct Fuse < I > {
19
- // NOTE: for `I: FusedIterator`, this is always assumed `Some`!
20
- iter : Option < I > ,
54
+ iter : Result < I , StopStateOf < I > > ,
21
55
}
56
+
22
57
impl < I > Fuse < I > {
23
58
pub ( in crate :: iter) fn new ( iter : I ) -> Fuse < I > {
24
- Fuse { iter : Some ( iter) }
59
+ Fuse { iter : Ok ( iter) }
60
+ }
61
+
62
+ #[ inline( always) ]
63
+ fn stop ( & mut self ) {
64
+ StopStateOf :: < I > :: stop ( & mut self . iter ) ;
25
65
}
26
66
}
27
67
@@ -36,71 +76,71 @@ where
36
76
type Item = <I as Iterator >:: Item ;
37
77
38
78
#[ inline]
39
- default fn next ( & mut self ) -> Option < <I as Iterator >:: Item > {
40
- let next = self . iter . as_mut ( ) ?. next ( ) ;
79
+ fn next ( & mut self ) -> Option < <I as Iterator >:: Item > {
80
+ let next = self . iter . as_mut ( ) . ok ( ) ?. next ( ) ;
41
81
if next. is_none ( ) {
42
- self . iter = None ;
82
+ self . stop ( ) ;
43
83
}
44
84
next
45
85
}
46
86
47
87
#[ inline]
48
- default fn nth ( & mut self , n : usize ) -> Option < I :: Item > {
49
- let nth = self . iter . as_mut ( ) ?. nth ( n) ;
88
+ fn nth ( & mut self , n : usize ) -> Option < I :: Item > {
89
+ let nth = self . iter . as_mut ( ) . ok ( ) ?. nth ( n) ;
50
90
if nth. is_none ( ) {
51
- self . iter = None ;
91
+ self . stop ( ) ;
52
92
}
53
93
nth
54
94
}
55
95
56
96
#[ inline]
57
- default fn last ( self ) -> Option < I :: Item > {
58
- self . iter ?. last ( )
97
+ fn last ( self ) -> Option < I :: Item > {
98
+ self . iter . ok ( ) ?. last ( )
59
99
}
60
100
61
101
#[ inline]
62
- default fn count ( self ) -> usize {
102
+ fn count ( self ) -> usize {
63
103
self . iter . map_or ( 0 , I :: count)
64
104
}
65
105
66
106
#[ inline]
67
- default fn size_hint ( & self ) -> ( usize , Option < usize > ) {
107
+ fn size_hint ( & self ) -> ( usize , Option < usize > ) {
68
108
self . iter . as_ref ( ) . map_or ( ( 0 , Some ( 0 ) ) , I :: size_hint)
69
109
}
70
110
71
111
#[ inline]
72
- default fn try_fold < Acc , Fold , R > ( & mut self , mut acc : Acc , fold : Fold ) -> R
112
+ fn try_fold < Acc , Fold , R > ( & mut self , mut acc : Acc , fold : Fold ) -> R
73
113
where
74
114
Self : Sized ,
75
115
Fold : FnMut ( Acc , Self :: Item ) -> R ,
76
116
R : Try < Ok = Acc > ,
77
117
{
78
- if let Some ( ref mut iter) = self . iter {
118
+ if let Ok ( ref mut iter) = self . iter {
79
119
acc = iter. try_fold ( acc, fold) ?;
80
- self . iter = None ;
120
+ self . stop ( ) ;
81
121
}
82
122
Try :: from_ok ( acc)
83
123
}
84
124
85
125
#[ inline]
86
- default fn fold < Acc , Fold > ( self , mut acc : Acc , fold : Fold ) -> Acc
126
+ fn fold < Acc , Fold > ( self , mut acc : Acc , fold : Fold ) -> Acc
87
127
where
88
128
Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
89
129
{
90
- if let Some ( iter) = self . iter {
130
+ if let Ok ( iter) = self . iter {
91
131
acc = iter. fold ( acc, fold) ;
92
132
}
93
133
acc
94
134
}
95
135
96
136
#[ inline]
97
- default fn find < P > ( & mut self , predicate : P ) -> Option < Self :: Item >
137
+ fn find < P > ( & mut self , predicate : P ) -> Option < Self :: Item >
98
138
where
99
139
P : FnMut ( & Self :: Item ) -> bool ,
100
140
{
101
- let found = self . iter . as_mut ( ) ?. find ( predicate) ;
141
+ let found = self . iter . as_mut ( ) . ok ( ) ?. find ( predicate) ;
102
142
if found. is_none ( ) {
103
- self . iter = None ;
143
+ self . stop ( ) ;
104
144
}
105
145
found
106
146
}
@@ -112,56 +152,56 @@ where
112
152
I : DoubleEndedIterator ,
113
153
{
114
154
#[ inline]
115
- default fn next_back ( & mut self ) -> Option < <I as Iterator >:: Item > {
116
- let next = self . iter . as_mut ( ) ?. next_back ( ) ;
155
+ fn next_back ( & mut self ) -> Option < <I as Iterator >:: Item > {
156
+ let next = self . iter . as_mut ( ) . ok ( ) ?. next_back ( ) ;
117
157
if next. is_none ( ) {
118
- self . iter = None ;
158
+ self . stop ( ) ;
119
159
}
120
160
next
121
161
}
122
162
123
163
#[ inline]
124
- default fn nth_back ( & mut self , n : usize ) -> Option < <I as Iterator >:: Item > {
125
- let nth = self . iter . as_mut ( ) ?. nth_back ( n) ;
164
+ fn nth_back ( & mut self , n : usize ) -> Option < <I as Iterator >:: Item > {
165
+ let nth = self . iter . as_mut ( ) . ok ( ) ?. nth_back ( n) ;
126
166
if nth. is_none ( ) {
127
- self . iter = None ;
167
+ self . stop ( ) ;
128
168
}
129
169
nth
130
170
}
131
171
132
172
#[ inline]
133
- default fn try_rfold < Acc , Fold , R > ( & mut self , mut acc : Acc , fold : Fold ) -> R
173
+ fn try_rfold < Acc , Fold , R > ( & mut self , mut acc : Acc , fold : Fold ) -> R
134
174
where
135
175
Self : Sized ,
136
176
Fold : FnMut ( Acc , Self :: Item ) -> R ,
137
177
R : Try < Ok = Acc > ,
138
178
{
139
- if let Some ( ref mut iter) = self . iter {
179
+ if let Ok ( ref mut iter) = self . iter {
140
180
acc = iter. try_rfold ( acc, fold) ?;
141
- self . iter = None ;
181
+ self . stop ( ) ;
142
182
}
143
183
Try :: from_ok ( acc)
144
184
}
145
185
146
186
#[ inline]
147
- default fn rfold < Acc , Fold > ( self , mut acc : Acc , fold : Fold ) -> Acc
187
+ fn rfold < Acc , Fold > ( self , mut acc : Acc , fold : Fold ) -> Acc
148
188
where
149
189
Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
150
190
{
151
- if let Some ( iter) = self . iter {
191
+ if let Ok ( iter) = self . iter {
152
192
acc = iter. rfold ( acc, fold) ;
153
193
}
154
194
acc
155
195
}
156
196
157
197
#[ inline]
158
- default fn rfind < P > ( & mut self , predicate : P ) -> Option < Self :: Item >
198
+ fn rfind < P > ( & mut self , predicate : P ) -> Option < Self :: Item >
159
199
where
160
200
P : FnMut ( & Self :: Item ) -> bool ,
161
201
{
162
- let found = self . iter . as_mut ( ) ?. rfind ( predicate) ;
202
+ let found = self . iter . as_mut ( ) . ok ( ) ?. rfind ( predicate) ;
163
203
if found. is_none ( ) {
164
- self . iter = None ;
204
+ self . stop ( ) ;
165
205
}
166
206
found
167
207
}
@@ -171,156 +211,13 @@ where
171
211
impl < I > ExactSizeIterator for Fuse < I >
172
212
where
173
213
I : ExactSizeIterator ,
174
- {
175
- default fn len ( & self ) -> usize {
176
- self . iter . as_ref ( ) . map_or ( 0 , I :: len)
177
- }
178
-
179
- default fn is_empty ( & self ) -> bool {
180
- self . iter . as_ref ( ) . map_or ( true , I :: is_empty)
181
- }
182
- }
183
-
184
- // NOTE: for `I: FusedIterator`, we assume that the iterator is always `Some`
185
- impl < I : FusedIterator > Fuse < I > {
186
- #[ inline( always) ]
187
- fn as_inner ( & self ) -> & I {
188
- match self . iter {
189
- Some ( ref iter) => iter,
190
- // SAFETY: the specialized iterator never sets `None`
191
- None => unsafe { intrinsics:: unreachable ( ) } ,
192
- }
193
- }
194
-
195
- #[ inline( always) ]
196
- fn as_inner_mut ( & mut self ) -> & mut I {
197
- match self . iter {
198
- Some ( ref mut iter) => iter,
199
- // SAFETY: the specialized iterator never sets `None`
200
- None => unsafe { intrinsics:: unreachable ( ) } ,
201
- }
202
- }
203
-
204
- #[ inline( always) ]
205
- fn into_inner ( self ) -> I {
206
- match self . iter {
207
- Some ( iter) => iter,
208
- // SAFETY: the specialized iterator never sets `None`
209
- None => unsafe { intrinsics:: unreachable ( ) } ,
210
- }
211
- }
212
- }
213
-
214
- #[ stable( feature = "fused" , since = "1.26.0" ) ]
215
- impl < I > Iterator for Fuse < I >
216
- where
217
- I : FusedIterator ,
218
- {
219
- #[ inline]
220
- fn next ( & mut self ) -> Option < <I as Iterator >:: Item > {
221
- self . as_inner_mut ( ) . next ( )
222
- }
223
-
224
- #[ inline]
225
- fn nth ( & mut self , n : usize ) -> Option < I :: Item > {
226
- self . as_inner_mut ( ) . nth ( n)
227
- }
228
-
229
- #[ inline]
230
- fn last ( self ) -> Option < I :: Item > {
231
- self . into_inner ( ) . last ( )
232
- }
233
-
234
- #[ inline]
235
- fn count ( self ) -> usize {
236
- self . into_inner ( ) . count ( )
237
- }
238
-
239
- #[ inline]
240
- fn size_hint ( & self ) -> ( usize , Option < usize > ) {
241
- self . as_inner ( ) . size_hint ( )
242
- }
243
-
244
- #[ inline]
245
- fn try_fold < Acc , Fold , R > ( & mut self , init : Acc , fold : Fold ) -> R
246
- where
247
- Self : Sized ,
248
- Fold : FnMut ( Acc , Self :: Item ) -> R ,
249
- R : Try < Ok = Acc > ,
250
- {
251
- self . as_inner_mut ( ) . try_fold ( init, fold)
252
- }
253
-
254
- #[ inline]
255
- fn fold < Acc , Fold > ( self , init : Acc , fold : Fold ) -> Acc
256
- where
257
- Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
258
- {
259
- self . into_inner ( ) . fold ( init, fold)
260
- }
261
-
262
- #[ inline]
263
- fn find < P > ( & mut self , predicate : P ) -> Option < Self :: Item >
264
- where
265
- P : FnMut ( & Self :: Item ) -> bool ,
266
- {
267
- self . as_inner_mut ( ) . find ( predicate)
268
- }
269
- }
270
-
271
- #[ stable( feature = "fused" , since = "1.26.0" ) ]
272
- impl < I > DoubleEndedIterator for Fuse < I >
273
- where
274
- I : DoubleEndedIterator + FusedIterator ,
275
- {
276
- #[ inline]
277
- fn next_back ( & mut self ) -> Option < <I as Iterator >:: Item > {
278
- self . as_inner_mut ( ) . next_back ( )
279
- }
280
-
281
- #[ inline]
282
- fn nth_back ( & mut self , n : usize ) -> Option < <I as Iterator >:: Item > {
283
- self . as_inner_mut ( ) . nth_back ( n)
284
- }
285
-
286
- #[ inline]
287
- fn try_rfold < Acc , Fold , R > ( & mut self , init : Acc , fold : Fold ) -> R
288
- where
289
- Self : Sized ,
290
- Fold : FnMut ( Acc , Self :: Item ) -> R ,
291
- R : Try < Ok = Acc > ,
292
- {
293
- self . as_inner_mut ( ) . try_rfold ( init, fold)
294
- }
295
-
296
- #[ inline]
297
- fn rfold < Acc , Fold > ( self , init : Acc , fold : Fold ) -> Acc
298
- where
299
- Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
300
- {
301
- self . into_inner ( ) . rfold ( init, fold)
302
- }
303
-
304
- #[ inline]
305
- fn rfind < P > ( & mut self , predicate : P ) -> Option < Self :: Item >
306
- where
307
- P : FnMut ( & Self :: Item ) -> bool ,
308
- {
309
- self . as_inner_mut ( ) . rfind ( predicate)
310
- }
311
- }
312
-
313
- #[ stable( feature = "rust1" , since = "1.0.0" ) ]
314
- impl < I > ExactSizeIterator for Fuse < I >
315
- where
316
- I : ExactSizeIterator + FusedIterator ,
317
214
{
318
215
fn len ( & self ) -> usize {
319
- self . as_inner ( ) . len ( )
216
+ self . iter . as_ref ( ) . map_or ( 0 , I :: len )
320
217
}
321
218
322
219
fn is_empty ( & self ) -> bool {
323
- self . as_inner ( ) . is_empty ( )
220
+ self . iter . as_ref ( ) . map_or ( true , I :: is_empty )
324
221
}
325
222
}
326
223
@@ -330,9 +227,9 @@ where
330
227
{
331
228
unsafe fn get_unchecked ( & mut self , i : usize ) -> I :: Item {
332
229
match self . iter {
333
- Some ( ref mut iter) => iter. get_unchecked ( i) ,
230
+ Ok ( ref mut iter) => iter. get_unchecked ( i) ,
334
231
// SAFETY: the caller asserts there is an item at `i`, so we're not exhausted.
335
- None => intrinsics:: unreachable ( ) ,
232
+ Err ( _ ) => intrinsics:: unreachable ( ) ,
336
233
}
337
234
}
338
235
0 commit comments