@@ -15,243 +15,138 @@ pub fn derive(input: &Input) -> TokenStream {
15
15
let ref_name = & input. ref_name ( ) ;
16
16
let ref_mut_name = & input. ref_mut_name ( ) ;
17
17
18
- let ref_doc_url = format ! ( "[`{0}`](struct.{0}.html)" , ref_name) ;
19
- let ref_mut_doc_url = format ! ( "[`{0}`](struct.{0}.html)" , ref_mut_name) ;
20
18
21
- let fields_names = & input. fields . iter ( )
22
- . map ( |field| field. ident . clone ( ) . unwrap ( ) )
23
- . collect :: < Vec < _ > > ( ) ;
24
- let first_field = & fields_names[ 0 ] ;
19
+ let fields_names = input. fields . iter ( )
20
+ . map ( |field| field. ident . clone ( ) . unwrap ( ) )
21
+ . collect :: < Vec < _ > > ( ) ;
22
+ let fields_names_1 = & fields_names;
23
+ let fields_names_2 = & fields_names;
25
24
26
- let fields_types = & input. fields . iter ( )
27
- . map ( |field| & field. ty )
28
- . collect :: < Vec < _ > > ( ) ;
29
- let first_field_type = & fields_types[ 0 ] ;
30
-
31
- let mut iter_type = quote ! {
32
- slice:: Iter <' a, #first_field_type>
33
- } ;
34
- let mut iter_pat = quote ! {
35
- #first_field
36
- } ;
37
- let mut create_iter = quote ! {
38
- self . #first_field. iter( )
39
- } ;
40
-
41
- let mut iter_mut_type = quote ! {
42
- slice:: IterMut <' a, #first_field_type>
43
- } ;
44
- let mut create_iter_mut = quote ! {
45
- self . #first_field. iter_mut( )
46
- } ;
47
-
48
- if fields_types. len ( ) > 1 {
49
- for field in & input. fields [ 1 ..] {
50
- let field_name = & field. ident ;
51
- let field_type = & field. ty ;
52
-
53
- iter_pat = quote ! {
54
- ( #iter_pat, #field_name)
55
- } ;
56
-
57
- iter_type = quote ! {
58
- iter:: Zip <#iter_type, slice:: Iter <' a, #field_type>>
59
- } ;
60
-
61
- create_iter = quote ! {
62
- #create_iter. zip( self . #field_name. iter( ) )
63
- } ;
64
-
65
- iter_mut_type = quote ! {
66
- iter:: Zip <#iter_mut_type, slice:: IterMut <' a, #field_type>>
67
- } ;
68
-
69
- create_iter_mut = quote ! {
70
- #create_iter_mut. zip( self . #field_name. iter_mut( ) )
71
- } ;
72
- }
73
- }
74
-
75
- let mut generated = quote ! {
25
+ let generated = quote ! {
76
26
#[ allow( non_snake_case, dead_code) ]
77
27
mod #detail_mod {
78
28
use super :: * ;
79
- use std:: slice;
80
- #[ allow( unused_imports) ]
81
- use std:: iter;
82
29
83
- #[ allow( missing_debug_implementations) ]
84
- #visibility struct Iter <' a>( pub ( super ) #iter_type) ;
85
-
86
- impl <' a> Iterator for Iter <' a> {
87
- type Item = #ref_name<' a>;
88
-
89
- #[ inline]
90
- fn next( & mut self ) -> Option <#ref_name<' a>> {
91
- self . 0 . next( ) . and_then( |#iter_pat|
92
- Some ( #ref_name{
93
- #( #fields_names, ) *
94
- } )
95
- )
96
- }
97
-
98
- #[ inline]
99
- fn size_hint( & self ) -> ( usize , Option <usize >) {
100
- self . 0 . size_hint( )
101
- }
102
- }
103
-
104
- impl <' a> DoubleEndedIterator for Iter <' a> {
105
-
106
- #[ inline]
107
- fn next_back( & mut self ) -> Option <#ref_name<' a>> {
108
- self . 0 . next_back( ) . and_then( |#iter_pat|
109
- Some ( #ref_name{
110
- #( #fields_names, ) *
111
- } )
112
- )
113
- }
114
- }
115
-
116
- impl #vec_name {
117
- /// Get an iterator over the
118
- #[ doc = #ref_doc_url]
119
- /// in this vector
120
- #visibility fn iter( & self ) -> Iter {
121
- Iter ( #create_iter)
122
- }
30
+ pub struct VecIter <' a> {
31
+ pub ( super ) vec: & ' a #vec_name,
32
+ pub ( super ) n: usize ,
123
33
}
124
34
125
- impl <' a> #slice_name <' a> {
126
- /// Get an iterator over the
127
- # [ doc = #ref_doc_url ]
128
- /// in this slice.
129
- #visibility fn iter ( & self ) -> Iter {
130
- Iter ( #create_iter )
35
+ impl <' a> VecIter <' a> {
36
+ pub ( self ) fn new ( vec : & ' a #vec_name ) -> VecIter < ' a> {
37
+ VecIter {
38
+ vec ,
39
+ n : 0 ,
40
+ }
131
41
}
132
42
}
133
43
134
- # [ allow ( missing_debug_implementations ) ]
135
- #visibility struct IterMut <' a>( pub ( super ) #iter_mut_type ) ;
44
+ impl < ' a> Iterator for VecIter < ' a> {
45
+ type Item = #ref_name <' a>;
136
46
137
- impl <' a> Iterator for IterMut <' a> {
138
- type Item = #ref_mut_name<' a>;
47
+ fn next( & mut self ) -> Option <Self :: Item > {
48
+ if self . n >= self . vec. len( ) {
49
+ return None ;
50
+ }
139
51
140
- # [ inline ]
141
- fn next ( & mut self ) -> Option <#ref_mut_name< ' a>> {
142
- self . 0 . next ( ) . and_then ( |#iter_pat|
143
- Some ( #ref_mut_name {
144
- # ( #fields_names , ) *
52
+ let item = unsafe {
53
+ Some ( #ref_name {
54
+ # (
55
+ #fields_names_1 : self . vec . data . #fields_names_2 . ptr ( ) . add ( self . n ) . as_ref ( ) . unwrap ( ) ,
56
+ ) *
145
57
} )
146
- )
58
+ } ;
59
+ self . n += 1 ;
60
+ item
147
61
}
148
62
149
- #[ inline]
150
63
fn size_hint( & self ) -> ( usize , Option <usize >) {
151
- self . 0 . size_hint( )
64
+ if self . n >= self . vec. len( ) {
65
+ return ( 0 , Some ( 0 ) )
66
+ }
67
+ let left = self . vec. len( ) - self . n;
68
+ ( left, Some ( left) )
152
69
}
153
70
}
154
71
155
- impl <' a> DoubleEndedIterator for IterMut <' a> {
156
-
157
- #[ inline]
158
- fn next_back( & mut self ) -> Option <#ref_mut_name<' a>> {
159
- self . 0 . next_back( ) . and_then( |#iter_pat|
160
- Some ( #ref_mut_name{
161
- #( #fields_names, ) *
162
- } )
163
- )
164
- }
72
+ pub struct VecIterMut <' a> {
73
+ pub ( super ) vec: & ' a mut #vec_name,
74
+ pub ( super ) n: usize ,
165
75
}
166
76
167
- impl #vec_name {
168
- /// Get a mutable iterator over the
169
- # [ doc = #ref_mut_doc_url ]
170
- /// in this vector
171
- #visibility fn iter_mut ( & mut self ) -> IterMut {
172
- IterMut ( #create_iter_mut )
77
+ impl < ' a> VecIterMut < ' a> {
78
+ pub ( self ) fn new ( vec : & ' a mut #vec_name ) -> VecIterMut < ' a> {
79
+ VecIterMut {
80
+ vec ,
81
+ n : 0 ,
82
+ }
173
83
}
174
84
}
175
85
176
- impl <' a> #slice_mut_name<' a> {
177
- /// Get an iterator over the
178
- #[ doc = #ref_doc_url]
179
- /// in this vector
180
- #visibility fn iter( & mut self ) -> Iter {
181
- Iter ( #create_iter)
182
- }
183
86
184
- /// Get a mutable iterator over the
185
- #[ doc = #ref_mut_doc_url]
186
- /// in this vector
187
- #visibility fn iter_mut( & mut self ) -> IterMut {
188
- IterMut ( #create_iter_mut)
189
- }
190
- }
191
- }
192
- } ;
87
+ impl <' a> Iterator for VecIterMut <' a> {
88
+ type Item = #ref_mut_name<' a>;
193
89
194
- if let Visibility :: Public ( _) = * visibility {
195
- generated. append_all ( quote ! {
196
- impl <' a> IntoIterator for #slice_name<' a> {
197
- type Item = #ref_name<' a>;
198
- type IntoIter = #detail_mod:: Iter <' a>;
90
+ fn next( & mut self ) -> Option <Self :: Item > {
91
+ if self . n >= self . vec. len( ) {
92
+ return None ;
93
+ }
199
94
200
- fn into_iter( self ) -> Self :: IntoIter {
201
- #detail_mod:: Iter ( #create_iter)
95
+ let item = unsafe {
96
+ Some ( #ref_mut_name {
97
+ #(
98
+ #fields_names_1: self . vec. data. #fields_names_2. ptr( ) . add( self . n) . as_mut( ) . unwrap( ) ,
99
+ ) *
100
+ } )
101
+ } ;
102
+ self . n += 1 ;
103
+ item
202
104
}
203
- }
204
-
205
105
206
- impl std:: iter:: FromIterator <#name> for #vec_name {
207
- fn from_iter<T : IntoIterator <Item =#name>>( iter: T ) -> Self {
208
- let mut result = #vec_name:: new( ) ;
209
- for element in iter {
210
- #(
211
- ( result. #fields_names) . push( element. #fields_names) ;
212
- ) *
106
+ fn size_hint( & self ) -> ( usize , Option <usize >) {
107
+ if self . n >= self . vec. len( ) {
108
+ return ( 0 , Some ( 0 ) )
213
109
}
214
- result
110
+ let left = self . vec. len( ) - self . n;
111
+ ( left, Some ( left) )
215
112
}
216
113
}
114
+ }
217
115
218
- impl <' a, ' b> IntoIterator for & ' a #slice_name<' b> {
219
- type Item = #ref_name<' a>;
220
- type IntoIter = #detail_mod:: Iter <' a>;
221
-
222
- fn into_iter( self ) -> Self :: IntoIter {
223
- #detail_mod:: Iter ( #create_iter)
116
+ impl #vec_name {
117
+ pub fn iter<' a>( & ' a self ) -> #detail_mod:: VecIter <' a> {
118
+ #detail_mod:: VecIter {
119
+ vec: self ,
120
+ n: 0 ,
224
121
}
225
122
}
226
123
227
- impl <' a> IntoIterator for & ' a #vec_name {
228
- type Item = #ref_name<' a>;
229
- type IntoIter = #detail_mod:: Iter <' a>;
230
-
231
- fn into_iter( self ) -> Self :: IntoIter {
232
- #detail_mod:: Iter ( #create_iter)
124
+ pub fn iter_mut<' a>( & ' a mut self ) -> #detail_mod:: VecIterMut <' a> {
125
+ #detail_mod:: VecIterMut {
126
+ vec: self ,
127
+ n: 0 ,
233
128
}
234
129
}
130
+ }
235
131
236
- impl <' a> IntoIterator for #slice_mut_name< ' a> {
237
- type Item = #ref_mut_name <' a>;
238
- type IntoIter = #detail_mod:: IterMut <' a>;
132
+ impl <' a> IntoIterator for & ' a #vec_name {
133
+ type Item = #ref_name <' a>;
134
+ type IntoIter = #detail_mod:: VecIter <' a>;
239
135
240
- fn into_iter( self ) -> Self :: IntoIter {
241
- #detail_mod:: IterMut ( #create_iter_mut)
242
- }
136
+ fn into_iter( self ) -> Self :: IntoIter {
137
+ return self . iter( )
243
138
}
139
+ }
244
140
245
- impl <' a> IntoIterator for & ' a mut #vec_name {
246
- type Item = #ref_mut_name<' a>;
247
- type IntoIter = #detail_mod:: IterMut <' a>;
141
+ impl <' a> IntoIterator for & ' a mut #vec_name {
142
+ type Item = #ref_mut_name<' a>;
143
+ type IntoIter = #detail_mod:: VecIterMut <' a>;
248
144
249
- fn into_iter( self ) -> Self :: IntoIter {
250
- #detail_mod:: IterMut ( #create_iter_mut)
251
- }
145
+ fn into_iter( self ) -> Self :: IntoIter {
146
+ return self . iter_mut( )
252
147
}
253
- } ) ;
254
- }
148
+ }
149
+ } ;
255
150
256
151
return generated;
257
152
}
0 commit comments