soapy/
iter.rs

1use crate::{
2    iter_raw::{iter_with_raw, IterRaw, IterRawAdapter},
3    Slice, SoaRaw, Soapy,
4};
5use std::{
6    fmt::{self, Debug, Formatter},
7    iter::FusedIterator,
8    marker::PhantomData,
9};
10
11/// Immutable [`Slice`] iterator.
12///
13/// This struct is created by the [`iter`] method.
14///
15/// [`Slice`]: crate::Slice
16/// [`iter`]: crate::Slice::iter
17pub struct Iter<'a, T>
18where
19    T: 'a + Soapy,
20{
21    pub(crate) iter_raw: IterRaw<T, Self>,
22    pub(crate) _marker: PhantomData<&'a T>,
23}
24
25impl<'a, T> Debug for Iter<'a, T>
26where
27    T: Soapy,
28    for<'b> T::Ref<'b>: Debug,
29{
30    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
31        write!(f, "{:?}", self.as_slice())
32    }
33}
34
35impl<'a, T> Default for Iter<'a, T>
36where
37    T: Soapy,
38{
39    fn default() -> Self {
40        Self {
41            iter_raw: IterRaw {
42                slice: Slice::empty(),
43                len: 0,
44                adapter: PhantomData,
45            },
46            _marker: PhantomData,
47        }
48    }
49}
50
51impl<'a, T> Clone for Iter<'a, T>
52where
53    T: Soapy,
54{
55    fn clone(&self) -> Self {
56        Self {
57            iter_raw: self.iter_raw,
58            _marker: PhantomData,
59        }
60    }
61}
62
63impl<'a, T> Iter<'a, T>
64where
65    T: Soapy,
66{
67    /// Returns an immutable slice of all elements that have not been yielded
68    /// yet.
69    pub fn as_slice(&self) -> &'a Slice<T> {
70        unsafe { self.iter_raw.as_slice() }
71    }
72}
73
74impl<'a, T> IterRawAdapter<T> for Iter<'a, T>
75where
76    T: Soapy,
77{
78    type Item = T::Ref<'a>;
79
80    fn item_from_raw(raw: T::Raw) -> Self::Item {
81        unsafe { raw.get_ref() }
82    }
83}
84
85iter_with_raw!(Iter<'a, T>, 'a);