Skip to content

Commit 0469db8

Browse files
committed
Rework OpenCVType traits
1 parent 2b3712c commit 0469db8

File tree

11 files changed

+94
-55
lines changed

11 files changed

+94
-55
lines changed

binding-generator/src/writer/rust_native/vector.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ impl RustNativeGeneratedElement for Vector<'_, '_> {
185185
impls += &BOXED_REF_TPL.interpolate(&inter_vars);
186186
inter_vars.insert(
187187
"inner_rust_full",
188-
format!("BoxedRef<'_, {}>", inter_vars["inner_rust_full"]).into(),
188+
format!("BoxedRef<'t, {}>", inter_vars["inner_rust_full"]).into(),
189189
);
190190
impls += &EXTERN_TPL.interpolate(&inter_vars);
191191
if element_type.is_element_data_type() {

src/boxed_ref.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::fmt;
22
use std::marker::PhantomData;
33

44
use crate::mod_prelude::OpenCVTypeExternContainer;
5-
use crate::traits::{Boxed, OpenCVType, OpenCVTypeArg};
5+
use crate::traits::{Boxed, OpenCVFromExtern, OpenCVIntoExternContainer, OpenCVType};
66

77
/// Wrapper for the type implementing [Boxed] trait that allows to retain the lifetime of the referenced object.
88
///
@@ -40,7 +40,7 @@ impl<T: Boxed + Clone> BoxedRef<'_, T> {
4040
}
4141
}
4242

43-
impl<'t, T: OpenCVTypeArg<'t> + Boxed> OpenCVTypeArg<'t> for BoxedRef<'_, T> {
43+
impl<T: OpenCVIntoExternContainer + Boxed> OpenCVIntoExternContainer for BoxedRef<'_, T> {
4444
type ExternContainer = T::ExternContainer;
4545

4646
#[inline]
@@ -51,6 +51,9 @@ impl<'t, T: OpenCVTypeArg<'t> + Boxed> OpenCVTypeArg<'t> for BoxedRef<'_, T> {
5151

5252
impl<'t, 'b, T: OpenCVType<'t> + Boxed> OpenCVType<'t> for BoxedRef<'b, T> {
5353
type Arg = BoxedRef<'b, T>;
54+
}
55+
56+
impl<T: OpenCVFromExtern + Boxed> OpenCVFromExtern for BoxedRef<'_, T> {
5457
type ExternReceive = T::ExternReceive;
5558

5659
#[inline]
@@ -109,7 +112,7 @@ impl<T: Boxed + Clone> BoxedRefMut<'_, T> {
109112
}
110113
}
111114

112-
impl<'t, T: OpenCVTypeArg<'t> + Boxed> OpenCVTypeArg<'t> for BoxedRefMut<'_, T> {
115+
impl<T: OpenCVIntoExternContainer + Boxed> OpenCVIntoExternContainer for BoxedRefMut<'_, T> {
113116
type ExternContainer = T::ExternContainer;
114117

115118
#[inline]
@@ -120,6 +123,9 @@ impl<'t, T: OpenCVTypeArg<'t> + Boxed> OpenCVTypeArg<'t> for BoxedRefMut<'_, T>
120123

121124
impl<'t, 'b, T: OpenCVType<'t> + Boxed> OpenCVType<'t> for BoxedRefMut<'b, T> {
122125
type Arg = BoxedRefMut<'b, T>;
126+
}
127+
128+
impl<T: OpenCVFromExtern + Boxed> OpenCVFromExtern for BoxedRefMut<'_, T> {
123129
type ExternReceive = T::ExternReceive;
124130

125131
#[inline]

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ pub(crate) mod mod_prelude_sys {
3030
pub use std::ffi::{c_char, c_void};
3131

3232
pub use crate::platform_types::*;
33-
pub use crate::traits::{Boxed, OpenCVType, OpenCVTypeArg, OpenCVTypeExternContainer};
33+
pub use crate::traits::{Boxed, OpenCVFromExtern, OpenCVIntoExternContainer, OpenCVTypeExternContainer};
3434
}
3535

