1
- use proc_macro2:: { Span , TokenStream } ;
2
- use syn:: { Ident , Visibility } ;
3
-
4
- use quote:: ToTokens ;
1
+ use proc_macro2:: TokenStream ;
5
2
use quote:: quote;
6
3
7
4
use crate :: input:: { Input , TokenStreamIterator } ;
@@ -10,13 +7,15 @@ use crate::names;
10
7
pub fn derive ( input : & Input ) -> TokenStream {
11
8
let name = & input. name ;
12
9
let visibility = & input. visibility ;
13
- let detail_mod = Ident :: new ( & format ! ( "__detail_iter_{}" , name. to_string( ) . to_lowercase( ) ) , Span :: call_site ( ) ) ;
14
10
let vec_name = names:: vec_name ( & input. name ) ;
15
11
let slice_name = names:: slice_name ( name) ;
16
12
let slice_mut_name = names:: slice_mut_name ( & input. name ) ;
17
13
let ref_name = names:: ref_name ( & input. name ) ;
18
14
let ref_mut_name = names:: ref_mut_name ( & input. name ) ;
15
+ let iter_name = names:: iter_name ( & input. name ) ;
16
+ let iter_mut_name = names:: iter_mut_name ( & input. name ) ;
19
17
18
+ let doc_url = format ! ( "[`{0}`](struct.{0}.html)" , name) ;
20
19
let ref_doc_url = format ! ( "[`{0}`](struct.{0}.html)" , ref_name) ;
21
20
let ref_mut_doc_url = format ! ( "[`{0}`](struct.{0}.html)" , ref_mut_name) ;
22
21
@@ -30,16 +29,16 @@ pub fn derive(input: &Input) -> TokenStream {
30
29
31
30
let iter_type = input. map_fields_nested_or (
32
31
|_, field_type| quote ! { <#field_type as soa_derive:: SoAIter <' a>>:: Iter } ,
33
- |_, field_type| quote ! { slice:: Iter <' a, #field_type> } ,
32
+ |_, field_type| quote ! { :: std :: slice:: Iter <' a, #field_type> } ,
34
33
) . concat_by (
35
- |seq, next| { quote ! { iter:: Zip <#seq, #next> } }
34
+ |seq, next| { quote ! { :: std :: iter:: Zip <#seq, #next> } }
36
35
) ;
37
36
38
37
let iter_mut_type = input. map_fields_nested_or (
39
38
|_, field_type| quote ! { <#field_type as soa_derive:: SoAIter <' a>>:: IterMut } ,
40
- |_, field_type| quote ! { slice:: IterMut <' a, #field_type> } ,
39
+ |_, field_type| quote ! { :: std :: slice:: IterMut <' a, #field_type> } ,
41
40
) . concat_by (
42
- |seq, next| { quote ! { iter:: Zip <#seq, #next> } }
41
+ |seq, next| { quote ! { :: std :: iter:: Zip <#seq, #next> } }
43
42
) ;
44
43
45
44
let create_into_iter = input. map_fields_nested_or (
@@ -56,11 +55,6 @@ pub fn derive(input: &Input) -> TokenStream {
56
55
|seq, next| { quote ! { #seq. zip( #next) } }
57
56
) ;
58
57
59
- let iter_visibility = match visibility {
60
- Visibility :: Inherited => quote ! { pub ( super ) } ,
61
- other => other. to_token_stream ( ) ,
62
- } ;
63
-
64
58
let iter_pat = fields_names. iter ( ) . fold ( None , |seq, ident| {
65
59
if let Some ( seq) = seq {
66
60
Some ( quote ! { ( #seq, #ident) } )
@@ -86,156 +80,153 @@ pub fn derive(input: &Input) -> TokenStream {
86
80
} ) . expect ( "should be Some" ) ;
87
81
88
82
return quote ! {
89
- #[ allow( non_snake_case, dead_code) ]
90
- mod #detail_mod {
91
- use super :: * ;
92
- use std:: slice;
93
- #[ allow( unused_imports) ]
94
- use std:: iter;
95
-
96
- #[ allow( missing_debug_implementations) ]
97
- #iter_visibility struct Iter <' a>( pub ( super ) #iter_type) ;
98
-
99
- impl <' a> Iterator for Iter <' a> {
100
- type Item = #ref_name<' a>;
101
-
102
- #[ inline]
103
- fn next( & mut self ) -> Option <#ref_name<' a>> {
104
- self . 0 . next( ) . and_then( |#iter_pat|
105
- Some ( #ref_name{
106
- #( #fields_names, ) *
107
- } )
108
- )
109
- }
83
+ /// Iterator over
84
+ #[ doc = #doc_url]
85
+ #[ allow( missing_debug_implementations) ]
86
+ #visibility struct #iter_name<' a>( #iter_type) ;
110
87
111
- #[ inline]
112
- fn size_hint( & self ) -> ( usize , Option <usize >) {
113
- self . 0 . size_hint( )
114
- }
88
+ impl <' a> Iterator for #iter_name<' a> {
89
+ type Item = #ref_name<' a>;
90
+
91
+ #[ inline]
92
+ fn next( & mut self ) -> Option <#ref_name<' a>> {
93
+ self . 0 . next( ) . and_then( |#iter_pat|
94
+ Some ( #ref_name{
95
+ #( #fields_names, ) *
96
+ } )
97
+ )
115
98
}
116
99
117
- impl <' a> DoubleEndedIterator for Iter <' a> {
100
+ #[ inline]
101
+ fn size_hint( & self ) -> ( usize , Option <usize >) {
102
+ self . 0 . size_hint( )
103
+ }
104
+ }
118
105
119
- # [ inline ]
120
- fn next_back ( & mut self ) -> Option <#ref_name< ' a>> {
121
- self . 0 . next_back( ) . and_then ( |#iter_pat|
122
- Some ( #ref_name {
123
- # ( #fields_names , ) *
124
- } )
125
- )
126
- }
106
+ impl < ' a> DoubleEndedIterator for #iter_name< ' a> {
107
+ # [ inline ]
108
+ fn next_back( & mut self ) -> Option <#ref_name< ' a>> {
109
+ self . 0 . next_back ( ) . and_then ( |#iter_pat|
110
+ Some ( #ref_name {
111
+ # ( #fields_names , ) *
112
+ } )
113
+ )
127
114
}
128
- impl <' a> ExactSizeIterator for Iter <' a> {
129
- fn len( & self ) -> usize {
130
- self . 0 . len( )
131
- }
115
+ }
116
+
117
+ impl <' a> ExactSizeIterator for #iter_name<' a> {
118
+ fn len( & self ) -> usize {
119
+ self . 0 . len( )
132
120
}
121
+ }
133
122
134
- impl #vec_name {
135
- /// Get an iterator over the
136
- #[ doc = #ref_doc_url]
137
- /// in this vector
138
- #visibility fn iter( & self ) -> Iter {
139
- self . as_slice( ) . into_iter( )
140
- }
123
+ impl #vec_name {
124
+ /// Get an iterator over the
125
+ #[ doc = #ref_doc_url]
126
+ /// in this vector
127
+ pub fn iter( & self ) -> #iter_name {
128
+ self . as_slice( ) . into_iter( )
141
129
}
130
+ }
142
131
143
- impl <' a> #slice_name<' a> {
144
- /// Get an iterator over the
145
- #[ doc = #ref_doc_url]
146
- /// in this slice.
147
- #visibility fn iter( & self ) -> Iter {
148
- Iter ( #create_iter)
149
- }
150
- /// Get an iterator over the
151
- #[ doc = #ref_doc_url]
152
- /// in this slice.
153
- #visibility fn into_iter( self ) -> Iter <' a> {
154
- Iter ( #create_into_iter)
155
- }
132
+ impl <' a> #slice_name<' a> {
133
+ /// Get an iterator over the
134
+ #[ doc = #ref_doc_url]
135
+ /// in this slice.
136
+ pub fn iter( & self ) -> #iter_name {
137
+ #iter_name( #create_iter)
156
138
}
157
139
158
- #[ allow( missing_debug_implementations) ]
159
- #iter_visibility struct IterMut <' a>( pub ( super ) #iter_mut_type) ;
140
+ /// Get an iterator over the
141
+ #[ doc = #ref_doc_url]
142
+ /// in this slice.
143
+ pub fn into_iter( self ) -> #iter_name<' a> {
144
+ #iter_name( #create_into_iter)
145
+ }
146
+ }
160
147
161
- impl <' a> Iterator for IterMut <' a> {
162
- type Item = #ref_mut_name<' a>;
148
+ /// Mutable iterator over
149
+ #[ doc = #doc_url]
150
+ #[ allow( missing_debug_implementations) ]
151
+ #visibility struct #iter_mut_name<' a>( #iter_mut_type) ;
163
152
164
- #[ inline]
165
- fn next( & mut self ) -> Option <#ref_mut_name<' a>> {
166
- self . 0 . next( ) . and_then( |#iter_pat|
167
- Some ( #ref_mut_name{
168
- #( #fields_names, ) *
169
- } )
170
- )
171
- }
153
+ impl <' a> Iterator for #iter_mut_name<' a> {
154
+ type Item = #ref_mut_name<' a>;
172
155
173
- #[ inline]
174
- fn size_hint( & self ) -> ( usize , Option <usize >) {
175
- self . 0 . size_hint( )
176
- }
156
+ #[ inline]
157
+ fn next( & mut self ) -> Option <#ref_mut_name<' a>> {
158
+ self . 0 . next( ) . and_then( |#iter_pat|
159
+ Some ( #ref_mut_name{
160
+ #( #fields_names, ) *
161
+ } )
162
+ )
177
163
}
178
164
179
- impl <' a> DoubleEndedIterator for IterMut <' a> {
165
+ #[ inline]
166
+ fn size_hint( & self ) -> ( usize , Option <usize >) {
167
+ self . 0 . size_hint( )
168
+ }
169
+ }
180
170
181
- # [ inline ]
182
- fn next_back ( & mut self ) -> Option <#ref_mut_name< ' a>> {
183
- self . 0 . next_back( ) . and_then ( |#iter_pat|
184
- Some ( #ref_mut_name {
185
- # ( #fields_names , ) *
186
- } )
187
- )
188
- }
171
+ impl < ' a> DoubleEndedIterator for #iter_mut_name< ' a> {
172
+ # [ inline ]
173
+ fn next_back( & mut self ) -> Option <#ref_mut_name< ' a>> {
174
+ self . 0 . next_back ( ) . and_then ( |#iter_pat|
175
+ Some ( #ref_mut_name {
176
+ # ( #fields_names , ) *
177
+ } )
178
+ )
189
179
}
190
- impl < ' a> ExactSizeIterator for IterMut < ' a> {
191
- fn len ( & self ) -> usize {
192
- self . 0 . len( )
193
- }
180
+ }
181
+ impl < ' a> ExactSizeIterator for #iter_mut_name< ' a> {
182
+ fn len( & self ) -> usize {
183
+ self . 0 . len ( )
194
184
}
185
+ }
195
186
196
- impl #vec_name {
197
- /// Get a mutable iterator over the
198
- #[ doc = #ref_mut_doc_url]
199
- /// in this vector
200
- #visibility fn iter_mut( & mut self ) -> IterMut {
201
- self . as_mut_slice( ) . into_iter( )
202
- }
187
+ impl #vec_name {
188
+ /// Get a mutable iterator over the
189
+ #[ doc = #ref_mut_doc_url]
190
+ /// in this vector
191
+ pub fn iter_mut( & mut self ) -> #iter_mut_name {
192
+ self . as_mut_slice( ) . into_iter( )
203
193
}
194
+ }
204
195
205
- impl <' a> #slice_mut_name<' a> {
206
- /// Get an iterator over the
207
- #[ doc = #ref_doc_url]
208
- /// in this vector
209
- #visibility fn iter( & mut self ) -> Iter {
210
- self . as_ref( ) . into_iter( )
211
- }
196
+ impl <' a> #slice_mut_name<' a> {
197
+ /// Get an iterator over the
198
+ #[ doc = #ref_doc_url]
199
+ /// in this vector
200
+ pub fn iter( & mut self ) -> #iter_name {
201
+ self . as_ref( ) . into_iter( )
202
+ }
212
203
213
- /// Get a mutable iterator over the
214
- #[ doc = #ref_mut_doc_url]
215
- /// in this vector
216
- #visibility fn iter_mut( & mut self ) -> IterMut {
217
- IterMut ( #create_iter_mut)
218
- }
219
- /// Get a mutable iterator over the
220
- #[ doc = #ref_mut_doc_url]
221
- /// in this vector
222
- #visibility fn into_iter( self ) -> IterMut <' a> {
223
- IterMut ( #create_mut_into_iter)
224
- }
204
+ /// Get a mutable iterator over the
205
+ #[ doc = #ref_mut_doc_url]
206
+ /// in this vector
207
+ pub fn iter_mut( & mut self ) -> #iter_mut_name {
208
+ #iter_mut_name( #create_iter_mut)
225
209
}
226
210
227
- impl <' a> soa_derive:: SoAIter <' a> for #name {
228
- type Iter = Iter <' a>;
229
- type IterMut = IterMut <' a>;
211
+ /// Get a mutable iterator over the
212
+ #[ doc = #ref_mut_doc_url]
213
+ /// in this vector
214
+ pub fn into_iter( self ) -> #iter_mut_name<' a> {
215
+ #iter_mut_name( #create_mut_into_iter)
230
216
}
231
217
}
232
218
219
+ impl <' a> soa_derive:: SoAIter <' a> for #name {
220
+ type Iter = #iter_name<' a>;
221
+ type IterMut = #iter_mut_name<' a>;
222
+ }
223
+
233
224
impl <' a> IntoIterator for #slice_name<' a> {
234
225
type Item = #ref_name<' a>;
235
- type IntoIter = #detail_mod :: Iter <' a>;
226
+ type IntoIter = #iter_name <' a>;
236
227
237
228
fn into_iter( self ) -> Self :: IntoIter {
238
- #detail_mod :: Iter ( #create_into_iter)
229
+ #iter_name ( #create_into_iter)
239
230
}
240
231
}
241
232
@@ -252,16 +243,16 @@ pub fn derive(input: &Input) -> TokenStream {
252
243
253
244
impl <' a, ' b> IntoIterator for & ' a #slice_name<' b> {
254
245
type Item = #ref_name<' a>;
255
- type IntoIter = #detail_mod :: Iter <' a>;
246
+ type IntoIter = #iter_name <' a>;
256
247
257
248
fn into_iter( self ) -> Self :: IntoIter {
258
- #detail_mod :: Iter ( #create_into_iter)
249
+ #iter_name ( #create_into_iter)
259
250
}
260
251
}
261
252
262
253
impl <' a> IntoIterator for & ' a #vec_name {
263
254
type Item = #ref_name<' a>;
264
- type IntoIter = #detail_mod :: Iter <' a>;
255
+ type IntoIter = #iter_name <' a>;
265
256
266
257
fn into_iter( self ) -> Self :: IntoIter {
267
258
self . as_slice( ) . into_iter( )
@@ -270,16 +261,16 @@ pub fn derive(input: &Input) -> TokenStream {
270
261
271
262
impl <' a> IntoIterator for #slice_mut_name<' a> {
272
263
type Item = #ref_mut_name<' a>;
273
- type IntoIter = #detail_mod :: IterMut <' a>;
264
+ type IntoIter = #iter_mut_name <' a>;
274
265
275
266
fn into_iter( self ) -> Self :: IntoIter {
276
- #detail_mod :: IterMut ( #create_mut_into_iter)
267
+ #iter_mut_name ( #create_mut_into_iter)
277
268
}
278
269
}
279
270
280
271
impl <' a> IntoIterator for & ' a mut #vec_name {
281
272
type Item = #ref_mut_name<' a>;
282
- type IntoIter = #detail_mod :: IterMut <' a>;
273
+ type IntoIter = #iter_mut_name <' a>;
283
274
284
275
fn into_iter( self ) -> Self :: IntoIter {
285
276
self . as_mut_slice( ) . into_iter( )
0 commit comments