1use crate::{SliceBorrowed, SliceOwned};
2
3#[derive(Debug, Clone, Copy)]
5pub struct IterOwned<S> {
6 pub data: S,
8
9 start: usize,
10 end: usize,
11}
12
13impl<S> IterOwned<S>
14where
15 S: SliceOwned,
16{
17 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#[derive(Debug, Clone, Copy)]
67pub struct IterBorrowed<'a, S: ?Sized> {
68 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 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 {}