3636
/// Prelude for generated modules and types

src/manual/core/matx.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use num_traits::{One, Zero};
55
use crate::boxed_ref::{BoxedRef, BoxedRefMut};
66
use crate::core::{ToInputArray, ToInputOutputArray, ToOutputArray, _InputArray, _InputOutputArray, _OutputArray};
77
use crate::manual::core::sized::*;
8-
use crate::traits::{Boxed, OpenCVType, OpenCVTypeArg, OpenCVTypeExternContainer};
8+
use crate::traits::{Boxed, OpenCVFromExtern, OpenCVIntoExternContainer, OpenCVType, OpenCVTypeExternContainer};
99
use crate::{core, extern_receive, extern_send, sys, Error, Result};
1010

1111
fn index_check(idx: (usize, usize), rows: usize, cols: usize) -> Result<()> {
@@ -177,6 +177,9 @@ impl<T, A: SizedArray<T>> std::ops::IndexMut<(usize, usize)> for Matx<T, A> {
177177

178178
impl<T, A: SizedArray<T>> OpenCVType<'_> for Matx<T, A> {
179179
type Arg = Self;
180+
}
181+
182+
impl<T, A: SizedArray<T>> OpenCVFromExtern for Matx<T, A> {
180183
type ExternReceive = Self;
181184

182185
#[inline]
@@ -185,7 +188,7 @@ impl<T, A: SizedArray<T>> OpenCVType<'_> for Matx<T, A> {
185188
}
186189
}
187190

188-
impl<T, A: SizedArray<T>> OpenCVTypeArg<'_> for Matx<T, A> {
191+
impl<T, A: SizedArray<T>> OpenCVIntoExternContainer for Matx<T, A> {
189192
type ExternContainer = Self;
190193

191194
#[inline]

src/manual/core/ptr/ptr_extern.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::ffi::c_void;
22

3-
use crate::traits::{OpenCVType, OpenCVTypeExternContainerMove};
3+
use crate::traits::{OpenCVFromExtern, OpenCVTypeExternContainerMove};
44
use crate::{extern_receive, extern_send};
55

66
#[doc(hidden)]
@@ -16,9 +16,9 @@ pub trait PtrExtern {
1616
#[doc(hidden)]
1717
pub trait PtrExternCtor<T: OpenCVTypeExternContainerMove> {
1818
#[doc(hidden)]
19-
unsafe fn extern_new<'a>(val: extern_send!(mut T)) -> extern_receive!(Self: 'a)
19+
unsafe fn extern_new(val: extern_send!(mut T)) -> extern_receive!(Self)
2020
where
21-
Self: OpenCVType<'a>;
21+
Self: OpenCVFromExtern;
2222
}
2323

2424
#[doc(hidden)]

src/manual/core/vec.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use num_traits::{Float, NumCast, ToPrimitive};
55

66
use crate::boxed_ref::{BoxedRef, BoxedRefMut};
77
use crate::core::{ToInputArray, ToInputOutputArray, ToOutputArray, _InputArray, _InputOutputArray, _OutputArray};
8-
use crate::traits::{Boxed, OpenCVType, OpenCVTypeArg, OpenCVTypeExternContainer};
8+
use crate::traits::{Boxed, OpenCVFromExtern, OpenCVIntoExternContainer, OpenCVType, OpenCVTypeExternContainer};
99
use crate::{extern_receive, extern_send, sys, Result};
1010

1111
mod operations;
@@ -129,6 +129,9 @@ impl<F: Float> VecN<F, 4> {
129129

130130
impl<T, const N: usize> OpenCVType<'_> for VecN<T, N> {
131131
type Arg = Self;
132+
}
133+
134+
impl<T, const N: usize> OpenCVFromExtern for VecN<T, N> {
132135
type ExternReceive = Self;
133136

134137
#[inline]
@@ -137,7 +140,7 @@ impl<T, const N: usize> OpenCVType<'_> for VecN<T, N> {
137140
}
138141
}
139142

