@@ -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