1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use std::ffi::c_void;
use crate::traits::{OpenCVType, OpenCVTypeExternContainer};
#[doc(hidden)]
pub trait PtrExtern {
#[doc(hidden)] unsafe fn extern_delete(&mut self);
#[doc(hidden)] unsafe fn extern_inner_as_ptr(&self) -> *const c_void;
#[doc(hidden)] unsafe fn extern_inner_as_ptr_mut(&mut self) -> *mut c_void;
}
#[doc(hidden)]
pub trait PtrExternCtor<T: for<'a> OpenCVType<'a>>: Sized {
#[doc(hidden)] unsafe fn extern_new(val: <<T as OpenCVType>::ExternContainer as OpenCVTypeExternContainer>::ExternSendMut) -> *mut c_void;
}
#[macro_export]
macro_rules! ptr_extern {
($type: ty, $extern_delete: ident, $extern_inner_as_ptr: ident, $extern_inner_as_ptr_mut: ident $(,)?) => {
extern "C" {
fn $extern_delete(instance: *mut std::ffi::c_void);
fn $extern_inner_as_ptr(instance: *const std::ffi::c_void) -> *const std::ffi::c_void;
fn $extern_inner_as_ptr_mut(instance: *mut std::ffi::c_void) -> *mut std::ffi::c_void;
}
impl $crate::manual::core::PtrExtern for $crate::manual::core::Ptr<$type> {
#[inline(always)]
unsafe fn extern_delete(&mut self) {
$extern_delete(self.as_raw_mut())
}
#[inline(always)]
unsafe fn extern_inner_as_ptr(&self) -> *const std::ffi::c_void {
$extern_inner_as_ptr(self.as_raw())
}
#[inline(always)]
unsafe fn extern_inner_as_ptr_mut(&mut self) -> *mut std::ffi::c_void {
$extern_inner_as_ptr_mut(self.as_raw_mut())
}
}
};
}
#[macro_export]
macro_rules! ptr_extern_ctor {
($type: ty, $extern_new: ident $(,)?) => {
extern "C" { fn $extern_new(val: <<$type as $crate::traits::OpenCVType>::ExternContainer as $crate::traits::OpenCVTypeExternContainer>::ExternSendMut) -> *mut std::ffi::c_void; }
impl $crate::manual::core::PtrExternCtor<$type> for $crate::manual::core::Ptr<$type> {
#[inline(always)]
unsafe fn extern_new(val: <<$type as $crate::traits::OpenCVType>::ExternContainer as $crate::traits::OpenCVTypeExternContainer>::ExternSendMut) -> *mut std::ffi::c_void {
$extern_new(val)
}
}
};
}
#[macro_export]
macro_rules! ptr_cast_base {
($type: ty, $base: ty, $extern_convert: ident $(,)?) => {
extern "C" { fn $extern_convert(val: *mut std::ffi::c_void) -> *mut std::ffi::c_void; }
impl ::std::convert::From<$type> for $base {
#[inline]
fn from(s: $type) -> Self {
unsafe { Self::from_raw($extern_convert(s.into_raw())) }
}
}
};
}