140-
impl<T, const N: usize> OpenCVTypeArg<'_> for VecN<T, N> {
143+
impl<T, const N: usize> OpenCVIntoExternContainer for VecN<T, N> {
141144
type ExternContainer = Self;
142145

143146
#[inline]

src/manual/core/vector.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ 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, OpenCVType, OpenCVTypeArg, OpenCVTypeExternContainer};
13+
use crate::traits::{Boxed, OpenCVIntoExternContainer, OpenCVType, OpenCVTypeExternContainer};
1414
use crate::Result;
1515

1616
mod iter;

src/manual/core/vector/vector_extern.rs

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
use crate::core::Vector;
22
use crate::platform_types::size_t;
3-
use crate::traits::OpenCVType;
3+
use crate::traits::{OpenCVFromExtern, OpenCVIntoExternContainer, OpenCVType};
44
use crate::{extern_arg_send, extern_container_send, extern_receive};
55

66
#[doc(hidden)]
7-
pub trait VectorExtern<T: for<'a> OpenCVType<'a>> {
7+
pub trait VectorExtern<T> {
88
#[doc(hidden)]
9-
unsafe fn extern_new<'a>() -> extern_receive!(Self: 'a)
9+
unsafe fn extern_new() -> extern_receive!(Self)
1010
where
11-
Self: OpenCVType<'a>;
11+
Self: OpenCVFromExtern;
1212
#[doc(hidden)]
1313
unsafe fn extern_delete(&mut self);
1414
#[doc(hidden)]
@@ -28,17 +28,28 @@ pub trait VectorExtern<T: for<'a> OpenCVType<'a>> {
2828
#[doc(hidden)]
2929
unsafe fn extern_clear(&mut self);
3030
#[doc(hidden)]
31-
unsafe fn extern_get(&self, index: size_t) -> extern_receive!(T);
31+
unsafe fn extern_get(&self, index: size_t) -> extern_receive!(T)
32+
where
33+
T: OpenCVFromExtern;
3234
#[doc(hidden)]
33-
unsafe fn extern_push<'a>(&mut self, val: extern_arg_send!(T: 'a));
35+
unsafe fn extern_push(&mut self, val: extern_arg_send!(T: '_))
36+
where
37+
T: for<'t> OpenCVType<'t>;
3438
#[doc(hidden)]
35-
unsafe fn extern_push_owned(&mut self, val: extern_container_send!(T));
39+
unsafe fn extern_push_owned(&mut self, val: extern_container_send!(T))
40+
where
41+
T: OpenCVIntoExternContainer;
3642
#[doc(hidden)]
37-
unsafe fn extern_insert<'a>(&mut self, index: size_t, val: extern_arg_send!(T: 'a));
43+
unsafe fn extern_insert(&mut self, index: size_t, val: extern_arg_send!(T: '_))
44+
where
45+
T: for<'t> OpenCVType<'t>;
3846
#[doc(hidden)]
39-
unsafe fn extern_set<'a>(&mut self, index: size_t, val: extern_arg_send!(T: 'a));
47+
unsafe fn extern_set(&mut self, index: size_t, val: extern_arg_send!(T: '_))
48+
where
49+
T: for<'t> OpenCVType<'t>;
4050
}
4151

52+
// The 't lifetime is used for BoxedRef<'t> otherwise the extern_get return would bind to self
4253
#[doc(hidden)]
4354
#[macro_export]
4455
macro_rules! vector_extern {
@@ -59,9 +70,9 @@ macro_rules! vector_extern {
5970
$extern_push: ident,
6071
$extern_insert: ident $(,)?
6172
) => {
62-
impl $crate::core::VectorExtern<$type> for $crate::core::Vector<$type> {
73+
impl<'t> $crate::core::VectorExtern<$type> for $crate::core::Vector<$type> {
6374
#[inline]
64-
unsafe fn extern_new<'a>() -> extern_receive!(Self: 'a) {
75+
unsafe fn extern_new() -> extern_receive!(Self) {
6576
$crate::sys::$extern_new()
6677
}
6778

@@ -119,7 +130,7 @@ macro_rules! vector_extern {
119130
}
120131

121132
#[inline]
122-
unsafe fn extern_push<'a>(&mut self, val: extern_arg_send!($type: 'a)) {
133+
unsafe fn extern_push(&mut self, val: extern_arg_send!($type: '_)) {
123134
$crate::sys::$extern_push(self.as_raw_mut(), val)
124135
}
125136

@@ -129,12 +140,12 @@ macro_rules! vector_extern {
129140
}
130141

131142
#[inline]
132-
unsafe fn extern_insert<'a>(&mut self, index: $crate::platform_types::size_t, val: extern_arg_send!($type: 'a)) {
143+
unsafe fn extern_insert(&mut self, index: $crate::platform_types::size_t, val: extern_arg_send!($type: '_)) {
133144
$crate::sys::$extern_insert(self.as_raw_mut(), index, val)
134145
}
135146

136147
#[inline]
137-
unsafe fn extern_set<'a>(&mut self, index: $crate::platform_types::size_t, val: extern_arg_send!($type: 'a)) {
148+
unsafe fn extern_set(&mut self, index: $crate::platform_types::size_t, val: extern_arg_send!($type: '_)) {
138149
$crate::sys::$extern_set(self.as_raw_mut(), index, val)
139150
}
140151
}
@@ -151,7 +162,7 @@ where
151162
#[doc(hidden)]
152163
unsafe fn extern_data_mut(&mut self) -> *mut T;
153164
#[doc(hidden)]
154-
unsafe fn extern_from_slice<'a>(data: *const T, len: size_t) -> extern_receive!(Vector<T>: 'a);
165+
unsafe fn extern_from_slice(data: *const T, len: size_t) -> extern_receive!(Vector<T>);
155166
}
156167

157168
#[doc(hidden)]
@@ -195,7 +206,7 @@ macro_rules! vector_copy_non_bool {
195206
}
196207

197208
#[inline]
198-
unsafe fn extern_from_slice<'a>(data: *const $type, len: $crate::platform_types::size_t) -> extern_receive!(Self: 'a) {
209+
unsafe fn extern_from_slice(data: *const $type, len: $crate::platform_types::size_t) -> extern_receive!(Self) {
199210
$crate::sys::$extern_from_slice(data, len)
200211
}
201212
}

