orx_concurrent_queue/common_traits/iter/
iter_owned.rs1use orx_pinned_vec::ConcurrentPinnedVec;
2
3pub 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}