orx_concurrent_vec/common_traits/
into_iter.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
use crate::{ConcurrentElement, ConcurrentVec};
use core::marker::PhantomData;
use orx_fixed_vec::IntoConcurrentPinnedVec;

impl<T, P> IntoIterator for ConcurrentVec<T, P>
where
    P: IntoConcurrentPinnedVec<ConcurrentElement<T>>,
{
    type Item = T;

    type IntoIter = ElementValuesIter<T, P>;

    fn into_iter(self) -> Self::IntoIter {
        let x = self.into_inner();
        let y: P::IntoIter = x.into_iter();
        ElementValuesIter {
            iter: y,
            phantom: PhantomData,
        }
    }
}

/// A consuming iterator yielding values of the vector.
///
/// It can be created by calling `into_iter` on the ConcurrentVec.
///
/// # Examples
///
/// ```
/// use orx_concurrent_vec::*;
///
/// let vec = ConcurrentVec::new();
/// vec.extend(['a', 'b', 'c']);
///
/// let mut iter = vec.into_iter();
/// assert_eq!(iter.next(), Some('a'));
/// assert_eq!(iter.next(), Some('b'));
/// assert_eq!(iter.next(), Some('c'));
/// assert_eq!(iter.next(), None);
/// ```
pub struct ElementValuesIter<T, P>
where
    P: IntoConcurrentPinnedVec<ConcurrentElement<T>>,
{
    iter: P::IntoIter,
    phantom: PhantomData<T>,
}

impl<T, P> Iterator for ElementValuesIter<T, P>
where
    P: IntoConcurrentPinnedVec<ConcurrentElement<T>>,
{
    type Item = T;

    fn next(&mut self) -> Option<Self::Item> {
        self.iter.next().map(|e| e.0.unwrap())
    }
}