1use core::iter::{FusedIterator};
2use core::marker::PhantomData;
3use core::mem::ManuallyDrop;
4use core::ptr::NonNull;
5use crate::any_vec_ptr::{AnyVecPtr, AnyVecRawPtr, IAnyVecRawPtr};
6use crate::any_vec_ptr::utils::element_ptr_at;
7use crate::any_vec_raw::AnyVecRaw;
8use crate::{AnyVec, AnyVecTyped};
9use crate::element::{ElementPointer, ElementMut, ElementRef};
10use crate::mem::MemBuilder;
11use crate::traits::Trait;
12
13pub trait ElementIterator:
19 DoubleEndedIterator + ExactSizeIterator + FusedIterator
20{}
21
22impl<T> ElementIterator for T
23where
24 T: DoubleEndedIterator + ExactSizeIterator + FusedIterator
25{}
26
27pub struct Iter<'a,
37 AnyVecPtr: IAnyVecRawPtr,
38 IterItem: IteratorItem<'a, AnyVecPtr> = ElementIterItem<'a, AnyVecPtr>>
39{
40 pub(crate) any_vec_ptr: AnyVecPtr,
41
42 pub(crate) index: usize,
43 pub(crate) end: usize,
44
45 phantom: PhantomData<(&'a AnyVecRaw<AnyVecPtr::M>, IterItem)>
46}
47
48impl<'a, AnyVecPtr: IAnyVecRawPtr, IterItem: IteratorItem<'a, AnyVecPtr>>
49 Iter<'a, AnyVecPtr, IterItem>
50{
51 #[inline]
52 pub(crate) fn new(any_vec_ptr: AnyVecPtr, start: usize, end: usize) -> Self {
53 Self{any_vec_ptr, index: start, end, phantom: PhantomData}
54 }
55}
56
57impl<'a, AnyVecPtr: IAnyVecRawPtr, IterItem: IteratorItem<'a, AnyVecPtr> + Clone>
58 Clone
59for
60 Iter<'a, AnyVecPtr, IterItem>
61{
62 #[inline]
63 fn clone(&self) -> Self {
64 Self{
65 any_vec_ptr: self.any_vec_ptr,
66 index: self.index,
67 end: self.end,
68 phantom: PhantomData
69 }
70 }
71}
72
73impl<'a, AnyVecPtr: IAnyVecRawPtr, IterItem: IteratorItem<'a, AnyVecPtr>> Iterator
74 for Iter<'a, AnyVecPtr, IterItem>
75{
76 type Item = IterItem::Item;
77
78 #[inline]
79 fn next(&mut self) -> Option<Self::Item> {
80 if self.index == self.end{
81 None
82 } else {
83 let element = ElementPointer::new(
84 self.any_vec_ptr,
85 unsafe{NonNull::new_unchecked(
86 element_ptr_at(self.any_vec_ptr, self.index) as *mut u8
87 )}
88 );
89
90 self.index += 1;
91 Some(IterItem::element_to_item(element))
92 }
93 }
94
95 #[inline]
96 fn size_hint(&self) -> (usize, Option<usize>) {
97 let size = self.end - self.index;
98 (size, Some(size))
99 }
100}
101
102impl<'a, AnyVecPtr: IAnyVecRawPtr, IterItem: IteratorItem<'a, AnyVecPtr>> DoubleEndedIterator
103 for Iter<'a, AnyVecPtr, IterItem>
104{
105 #[inline]
106 fn next_back(&mut self) -> Option<Self::Item> {
107 if self.end == self.index{
108 None
109 } else {
110 self.end -= 1;
111 let element = ElementPointer::new(
112 self.any_vec_ptr,
113 unsafe{NonNull::new_unchecked(
114 element_ptr_at(self.any_vec_ptr, self.end) as *mut u8
115 )}
116 );
117
118 Some(IterItem::element_to_item(element))
119 }
120 }
121}
122
123impl<'a, AnyVecPtr: IAnyVecRawPtr, IterItem: IteratorItem<'a, AnyVecPtr>> ExactSizeIterator
124 for Iter<'a, AnyVecPtr, IterItem>
125{
126 #[inline]
127 fn len(&self) -> usize {
128 self.end - self.index
129 }
130}
131
132impl<'a, AnyVecPtr: IAnyVecRawPtr, IterItem: IteratorItem<'a, AnyVecPtr>> FusedIterator
133 for Iter<'a, AnyVecPtr, IterItem>
134{}
135
136
137#[allow(renamed_and_removed_lints, suspicious_auto_trait_impls)]
138unsafe impl<'a, Traits, M, IterItem> Send
139for
140 Iter<'a, AnyVecPtr<Traits, M>, IterItem>
141where
142 Traits: ?Sized + Trait,
143 M: MemBuilder,
144 IterItem: IteratorItem<'a, AnyVecPtr<Traits, M>>,
145 AnyVec<Traits, M>: Send
146{}
147#[allow(renamed_and_removed_lints, suspicious_auto_trait_impls)]
148unsafe impl<'a, T, M, IterItem> Send
149for
150 Iter<'a, AnyVecRawPtr<T, M>, IterItem>
151where
152 M: MemBuilder,
153 IterItem: IteratorItem<'a, AnyVecRawPtr<T, M>>,
154 AnyVecTyped<'a, T, M>: Send
155{}
156
157unsafe impl<'a, Traits, M, IterItem> Sync
158for
159 Iter<'a, AnyVecPtr<Traits, M>, IterItem>
160where
161 Traits: ?Sized + Trait,
162 M: MemBuilder,
163 IterItem: IteratorItem<'a, AnyVecPtr<Traits, M>>,
164 AnyVec<Traits, M>: Sync
165{}
166unsafe impl<'a, T, M, IterItem> Sync
167for
168 Iter<'a, AnyVecRawPtr<T, M>, IterItem>
169where
170 T: Sync,
171 M: MemBuilder,
172 IterItem: IteratorItem<'a, AnyVecRawPtr<T, M>>,
173 AnyVecTyped<'a, T, M>: Sync
174{}
175
176
177pub trait IteratorItem<'a, AnyVecPtr: IAnyVecRawPtr>{
178 type Item;
179 fn element_to_item(element: ElementPointer<'a, AnyVecPtr>) -> Self::Item;
180}
181
182pub struct ElementIterItem<'a, AnyVecPtr: IAnyVecRawPtr>(
184 pub(crate) PhantomData<ElementPointer<'a, AnyVecPtr>>
185);
186impl<'a, AnyVecPtr: IAnyVecRawPtr> IteratorItem<'a, AnyVecPtr> for ElementIterItem<'a, AnyVecPtr>{
187 type Item = ElementPointer<'a, AnyVecPtr>;
188
189 #[inline]
190 fn element_to_item(element: ElementPointer<'a, AnyVecPtr>) -> Self::Item {
191 element
192 }
193}
194
195pub struct ElementRefIterItem<'a, Traits: ?Sized + Trait, M: MemBuilder>(
197 pub(crate) PhantomData<ElementPointer<'a, AnyVecPtr<Traits, M>>>
198);
199impl<'a, Traits: ?Sized + Trait, M: MemBuilder> IteratorItem<'a, AnyVecPtr<Traits, M>> for ElementRefIterItem<'a, Traits, M>{
200 type Item = ElementRef<'a, Traits, M>;
201
202 #[inline]
203 fn element_to_item(element: ElementPointer<'a, AnyVecPtr<Traits, M>>) -> Self::Item {
204 ElementRef(ManuallyDrop::new(element))
205 }
206}
207impl<'a, Traits: ?Sized + Trait, M: MemBuilder> Clone for ElementRefIterItem<'a, Traits, M>{
208 fn clone(&self) -> Self {
209 Self(PhantomData)
210 }
211}
212
213
214pub struct ElementMutIterItem<'a, Traits: ?Sized + Trait, M: MemBuilder>(
216 pub(crate) PhantomData<ElementPointer<'a, AnyVecPtr<Traits, M>>>
217);
218impl<'a, Traits: ?Sized + Trait, M: MemBuilder> IteratorItem<'a, AnyVecPtr<Traits, M>> for ElementMutIterItem<'a, Traits, M>{
219 type Item = ElementMut<'a, Traits, M>;
220
221 #[inline]
222 fn element_to_item(element: ElementPointer<'a, AnyVecPtr<Traits, M>>) -> Self::Item {
223 ElementMut(ManuallyDrop::new(element))
224 }
225}
226impl<'a, Traits: ?Sized + Trait, M: MemBuilder> Clone for ElementMutIterItem<'a, Traits, M>{
227 fn clone(&self) -> Self {
228 Self(PhantomData)
229 }
230}
231
232
233pub type IterRef<'a, Traits, M> = Iter<'a, AnyVecPtr<Traits, M>, ElementRefIterItem<'a, Traits, M>>;
238
239pub type IterMut<'a, Traits, M> = Iter<'a, AnyVecPtr<Traits, M>, ElementMutIterItem<'a, Traits, M>>;