orx_concurrent_queue/common_traits/
into_iter.rs

1use crate::ConcurrentQueue;
2use orx_pinned_vec::{ConcurrentPinnedVec, IntoConcurrentPinnedVec};
3
4impl<T, P> IntoIterator for ConcurrentQueue<T, P>
5where
6    T: Send,
7    P: ConcurrentPinnedVec<T>,
8    <P as ConcurrentPinnedVec<T>>::P: IntoConcurrentPinnedVec<T, ConPinnedVec = P>,
9{
10    type Item = T;
11
12    type IntoIter = P::IntoIter;
13
14    fn into_iter(mut self) -> Self::IntoIter {
15        let range = self.valid_range();
16        // SAFETY: we destruct the queue and immediately convert it into iter over the valid range.
17        let convec = unsafe { self.destruct() }.0;
18        // SAFETY: range is the only place with valid elements; positions on other sections
19        // are either not initialized or popped.
20        unsafe { convec.into_iter(range) }
21    }
22}