Skip to content

Commit 9c12ccc

Browse files
committed
Don't use a __details module to define iterators
1 parent 8979d87 commit 9c12ccc

File tree

2 files changed

+139
-138
lines changed

2 files changed

+139
-138
lines changed

soa-derive-internal/src/iter.rs

+129-138
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
use proc_macro2::{Span, TokenStream};
2-
use syn::{Ident, Visibility};
3-
4-
use quote::ToTokens;
1+
use proc_macro2::TokenStream;
52
use quote::quote;
63

74
use crate::input::{Input, TokenStreamIterator};
@@ -10,13 +7,15 @@ use crate::names;
107
pub fn derive(input: &Input) -> TokenStream {
118
let name = &input.name;
129
let visibility = &input.visibility;
13-
let detail_mod = Ident::new(&format!("__detail_iter_{}", name.to_string().to_lowercase()), Span::call_site());
1410
let vec_name = names::vec_name(&input.name);
1511
let slice_name = names::slice_name(name);
1612
let slice_mut_name = names::slice_mut_name(&input.name);
1713
let ref_name = names::ref_name(&input.name);
1814
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);
1917

18+
let doc_url = format!("[`{0}`](struct.{0}.html)", name);
2019
let ref_doc_url = format!("[`{0}`](struct.{0}.html)", ref_name);
2120
let ref_mut_doc_url = format!("[`{0}`](struct.{0}.html)", ref_mut_name);
2221

@@ -30,16 +29,16 @@ pub fn derive(input: &Input) -> TokenStream {
3029

3130
let iter_type = input.map_fields_nested_or(
3231
|_, 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> },
3433
).concat_by(
35-
|seq, next| { quote! { iter::Zip<#seq, #next> } }
34+
|seq, next| { quote! { ::std::iter::Zip<#seq, #next> } }
3635
);
3736

3837
let iter_mut_type = input.map_fields_nested_or(
3938
|_, 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> },
4140
).concat_by(
42-
|seq, next| { quote! { iter::Zip<#seq, #next> } }
41+
|seq, next| { quote! { ::std::iter::Zip<#seq, #next> } }
4342
);
4443

4544
let create_into_iter = input.map_fields_nested_or(
@@ -56,11 +55,6 @@ pub fn derive(input: &Input) -> TokenStream {
5655
|seq, next| { quote! { #seq.zip(#next) } }
5756
);
5857

59-
let iter_visibility = match visibility {
60-
Visibility::Inherited => quote!{pub(super)},
61-
other => other.to_token_stream(),
62-
};
63-
6458
let iter_pat = fields_names.iter().fold(None, |seq, ident| {
6559
if let Some(seq) = seq {
6660
Some(quote! { (#seq, #ident) })
@@ -86,156 +80,153 @@ pub fn derive(input: &Input) -> TokenStream {
8680
}).expect("should be Some");
8781

8882
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);
11087

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+
)
11598
}
11699

117-
impl<'a> DoubleEndedIterator for Iter<'a> {
100+
#[inline]
101+
fn size_hint(&self) -> (usize, Option<usize>) {
102+
self.0.size_hint()
103+
}
104+
}
118105

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+
)
127114
}
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()
132120
}
121+
}
133122

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()
141129
}
130+
}
142131

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)
156138
}
157139

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+
}
160147

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);
163152

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>;
172155

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+
)
177163
}
178164

179-
impl<'a> DoubleEndedIterator for IterMut<'a> {
165+
#[inline]
166+
fn size_hint(&self) -> (usize, Option<usize>) {
167+
self.0.size_hint()
168+
}
169+
}
180170

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+
)
189179
}
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()
194184
}
185+
}
195186

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()
203193
}
194+
}
204195

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+
}
212203

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)
225209
}
226210

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)
230216
}
231217
}
232218

219+
impl<'a> soa_derive::SoAIter<'a> for #name {
220+
type Iter = #iter_name<'a>;
221+
type IterMut = #iter_mut_name<'a>;
222+
}
223+
233224
impl<'a> IntoIterator for #slice_name<'a> {
234225
type Item = #ref_name<'a>;
235-
type IntoIter = #detail_mod::Iter<'a>;
226+
type IntoIter = #iter_name<'a>;
236227

237228
fn into_iter(self) -> Self::IntoIter {
238-
#detail_mod::Iter(#create_into_iter)
229+
#iter_name(#create_into_iter)
239230
}
240231
}
241232

@@ -252,16 +243,16 @@ pub fn derive(input: &Input) -> TokenStream {
252243

253244
impl<'a, 'b> IntoIterator for &'a #slice_name<'b> {
254245
type Item = #ref_name<'a>;
255-
type IntoIter = #detail_mod::Iter<'a>;
246+
type IntoIter = #iter_name<'a>;
256247

257248
fn into_iter(self) -> Self::IntoIter {
258-
#detail_mod::Iter(#create_into_iter)
249+
#iter_name(#create_into_iter)
259250
}
260251
}
261252

262253
impl<'a> IntoIterator for &'a #vec_name {
263254
type Item = #ref_name<'a>;
264-
type IntoIter = #detail_mod::Iter<'a>;
255+
type IntoIter = #iter_name<'a>;
265256

266257
fn into_iter(self) -> Self::IntoIter {
267258
self.as_slice().into_iter()
@@ -270,16 +261,16 @@ pub fn derive(input: &Input) -> TokenStream {
270261

271262
impl<'a> IntoIterator for #slice_mut_name<'a> {
272263
type Item = #ref_mut_name<'a>;
273-
type IntoIter = #detail_mod::IterMut<'a>;
264+
type IntoIter = #iter_mut_name<'a>;
274265

275266
fn into_iter(self) -> Self::IntoIter {
276-
#detail_mod::IterMut(#create_mut_into_iter)
267+
#iter_mut_name(#create_mut_into_iter)
277268
}
278269
}
279270

280271
impl<'a> IntoIterator for &'a mut #vec_name {
281272
type Item = #ref_mut_name<'a>;
282-
type IntoIter = #detail_mod::IterMut<'a>;
273+
type IntoIter = #iter_mut_name<'a>;
283274

284275
fn into_iter(self) -> Self::IntoIter {
285276
self.as_mut_slice().into_iter()

soa-derive-internal/src/names.rs

+10
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,16 @@ pub fn ref_mut_name(name: impl ToTokens) -> Ident {
2727
Ident::new(&format!("{}RefMut", name.to_token_stream()), Span::call_site())
2828
}
2929

30+
/// Get the ident for the iterator type associated with `name`
31+
pub fn iter_name(name: impl ToTokens) -> Ident {
32+
Ident::new(&format!("{}Iter", name.to_token_stream()), Span::call_site())
33+
}
34+
35+
/// Get the ident for the mutable iterator type associated with `name`
36+
pub fn iter_mut_name(name: impl ToTokens) -> Ident {
37+
Ident::new(&format!("{}IterMut", name.to_token_stream()), Span::call_site())
38+
}
39+
3040
/// Get the ident for the pointer type associated with `name`
3141
pub fn ptr_name(name: impl ToTokens) -> Ident {
3242
Ident::new(&format!("{}Ptr", name.to_token_stream()), Span::call_site())

0 commit comments

Comments
 (0)