opencv/manual/core/ptr/
ptr_extern.rs

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