slice_utils/
iter.rs

1use crate::{SliceBorrowed, SliceOwned};
2
3/// An iterator over a slice; see [`SliceOwned::iter`].
4#[derive(Debug, Clone, Copy)]
5pub struct IterOwned<S> {
6    /// The inner slice of the iterator.
7    pub data: S,
8
9    start: usize,
10    end: usize,
11}
12
13impl<S> IterOwned<S>
14where
15    S: SliceOwned,
16{
17    /// Creates a new iterator; see [`SliceOwned::iter`].
18    pub fn new(data: S) -> Self {
19        Self {
20            start: 0,
21            end: data.len(),
22            data,
23        }
24    }
25}
26
27impl<S> Iterator for IterOwned<S>
28where
29    S: SliceOwned,
30{
31    type Item = S::Output;
32
33    fn next(&mut self) -> Option<Self::Item> {
34        if self.start == self.end {
35            None
36        } else {
37            let x = self.data.get_owned(self.start)?;
38            self.start += 1;
39            Some(x)
40        }
41    }
42
43    fn size_hint(&self) -> (usize, Option<usize>) {
44        (self.data.len(), Some(self.data.len()))
45    }
46}
47
48impl<S> DoubleEndedIterator for IterOwned<S>
49where
50    S: SliceOwned,
51{
52    fn next_back(&mut self) -> Option<Self::Item> {
53        if self.start == self.end {
54            None
55        } else {
56            self.end -= 1;
57            let x = self.data.get_owned(self.end)?;
58            Some(x)
59        }
60    }
61}
62
63impl<S> ExactSizeIterator for IterOwned<S> where S: SliceOwned {}
64
65/// An iterator over a slice; see [`SliceBorrowed::iter`].
66#[derive(Debug, Clone, Copy)]
67pub struct IterBorrowed<'a, S: ?Sized> {
68    /// The inner slice of the iterator.
69    pub data: &'a S,
70
71    start: usize,
72    end: usize,
73}
74
75impl<'a, S> IterBorrowed<'a, S>
76where
77    S: SliceBorrowed + ?Sized,
78{
79    /// Creates a new iterator; see [`SliceBorrowed::iter`].
80    pub fn new(data: &'a S) -> Self {
81        Self {
82            data,
83
84            start: 0,
85            end: data.len(),
86        }
87    }
88}
89
90impl<'a, S> Iterator for IterBorrowed<'a, S>
91where
92    S: SliceBorrowed + ?Sized,
93{
94    type Item = &'a S::Output;
95
96    fn next(&mut self) -> Option<Self::Item> {
97        if self.start == self.end {
98            None
99        } else {
100            let x = self.data.get(self.start)?;
101            self.start += 1;
102            Some(x)
103        }
104    }
105
106    fn size_hint(&self) -> (usize, Option<usize>) {
107        (self.data.len(), Some(self.data.len()))
108    }
109}
110
111impl<'a, S> DoubleEndedIterator for IterBorrowed<'a, S>
112where
113    S: SliceBorrowed,
114{
115    fn next_back(&mut self) -> Option<Self::Item> {
116        if self.start == self.end {
117            None
118        } else {
119            self.end -= 1;
120            let x = self.data.get(self.end)?;
121            Some(x)
122        }
123    }
124}
125
126impl<'a, S> ExactSizeIterator for IterBorrowed<'a, S> where S: SliceBorrowed {}