@@ -188,34 +188,16 @@ where
188188 }
189189}
190190
191- // NOTE: for `I: FusedIterator`, we assume that the iterator is always `Some`
192- impl < I : FusedIterator > Fuse < I > {
193- # [ inline ( always ) ]
194- fn as_inner ( & self ) -> & I {
195- match self . iter {
196- Some ( ref iter) => iter,
191+ // NOTE: for `I: FusedIterator`, we assume that the iterator is always `Some`.
192+ // Implementing this as a directly-expanded macro helps codegen performance.
193+ macro_rules! unchecked {
194+ ( $ self: ident ) => {
195+ match $ self {
196+ Fuse { iter : Some ( iter) } => iter,
197197 // SAFETY: the specialized iterator never sets `None`
198- None => unsafe { intrinsics:: unreachable ( ) } ,
198+ Fuse { iter : None } => unsafe { intrinsics:: unreachable( ) } ,
199199 }
200- }
201-
202- #[ inline( always) ]
203- fn as_inner_mut ( & mut self ) -> & mut I {
204- match self . iter {
205- Some ( ref mut iter) => iter,
206- // SAFETY: the specialized iterator never sets `None`
207- None => unsafe { intrinsics:: unreachable ( ) } ,
208- }
209- }
210-
211- #[ inline( always) ]
212- fn into_inner ( self ) -> I {
213- match self . iter {
214- Some ( iter) => iter,
215- // SAFETY: the specialized iterator never sets `None`
216- None => unsafe { intrinsics:: unreachable ( ) } ,
217- }
218- }
200+ } ;
219201}
220202
221203#[ stable( feature = "fused" , since = "1.26.0" ) ]
@@ -225,27 +207,27 @@ where
225207{
226208 #[ inline]
227209 fn next ( & mut self ) -> Option < <I as Iterator >:: Item > {
228- self . as_inner_mut ( ) . next ( )
210+ unchecked ! ( self ) . next ( )
229211 }
230212
231213 #[ inline]
232214 fn nth ( & mut self , n : usize ) -> Option < I :: Item > {
233- self . as_inner_mut ( ) . nth ( n)
215+ unchecked ! ( self ) . nth ( n)
234216 }
235217
236218 #[ inline]
237219 fn last ( self ) -> Option < I :: Item > {
238- self . into_inner ( ) . last ( )
220+ unchecked ! ( self ) . last ( )
239221 }
240222
241223 #[ inline]
242224 fn count ( self ) -> usize {
243- self . into_inner ( ) . count ( )
225+ unchecked ! ( self ) . count ( )
244226 }
245227
246228 #[ inline]
247229 fn size_hint ( & self ) -> ( usize , Option < usize > ) {
248- self . as_inner ( ) . size_hint ( )
230+ unchecked ! ( self ) . size_hint ( )
249231 }
250232
251233 #[ inline]
@@ -255,23 +237,23 @@ where
255237 Fold : FnMut ( Acc , Self :: Item ) -> R ,
256238 R : Try < Ok = Acc > ,
257239 {
258- self . as_inner_mut ( ) . try_fold ( init, fold)
240+ unchecked ! ( self ) . try_fold ( init, fold)
259241 }
260242
261243 #[ inline]
262244 fn fold < Acc , Fold > ( self , init : Acc , fold : Fold ) -> Acc
263245 where
264246 Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
265247 {
266- self . into_inner ( ) . fold ( init, fold)
248+ unchecked ! ( self ) . fold ( init, fold)
267249 }
268250
269251 #[ inline]
270252 fn find < P > ( & mut self , predicate : P ) -> Option < Self :: Item >
271253 where
272254 P : FnMut ( & Self :: Item ) -> bool ,
273255 {
274- self . as_inner_mut ( ) . find ( predicate)
256+ unchecked ! ( self ) . find ( predicate)
275257 }
276258}
277259
@@ -282,12 +264,12 @@ where
282264{
283265 #[ inline]
284266 fn next_back ( & mut self ) -> Option < <I as Iterator >:: Item > {
285- self . as_inner_mut ( ) . next_back ( )
267+ unchecked ! ( self ) . next_back ( )
286268 }
287269
288270 #[ inline]
289271 fn nth_back ( & mut self , n : usize ) -> Option < <I as Iterator >:: Item > {
290- self . as_inner_mut ( ) . nth_back ( n)
272+ unchecked ! ( self ) . nth_back ( n)
291273 }
292274
293275 #[ inline]
@@ -297,23 +279,23 @@ where
297279 Fold : FnMut ( Acc , Self :: Item ) -> R ,
298280 R : Try < Ok = Acc > ,
299281 {
300- self . as_inner_mut ( ) . try_rfold ( init, fold)
282+ unchecked ! ( self ) . try_rfold ( init, fold)
301283 }
302284
303285 #[ inline]
304286 fn rfold < Acc , Fold > ( self , init : Acc , fold : Fold ) -> Acc
305287 where
306288 Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
307289 {
308- self . into_inner ( ) . rfold ( init, fold)
290+ unchecked ! ( self ) . rfold ( init, fold)
309291 }
310292
311293 #[ inline]
312294 fn rfind < P > ( & mut self , predicate : P ) -> Option < Self :: Item >
313295 where
314296 P : FnMut ( & Self :: Item ) -> bool ,
315297 {
316- self . as_inner_mut ( ) . rfind ( predicate)
298+ unchecked ! ( self ) . rfind ( predicate)
317299 }
318300}
319301
@@ -323,11 +305,11 @@ where
323305 I : ExactSizeIterator + FusedIterator ,
324306{
325307 fn len ( & self ) -> usize {
326- self . as_inner ( ) . len ( )
308+ unchecked ! ( self ) . len ( )
327309 }
328310
329311 fn is_empty ( & self ) -> bool {
330- self . as_inner ( ) . is_empty ( )
312+ unchecked ! ( self ) . is_empty ( )
331313 }
332314}
333315
0 commit comments