Skip to main content

any_vec/
iter.rs

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
13// TODO :Additional [`AnyVec`] Iterator operations.
14/*pub trait AnyVecIterator: Iterator{
15    fn lazy_cloned(self) -> impl
16}*/
17
18pub trait ElementIterator:
19    DoubleEndedIterator + ExactSizeIterator + FusedIterator
20{}
21
22impl<T> ElementIterator for T
23where
24    T: DoubleEndedIterator + ExactSizeIterator + FusedIterator
25{}
26
27/// [`AnyVec`] iterator.
28///
29/// Return [`Element`], [`ElementRef`] or [`ElementMut`] items, depending on `IterItem`.
30/// Cloneable for `Ref` and `Mut` versions.
31///
32/// [`AnyVec`]: crate::AnyVec
33/// [`Element`]: crate::element::Element
34/// [`ElementRef`]: crate::element::ElementRef
35/// [`ElementMut`]: crate::element::ElementMut
36pub 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
182/// Default
183pub 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
195/// Ref
196pub 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
214/// Mut
215pub 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
233/// Reference [`AnyVec`] iterator. Return [`ElementRef`] items.
234///
235/// [`AnyVec`]: crate::AnyVec
236/// [`ElementRef`]: crate::element::ElementRef
237pub type IterRef<'a, Traits, M> = Iter<'a, AnyVecPtr<Traits, M>, ElementRefIterItem<'a, Traits, M>>;
238
239/// Mutable reference [`AnyVec`] iterator. Return [`ElementMut`] items.
240///
241/// [`AnyVec`]: crate::AnyVec
242/// [`ElementMut`]: crate::element::ElementMut
243pub type IterMut<'a, Traits, M> = Iter<'a, AnyVecPtr<Traits, M>, ElementMutIterItem<'a, Traits, M>>;