src/traits/boxed.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use std::ffi::c_void;
22

3-
use crate::traits::{OpenCVType, OpenCVTypeArg, OpenCVTypeExternContainer, OpenCVTypeExternContainerMove};
3+
use crate::traits::{
4+
OpenCVFromExtern, OpenCVIntoExternContainer, OpenCVType, OpenCVTypeExternContainer, OpenCVTypeExternContainerMove,
5+
};
46

57
/// Trait for structures that are created on the C++ side, usually only the raw void pointer is stored to point to the allocated
68
/// data on the heap.
@@ -32,6 +34,9 @@ pub trait Boxed: Sized {
3234

3335
impl<T: Boxed> OpenCVType<'_> for T {
3436
type Arg = Self;
37+
}
38+
39+
impl<T: Boxed> OpenCVFromExtern for T {
3540
type ExternReceive = *mut c_void;
3641

3742
#[inline]
@@ -40,7 +45,7 @@ impl<T: Boxed> OpenCVType<'_> for T {
4045
}
4146
}
4247

43-
impl<T: Boxed> OpenCVTypeArg<'_> for T {
48+
impl<T: Boxed> OpenCVIntoExternContainer for T {
4449
type ExternContainer = Self;
4550

4651
fn opencv_into_extern_container_nofail(self) -> Self::ExternContainer {

0 commit comments

Comments
 (0)