Skip to content

Commit b5726b3

Browse files
committed
Improve Vector: simplify trait bounds, add DoubleEndedIterator impl
1 parent 0469db8 commit b5726b3

File tree

4 files changed

+175
-55
lines changed

4 files changed

+175
-55
lines changed

src/manual/core/vector.rs

Lines changed: 46 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,22 @@ pub use vector_extern::{VectorExtern, VectorExternCopyNonBool};
1010

1111
use crate::boxed_ref::BoxedRef;
1212
use crate::platform_types::size_t;
13-
use crate::traits::{Boxed, OpenCVIntoExternContainer, OpenCVType, OpenCVTypeExternContainer};
13+
use crate::traits::{Boxed, OpenCVFromExtern, OpenCVIntoExternContainer, OpenCVType, OpenCVTypeExternContainer};
1414
use crate::Result;
1515

1616
mod iter;
1717
mod vector_extern;
1818

1919
/// Wrapper for C++ [std::vector](https://en.cppreference.com/w/cpp/container/vector)
20-
pub struct Vector<T: for<'o> OpenCVType<'o>>
20+
pub struct Vector<T>
2121
where
2222
Self: VectorExtern<T>,
2323
{
2424
ptr: *mut c_void,
2525
_d: PhantomData<T>,
2626
}
2727

