opencv/traits/
opencv_type.rsuse std::ffi::c_void;
use crate::Result;
mod string;
#[doc(hidden)]
pub trait OpenCVType<'a>: OpenCVIntoExternContainer + OpenCVFromExtern {
#[doc(hidden)]
type Arg: OpenCVIntoExternContainer;
}
#[doc(hidden)]
pub trait OpenCVFromExtern {
#[doc(hidden)]
type ExternReceive;
#[doc(hidden)]
unsafe fn opencv_from_extern(s: Self::ExternReceive) -> Self;
}
#[doc(hidden)]
pub trait OpenCVIntoExternContainer: Sized {
#[doc(hidden)]
type ExternContainer: OpenCVTypeExternContainer;
#[doc(hidden)]
#[inline]
fn opencv_into_extern_container(self) -> Result<Self::ExternContainer> {
Ok(self.opencv_into_extern_container_nofail())
}
#[doc(hidden)]
fn opencv_into_extern_container_nofail(self) -> Self::ExternContainer;
}
#[doc(hidden)]
pub trait OpenCVTypeExternContainer {
#[doc(hidden)]
type ExternSend;
#[doc(hidden)]
type ExternSendMut;
#[doc(hidden)]
fn opencv_as_extern(&self) -> Self::ExternSend;
#[doc(hidden)]
fn opencv_as_extern_mut(&mut self) -> Self::ExternSendMut;
}
#[doc(hidden)]
pub trait OpenCVTypeExternContainerMove: OpenCVTypeExternContainer {
#[doc(hidden)]
fn opencv_into_extern(self) -> Self::ExternSendMut;
}
#[doc(hidden)]
#[macro_export]
macro_rules! extern_receive {
($typ: ty) => {
<$typ as $crate::traits::OpenCVFromExtern>::ExternReceive
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! extern_send {
(mut $typ: ty) => {
<$typ as $crate::traits::OpenCVTypeExternContainer>::ExternSendMut
};
($typ: ty) => {
<$typ as $crate::traits::OpenCVTypeExternContainer>::ExternSend
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! extern_container_send {
(mut $typ: ty) => {
$crate::extern_send!(mut <$typ as $crate::traits::OpenCVIntoExternContainer>::ExternContainer)
};
($typ: ty) => {
$crate::extern_send!(<$typ as $crate::traits::OpenCVIntoExternContainer>::ExternContainer)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! extern_arg_send {
(mut $typ: ty: $lt: lifetime) => {
$crate::extern_container_send!(mut <$typ as $crate::traits::OpenCVType<$lt>>::Arg)
};
($typ: ty: $lt: lifetime) => {
$crate::extern_container_send!(<$typ as $crate::traits::OpenCVType<$lt>>::Arg)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! opencv_type_copy {
($($type: ty),+ $(,)?) => {
$(
impl $crate::traits::OpenCVType<'_> for $type {
type Arg = Self;
}
impl $crate::traits::OpenCVFromExtern for $type {
type ExternReceive = Self;
#[inline] unsafe fn opencv_from_extern(s: Self::ExternReceive) -> Self { s }
}
impl $crate::traits::OpenCVIntoExternContainer for $type {
type ExternContainer = Self;
#[inline] fn opencv_into_extern_container_nofail(self) -> Self::ExternContainer { self }
}
impl $crate::traits::OpenCVTypeExternContainer for $type {
type ExternSend = Self;
type ExternSendMut = Self;
#[inline] fn opencv_as_extern(&self) -> Self::ExternSend { *self }
#[inline] fn opencv_as_extern_mut(&mut self) -> Self::ExternSendMut { *self }
}
impl $crate::traits::OpenCVTypeExternContainerMove for $type {
#[inline] fn opencv_into_extern(self) -> Self { self }
}
)+
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! opencv_type_enum {
($type: ty) => {
$crate::opencv_type_copy! { $type }
impl From<$type> for i32 {
#[inline]
fn from(v: $type) -> Self {
v as Self
}
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! opencv_type_simple {
($type: ty) => {
impl $crate::traits::OpenCVType<'_> for $type {
type Arg = Self;
}
impl $crate::traits::OpenCVFromExtern for $type {
type ExternReceive = Self;
#[inline]
unsafe fn opencv_from_extern(s: Self::ExternReceive) -> Self {
s
}
}
impl $crate::traits::OpenCVIntoExternContainer for $type {
type ExternContainer = Self;
#[inline]
fn opencv_into_extern_container_nofail(self) -> Self::ExternContainer {
self
}
}
impl $crate::traits::OpenCVTypeExternContainer for $type {
type ExternSend = *const Self;
type ExternSendMut = *mut Self;
#[inline]
fn opencv_as_extern(&self) -> Self::ExternSend {
self
}
#[inline]
fn opencv_as_extern_mut(&mut self) -> Self::ExternSendMut {
self
}
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! opencv_type_simple_generic {
($type: ident<$trait: ident $( + $more: ident)*>) => {
impl<T: $trait$( + $more)*> $crate::traits::OpenCVType<'_> for $type<T> {
type Arg = Self;
}
impl<T: $trait$( + $more)*> $crate::traits::OpenCVFromExtern for $type<T> {
type ExternReceive = Self;
#[inline] unsafe fn opencv_from_extern(s: Self::ExternReceive) -> Self { s }
}
impl<T: $trait$( + $more)*> $crate::traits::OpenCVIntoExternContainer for $type<T> {
type ExternContainer = Self;
#[inline] fn opencv_into_extern_container_nofail(self) -> Self::ExternContainer { self }
}
impl<T: $trait$( + $more)*> $crate::traits::OpenCVTypeExternContainer for $type<T> {
type ExternSend = *const Self;
type ExternSendMut = *mut Self;
#[inline] fn opencv_as_extern(&self) -> Self::ExternSend { self }
#[inline] fn opencv_as_extern_mut(&mut self) -> Self::ExternSendMut { self }
}
};
}
opencv_type_copy! {
(),
bool,
i8, u8,
i16, u16,
i32, u32,
i64, u64,
f32, f64,
isize, usize,
*const c_void, *mut c_void,
}