@@ -28,6 +28,22 @@ impl<I> Fuse<I> {
28
28
#[ stable( feature = "fused" , since = "1.26.0" ) ]
29
29
impl < I > FusedIterator for Fuse < I > where I : Iterator { }
30
30
31
+ /// Fuse the iterator if the expression is `None`.
32
+ macro_rules! fuse {
33
+ ( $self: ident . iter . $( $call: tt) +) => {
34
+ match $self. iter {
35
+ Some ( ref mut iter) => match iter. $( $call) + {
36
+ None => {
37
+ $self. iter = None ;
38
+ None
39
+ }
40
+ item => item,
41
+ } ,
42
+ None => None ,
43
+ }
44
+ } ;
45
+ }
46
+
31
47
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
32
48
impl < I > Iterator for Fuse < I >
33
49
where
@@ -37,35 +53,36 @@ where
37
53
38
54
#[ inline]
39
55
default fn next ( & mut self ) -> Option < <I as Iterator >:: Item > {
40
- let next = self . iter . as_mut ( ) ?. next ( ) ;
41
- if next. is_none ( ) {
42
- self . iter = None ;
43
- }
44
- next
56
+ fuse ! ( self . iter. next( ) )
45
57
}
46
58
47
59
#[ inline]
48
60
default fn nth ( & mut self , n : usize ) -> Option < I :: Item > {
49
- let nth = self . iter . as_mut ( ) ?. nth ( n) ;
50
- if nth. is_none ( ) {
51
- self . iter = None ;
52
- }
53
- nth
61
+ fuse ! ( self . iter. nth( n) )
54
62
}
55
63
56
64
#[ inline]
57
65
default fn last ( self ) -> Option < I :: Item > {
58
- self . iter ?. last ( )
66
+ match self . iter {
67
+ Some ( iter) => iter. last ( ) ,
68
+ None => None ,
69
+ }
59
70
}
60
71
61
72
#[ inline]
62
73
default fn count ( self ) -> usize {
63
- self . iter . map_or ( 0 , I :: count)
74
+ match self . iter {
75
+ Some ( iter) => iter. count ( ) ,
76
+ None => 0 ,
77
+ }
64
78
}
65
79
66
80
#[ inline]
67
81
default fn size_hint ( & self ) -> ( usize , Option < usize > ) {
68
- self . iter . as_ref ( ) . map_or ( ( 0 , Some ( 0 ) ) , I :: size_hint)
82
+ match self . iter {
83
+ Some ( ref iter) => iter. size_hint ( ) ,
84
+ None => ( 0 , Some ( 0 ) ) ,
85
+ }
69
86
}
70
87
71
88
#[ inline]
@@ -98,11 +115,7 @@ where
98
115
where
99
116
P : FnMut ( & Self :: Item ) -> bool ,
100
117
{
101
- let found = self . iter . as_mut ( ) ?. find ( predicate) ;
102
- if found. is_none ( ) {
103
- self . iter = None ;
104
- }
105
- found
118
+ fuse ! ( self . iter. find( predicate) )
106
119
}
107
120
}
108
121
@@ -113,20 +126,12 @@ where
113
126
{
114
127
#[ inline]
115
128
default fn next_back ( & mut self ) -> Option < <I as Iterator >:: Item > {
116
- let next = self . iter . as_mut ( ) ?. next_back ( ) ;
117
- if next. is_none ( ) {
118
- self . iter = None ;
119
- }
120
- next
129
+ fuse ! ( self . iter. next_back( ) )
121
130
}
122
131
123
132
#[ inline]
124
133
default fn nth_back ( & mut self , n : usize ) -> Option < <I as Iterator >:: Item > {
125
- let nth = self . iter . as_mut ( ) ?. nth_back ( n) ;
126
- if nth. is_none ( ) {
127
- self . iter = None ;
128
- }
129
- nth
134
+ fuse ! ( self . iter. nth_back( n) )
130
135
}
131
136
132
137
#[ inline]
@@ -159,11 +164,7 @@ where
159
164
where
160
165
P : FnMut ( & Self :: Item ) -> bool ,
161
166
{
162
- let found = self . iter . as_mut ( ) ?. rfind ( predicate) ;
163
- if found. is_none ( ) {
164
- self . iter = None ;
165
- }
166
- found
167
+ fuse ! ( self . iter. rfind( predicate) )
167
168
}
168
169
}
169
170
@@ -173,11 +174,17 @@ where
173
174
I : ExactSizeIterator ,
174
175
{
175
176
default fn len ( & self ) -> usize {
176
- self . iter . as_ref ( ) . map_or ( 0 , I :: len)
177
+ match self . iter {
178
+ Some ( ref iter) => iter. len ( ) ,
179
+ None => 0 ,
180
+ }
177
181
}
178
182
179
183
default fn is_empty ( & self ) -> bool {
180
- self . iter . as_ref ( ) . map_or ( true , I :: is_empty)
184
+ match self . iter {
185
+ Some ( ref iter) => iter. is_empty ( ) ,
186
+ None => true ,
187
+ }
181
188
}
182
189
}
183
190
0 commit comments