opencv/manual/core/vector/
iter.rs

1use 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}