orx_concurrent_queue/common_traits/iter/
iter_owned.rs

1use orx_pinned_vec::ConcurrentPinnedVec;
2
3/// An iterator over owned elements of the concurrent queue created over a given range.
4pub struct QueueIterOwned<'a, T, P>
5where
6    T: Send + 'a,
7    P: ConcurrentPinnedVec<T> + 'a,
8{
9    iter: P::PtrIter<'a>,
10}
11
12impl<'a, T, P> Default for QueueIterOwned<'a, T, P>
13where
14    T: Send + 'a,
15    P: ConcurrentPinnedVec<T> + 'a,
16    <P as ConcurrentPinnedVec<T>>::PtrIter<'a>: Default,
17{
18    fn default() -> Self {
19        Self {
20            iter: Default::default(),
21        }
22    }
23}
24
25impl<'a, T, P> QueueIterOwned<'a, T, P>
26where
27    T: Send + 'a,
28    P: ConcurrentPinnedVec<T> + 'a,
29{
30    pub(crate) fn new(iter: P::PtrIter<'a>) -> Self {
31        Self { iter }
32    }
33}
34
35impl<'a, T, P> Iterator for QueueIterOwned<'a, T, P>
36where
37    T: Send + 'a,
38    P: ConcurrentPinnedVec<T> + 'a,
39{
40    type Item = T;
41
42    #[inline(always)]
43    fn next(&mut self) -> Option<Self::Item> {
44        self.iter.next().map(|ptr| unsafe { ptr.read() })
45    }
46
47    fn size_hint(&self) -> (usize, Option<usize>) {
48        self.iter.size_hint()
49    }
50}
51
52impl<'a, T, P> ExactSizeIterator for QueueIterOwned<'a, T, P>
53where
54    T: Send + 'a,
55    P: ConcurrentPinnedVec<T> + 'a,
56{
57    fn len(&self) -> usize {
58        self.iter.len()
59    }
60}
61
62impl<'a, T, P> Drop for QueueIterOwned<'a, T, P>
63where
64    T: Send + 'a,
65    P: ConcurrentPinnedVec<T> + 'a,
66{
67    fn drop(&mut self) {
68        for ptr in self.iter.by_ref() {
69            unsafe { ptr.drop_in_place() };
70        }
71    }
72}