28-
impl<T: for<'o> OpenCVType<'o>> Vector<T>
28+
impl<T> Vector<T>
2929
where
3030
Self: VectorExtern<T>,
3131
{
@@ -45,7 +45,10 @@ where
4545

4646
/// Create a Vector from iterator
4747
#[inline]
48-
pub fn from_iter<'a>(s: impl IntoIterator<Item = <T as OpenCVType<'a>>::Arg>) -> Self {
48+
pub fn from_iter<'a>(s: impl IntoIterator<Item = <T as OpenCVType<'a>>::Arg>) -> Self
49+
where
50+
T: for<'t> OpenCVType<'t>,
51+
{
4952
#![allow(clippy::should_implement_trait)]
5053
let mut out = Self::new();
5154
out.extend(s);
@@ -64,6 +67,7 @@ where
6467
#[inline]
6568
pub fn from_elem<'a>(elem: <T as OpenCVType<'a>>::Arg, n: size_t) -> Self
6669
where
70+
T: for<'t> OpenCVType<'t>,
6771
<T as OpenCVType<'a>>::Arg: Clone,
6872
{
6973
let mut out = Self::with_capacity(n);
@@ -131,20 +135,29 @@ where
131135

132136
/// Add new element
133137
#[inline]
134-
pub fn push(&mut self, val: <T as OpenCVType>::Arg) {
138+
pub fn push(&mut self, val: <T as OpenCVType>::Arg)
139+
where
140+
T: for<'t> OpenCVType<'t>,
141+
{
135142
let val = val.opencv_into_extern_container_nofail();
136143
unsafe { self.extern_push(val.opencv_as_extern()) }
137144
}
138145

139146
#[inline]
140-
pub(crate) fn push_owned(&mut self, val: T) {
147+
pub(crate) fn push_owned(&mut self, val: T)
148+
where
149+
T: OpenCVIntoExternContainer,
150+
{
141151
let val = val.opencv_into_extern_container_nofail();
142152
unsafe { self.extern_push_owned(val.opencv_as_extern()) }
143153
}
144154

145155
/// Insert a new element at the specified `index`
146156
#[inline]
147-
pub fn insert(&mut self, index: size_t, val: <T as OpenCVType>::Arg) -> Result<()> {
157+
pub fn insert(&mut self, index: size_t, val: <T as OpenCVType>::Arg) -> Result<()>
158+
where
159+
T: for<'t> OpenCVType<'t>,
160+
{
148161
vector_index_check(index, self.len() + 1)?;
149162
let val = val.opencv_into_extern_container()?;
150163
unsafe { self.extern_insert(index, val.opencv_as_extern()) }
@@ -153,7 +166,10 @@ where
153166

154167
/// Set element at the specified `index`
155168
#[inline]
156-
pub fn set(&mut self, index: size_t, val: <T as OpenCVType>::Arg) -> Result<()> {
169+
pub fn set(&mut self, index: size_t, val: <T as OpenCVType>::Arg) -> Result<()>
170+
where
171+
T: for<'t> OpenCVType<'t>,
172+
{
157173
vector_index_check(index, self.len())?;
158174
let val = val.opencv_into_extern_container()?;
159175
unsafe { self.extern_set(index, val.opencv_as_extern()) }
@@ -164,14 +180,20 @@ where
164180
/// # Safety
165181
/// Caller must ensure that the specified `index` is within the `Vector` bounds
166182
#[inline]
167-
pub unsafe fn set_unchecked(&mut self, index: size_t, val: <T as OpenCVType>::Arg) {
183+
pub unsafe fn set_unchecked(&mut self, index: size_t, val: <T as OpenCVType>::Arg)
184+
where
185+
T: for<'t> OpenCVType<'t>,
186+
{
168187
let val = val.opencv_into_extern_container_nofail();
169188
self.extern_set(index, val.opencv_as_extern())
170189
}
171190

172191
/// Get element at the specified `index`
173192
#[inline]
174-
pub fn get(&self, index: size_t) -> Result<T> {
193+
pub fn get(&self, index: size_t) -> Result<T>
194+
where
195+
T: OpenCVFromExtern,
196+
{
175197
vector_index_check(index, self.len())?;
176198
Ok(unsafe { self.get_unchecked(index) })
177199
}
@@ -180,7 +202,10 @@ where
180202
/// # Safety
181203
/// Caller must ensure that the specified `index` is within the `Vector` bounds
182204
#[inline]
183-
pub unsafe fn get_unchecked(&self, index: size_t) -> T {
205+
pub unsafe fn get_unchecked(&self, index: size_t) -> T
206+
where
207+
T: OpenCVFromExtern,
208+
{
184209
let val = self.extern_get(index);
185210
T::opencv_from_extern(val)
186211
}
@@ -232,7 +257,7 @@ pub trait VectorToVec {
232257
fn to_vec(&self) -> Vec<Self::Element>;
233258
}
234259

235-
impl<T: for<'o> OpenCVType<'o>> Default for Vector<T>
260+
impl<T> Default for Vector<T>
236261
where
237262
Self: VectorExtern<T>,
238263
{
@@ -242,7 +267,7 @@ where
242267
}
243268
}
244269

245-
impl<T: for<'o> OpenCVType<'o>> From<Vector<T>> for Vec<T>
270+
impl<T> From<Vector<T>> for Vec<T>
246271
where
247272
Vector<T>: VectorExtern<T> + VectorToVec<Element = T>,
248273
{
@@ -272,7 +297,7 @@ where
272297
}
273298
}
274299

275-
impl<T: for<'o> OpenCVType<'o>> AsRef<[T]> for Vector<T>
300+
impl<T> AsRef<[T]> for Vector<T>
276301
where
277302
Self: VectorExtern<T> + VectorExternCopyNonBool<T>,
278303
{
@@ -282,7 +307,7 @@ where
282307
}
283308
}
284309

285-
impl<T: for<'o> OpenCVType<'o>> Borrow<[T]> for Vector<T>
310+
impl<T> Borrow<[T]> for Vector<T>
286311
where
287312
Self: VectorExtern<T> + VectorExternCopyNonBool<T>,
288313
{
@@ -292,7 +317,7 @@ where
292317
}
293318
}
294319

295-
impl<T: for<'o> OpenCVType<'o> + fmt::Debug> fmt::Debug for Vector<T>
320+
impl<T: OpenCVFromExtern + fmt::Debug> fmt::Debug for Vector<T>
296321
where
297322
Self: VectorExtern<T>,
298323
{
@@ -302,7 +327,7 @@ where
302327
}
303328
}
304329

305-
impl<T: for<'o> OpenCVType<'o>> Drop for Vector<T>
330+
impl<T> Drop for Vector<T>
306331
where
307332
Self: VectorExtern<T>,
308333
{
@@ -311,9 +336,9 @@ where
311336
}
312337
}
313338

314-
unsafe impl<T: for<'o> OpenCVType<'o> + Send> Send for Vector<T> where Self: VectorExtern<T> {}
339+
unsafe impl<T: Send> Send for Vector<T> where Self: VectorExtern<T> {}
315340

316-
unsafe impl<T: for<'o> OpenCVType<'o> + Sync> Sync for Vector<T> where Self: VectorExtern<T> {}
341+
unsafe impl<T: Sync> Sync for Vector<T> where Self: VectorExtern<T> {}
317342

318343
impl<'a, T: for<'o> OpenCVType<'o>> Extend<<T as OpenCVType<'a>>::Arg> for Vector<T>
319344
where
@@ -329,7 +354,7 @@ where
329354
}
330355
}
331356

332-
impl<T: for<'o> OpenCVType<'o>> Boxed for Vector<T>
357+
impl<T> Boxed for Vector<T>
333358
where
334359
Self: VectorExtern<T>,
335360
{
@@ -356,8 +381,7 @@ where
356381

357382
impl<'b, T: Boxed> Vector<BoxedRef<'b, T>>
358383
where
359-
BoxedRef<'b, T>: for<'o> OpenCVType<'o>,
360-
Vector<BoxedRef<'b, T>>: VectorExtern<BoxedRef<'b, T>>,
384+
Self: VectorExtern<BoxedRef<'b, T>>,
361385
Vector<T>: VectorExtern<T>,
362386
{
363387
/// Transmutes a `&Vector<BoxedRef<T>>` into a `&Vector<T>`. This is safe as `BoxedRef` is a transparent wrapper around `T`,

0 commit comments

Comments
 (0)