opencv/manual/core/vector/
iter.rs1use std::iter::FusedIterator;
2
3use crate::core::{Vector, VectorExtern};
4use crate::platform_types::size_t;
5use crate::traits::OpenCVFromExtern;
6
7impl<T: OpenCVFromExtern> IntoIterator for Vector<T>
8where
9 Vector<T>: VectorExtern<T>,
10{
11 type Item = T;
12 type IntoIter = VectorIterator<T>;
13
14 #[inline]
15 fn into_iter(self) -> VectorIterator<T> {
16 Self::IntoIter::new(self)
17 }
18}
19
20impl<'v, T: OpenCVFromExtern> IntoIterator for &'v Vector<T>
21where
22 Vector<T>: VectorExtern<T>,
23{
24 type Item = T;
25 type IntoIter = VectorRefIterator<'v, T>;
26
27 #[inline]
28 fn into_iter(self) -> VectorRefIterator<'v, T> {
29 self.iter()
30 }
31}
32
33pub struct VectorIterator<T>
34where
35 Vector<T>: VectorExtern<T>,
36{
37 vec: Vector<T>,
38 start: size_t,
39 end: size_t,
40}
41
42impl<T> VectorIterator<T>
43where
44 Vector<T>: VectorExtern<T>,
45{
46 #[inline]
47 pub fn new(vec: Vector<T>) -> Self {
48 Self {
49 end: vec.len(),
50 vec,
51 start: 0,
52 }
53 }
54}
55
56impl<T: OpenCVFromExtern> Iterator for VectorIterator<T>
57where
58 Vector<T>: VectorExtern<T>,
59{
60 type Item = T;
61
62 #[inline]
63 fn next(&mut self) -> Option<Self::Item> {
64 #![allow(clippy::iter_nth_zero)]
65 self.nth(0)
66 }
67
68 #[inline]
69 fn size_hint(&self) -> (usize, Option<usize>) {
70 let len = self.len();
71 (len, Some(len))
72 }
73
74 #[inline]
75 fn nth(&mut self, n: usize) -> Option<Self::Item> {
76 self.start = self.start.saturating_add(n);
77 if self.start < self.end {
78 let out = Some(unsafe { self.vec.get_unchecked(self.start) });
79 self.start += 1;
80 out
81 } else {
82 None
83 }
84 }
85}
86
87impl<T: OpenCVFromExtern> DoubleEndedIterator for VectorIterator<T>
88where
89 Vector<T>: VectorExtern<T>,
90{
91 #[inline]
92 fn next_back(&mut self) -> Option<Self::Item> {
93 self.nth_back(0)
94 }
95
96 #[inline]
97 fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
98 self.end = self.end.saturating_sub(n);
99 if self.start < self.end {
100 let out = Some(unsafe { self.vec.get_unchecked(self.end - 1) });
101 self.end -= 1;
102 out
103 } else {
104 None
105 }
106 }
107}
108
109impl<T: OpenCVFromExtern> ExactSizeIterator for VectorIterator<T>
110where
111 Vector<T>: VectorExtern<T>,
112{
113 #[inline]
114 fn len(&self) -> usize {
115 self.end - self.start
116 }
117}
118
119impl<T: OpenCVFromExtern> FusedIterator for VectorIterator<T> where Vector<T>: VectorExtern<T> {}
120
121pub struct VectorRefIterator<'v, T>
122where
123 Vector<T>: VectorExtern<T>,
124{
125 vec: &'v Vector<T>,
126 start: size_t,
127 end: size_t,
128}
129
130impl<'v, T> VectorRefIterator<'v, T>
131where
132 Vector<T>: VectorExtern<T>,
133{
134 #[inline]
135 pub fn new(vec: &'v Vector<T>) -> Self {
136 Self {
137 end: vec.len(),
138 vec,
139 start: 0,
140 }
141 }
142}
143
144impl<T: OpenCVFromExtern> Iterator for VectorRefIterator<'_, T>
145where
146 Vector<T>: VectorExtern<T>,
147{
148 type Item = T;
149
150 #[inline]
151 fn next(&mut self) -> Option<Self::Item> {
152 #![allow(clippy::iter_nth_zero)]
153 self.nth(0)
154 }
155
156 #[inline]
157 fn size_hint(&self) -> (usize, Option<usize>) {
158 let len = self.len();
159 (len, Some(len))
160 }
161
162 #[inline]
163 fn nth(&mut self, n: usize) -> Option<Self::Item> {
164 self.start += n;
165 if self.start < self.end {
166 let out = Some(unsafe { self.vec.get_unchecked(self.start) });
167 self.start += 1;
168 out
169 } else {
170 None
171 }
172 }
173}
174
175impl<T: OpenCVFromExtern> DoubleEndedIterator for VectorRefIterator<'_, T>
176where
177 Vector<T>: VectorExtern<T>,
178{
179 #[inline]
180 fn next_back(&mut self) -> Option<Self::Item> {
181 self.nth_back(0)
182 }
183
184 #[inline]
185 fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
186 self.end -= n;
187 if self.start < self.end {
188 let out = Some(unsafe { self.vec.get_unchecked(self.end - 1) });
189 self.end -= 1;
190 out
191 } else {
192 None
193 }
194 }
195}
196
197impl<T: OpenCVFromExtern> ExactSizeIterator for VectorRefIterator<'_, T>
198where
199 Vector<T>: VectorExtern<T>,
200{
201 #[inline]
202 fn len(&self) -> usize {
203 self.end - self.start
204 }
205}
206
207impl<T: OpenCVFromExtern> FusedIterator for VectorRefIterator<'_, T> where Vector<T>: VectorExtern<T> {}
208
209impl<T> Clone for VectorRefIterator<'_, T>
210where
211 Vector<T>: VectorExtern<T>,
212{
213 #[inline]
214 fn clone(&self) -> Self {
215 Self { ..*self }
216 }
217}