Skip to content

Commit 38bbfa7

Browse files
committed
Properly handle const pointer to Ptr's internal data, move extern declarations to the module level (fixes warnings in beta)
1 parent d4f04f8 commit 38bbfa7

File tree

5 files changed

+45
-25
lines changed

5 files changed

+45
-25
lines changed

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

+10
Original file line numberDiff line numberDiff line change
@@ -80,16 +80,26 @@ impl RustNativeGeneratedElement for SmartPtr<'_> {
8080
let pointee_type = self.pointee();
8181

8282
let mut inner_cpp_extern = pointee_type.cpp_extern_return();
83+
let mut extern_return_const_renderer = type_ref::CppExternReturnRenderer::new();
84+
extern_return_const_renderer.constness_override = ConstnessOverride::Yes(Constness::Const);
85+
let mut inner_cpp_extern_const = pointee_type.render(extern_return_const_renderer);
8386
if !pointee_type.is_by_ptr() {
8487
inner_cpp_extern.to_mut().push('*');
88+
inner_cpp_extern_const.to_mut().push('*');
8589
}
8690

91+
let mut const_renderer = type_ref::CppReferenceRenderer::new("", true);
92+
const_renderer.constness_override = ConstnessOverride::Yes(Constness::Const);
93+
let cpp_full_const = type_ref.render(const_renderer);
94+
8795
let mut inter_vars = hashmap! {
8896
"rust_localalias" => self.rust_localalias(),
8997
"cpp_extern" => type_ref.cpp_extern(),
9098
"cpp_full" => type_ref.cpp_full(),
99+
"cpp_full_const" => cpp_full_const.into(),
91100
"inner_cpp_full" => pointee_type.cpp_full(),
92101
"inner_cpp_extern" => inner_cpp_extern,
102+
"inner_cpp_extern_const" => inner_cpp_extern_const,
93103
};
94104

95105
let pointee_primitive = pointee_type.is_primitive();

binding-generator/src/writer/rust_native/tpl/smart_ptr/cpp.tpl.cpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ extern "C" {
44
delete instance;
55
}
66

7-
{{inner_cpp_extern}} cv_{{rust_localalias}}_get_inner_ptr({{cpp_full}}* instance) {
7+
{{inner_cpp_extern_const}} cv_{{rust_localalias}}_get_inner_ptr({{cpp_full_const}}* instance) {
8+
return instance->get();
9+
}
10+
11+
{{inner_cpp_extern}} cv_{{rust_localalias}}_get_inner_ptr_mut({{cpp_full}}* instance) {
812
return instance->get();
913
}
1014
}

binding-generator/src/writer/rust_native/tpl/smart_ptr/rust.tpl.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
pub type {{rust_localalias}} = {{rust_full}};
22

33
ptr_extern! { {{inner_rust_full}},
4-
cv_{{rust_localalias}}_delete, cv_{{rust_localalias}}_get_inner_ptr
4+
cv_{{rust_localalias}}_delete, cv_{{rust_localalias}}_get_inner_ptr, cv_{{rust_localalias}}_get_inner_ptr_mut
55
}
66

77
{{ctor}}

src/manual/core/ptr/ptr_extern.rs

+12-8
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,32 @@ pub trait PtrExtern {
1111

1212
#[doc(hidden)]
1313
pub trait PtrExternCtor<T: for<'a> OpenCVType<'a>>: Sized {
14-
#[doc(hidden)] unsafe fn extern_new<'a>(val: <<T as OpenCVType<'a>>::ExternContainer as OpenCVTypeExternContainer>::ExternSendMut) -> *mut c_void;
14+
#[doc(hidden)] unsafe fn extern_new(val: <<T as OpenCVType>::ExternContainer as OpenCVTypeExternContainer>::ExternSendMut) -> *mut c_void;
1515
}
1616

1717
#[macro_export]
1818
macro_rules! ptr_extern {
19-
($type: ty, $extern_delete: ident, $extern_inner_as_ptr: ident $(,)?) => {
19+
($type: ty, $extern_delete: ident, $extern_inner_as_ptr: ident, $extern_inner_as_ptr_mut: ident $(,)?) => {
20+
extern "C" {
21+
fn $extern_delete(instance: *mut std::ffi::c_void);
22+
fn $extern_inner_as_ptr(instance: *const std::ffi::c_void) -> *const std::ffi::c_void;
23+
fn $extern_inner_as_ptr_mut(instance: *mut std::ffi::c_void) -> *mut std::ffi::c_void;
24+
}
25+
2026
impl $crate::manual::core::PtrExtern for $crate::manual::core::Ptr<$type> {
2127
#[inline(always)]
2228
unsafe fn extern_delete(&mut self) {
23-
extern "C" { fn $extern_delete(instance: *mut std::ffi::c_void); }
2429
$extern_delete(self.as_raw_mut())
2530
}
2631

2732
#[inline(always)]
2833
unsafe fn extern_inner_as_ptr(&self) -> *const std::ffi::c_void {
29-
extern "C" { fn $extern_inner_as_ptr(instance: *const std::ffi::c_void) -> *mut std::ffi::c_void; }
3034
$extern_inner_as_ptr(self.as_raw())
3135
}
3236

3337
#[inline(always)]
3438
unsafe fn extern_inner_as_ptr_mut(&mut self) -> *mut std::ffi::c_void {
35-
extern "C" { fn $extern_inner_as_ptr(instance: *mut std::ffi::c_void) -> *mut std::ffi::c_void; }
36-
$extern_inner_as_ptr(self.as_raw_mut())
39+
$extern_inner_as_ptr_mut(self.as_raw_mut())
3740
}
3841
}
3942
};
@@ -42,10 +45,11 @@ macro_rules! ptr_extern {
4245
#[macro_export]
4346
macro_rules! ptr_extern_ctor {
4447
($type: ty, $extern_new: ident $(,)?) => {
48+
extern "C" { fn $extern_new(val: <<$type as $crate::traits::OpenCVType>::ExternContainer as $crate::traits::OpenCVTypeExternContainer>::ExternSendMut) -> *mut std::ffi::c_void; }
49+
4550
impl $crate::manual::core::PtrExternCtor<$type> for $crate::manual::core::Ptr<$type> {
4651
#[inline(always)]
47-
unsafe fn extern_new<'a>(val: <<$type as $crate::traits::OpenCVType<'a>>::ExternContainer as $crate::traits::OpenCVTypeExternContainer>::ExternSendMut) -> *mut std::ffi::c_void {
48-
extern "C" { fn $extern_new<'a>(val: <<$type as $crate::traits::OpenCVType<'a>>::ExternContainer as $crate::traits::OpenCVTypeExternContainer>::ExternSendMut) -> *mut std::ffi::c_void; }
52+
unsafe fn extern_new(val: <<$type as $crate::traits::OpenCVType>::ExternContainer as $crate::traits::OpenCVTypeExternContainer>::ExternSendMut) -> *mut std::ffi::c_void {
4953
$extern_new(val)
5054
}
5155
}

src/manual/core/vector/vector_extern.rs

+17-15
Original file line numberDiff line numberDiff line change
@@ -55,94 +55,96 @@ macro_rules! vector_extern {
5555
$extern_push: ident,
5656
$extern_insert: ident $(,)?
5757
) => {
58+
extern "C" {
59+
fn $extern_new() -> $vector_extern_mut;
60+
fn $extern_delete(instance: $vector_extern_mut);
61+
fn $extern_len(instance: $vector_extern_const) -> $crate::platform_types::size_t;
62+
fn $extern_is_empty(instance: $vector_extern_const) -> bool;
63+
fn $extern_capacity(instance: $vector_extern_const) -> $crate::platform_types::size_t;
64+
fn $extern_shrink_to_fit(instance: $vector_extern_mut);
65+
fn $extern_reserve(instance: $vector_extern_mut, additional: $crate::platform_types::size_t);
66+
fn $extern_remove(instance: $vector_extern_mut, index: $crate::platform_types::size_t);
67+
fn $extern_swap(instance: $vector_extern_mut, index1: $crate::platform_types::size_t, index2: $crate::platform_types::size_t);
68+
fn $extern_clear(instance: $vector_extern_mut);
69+
fn $extern_get<'a>(instance: $vector_extern_const, index: $crate::platform_types::size_t) -> $crate::sys::Result<<$type as $crate::traits::OpenCVType<'a>>::ExternReceive>;
70+
fn $extern_push<'a>(instance: $vector_extern_mut, val: <<<$type as $crate::traits::OpenCVType<'a>>::Arg as $crate::traits::OpenCVTypeArg<'a>>::ExternContainer as $crate::traits::OpenCVTypeExternContainer>::ExternSend);
71+
fn $extern_insert<'a>(instance: $vector_extern_mut, index: $crate::platform_types::size_t, val: <<<$type as $crate::traits::OpenCVType<'a>>::Arg as $crate::traits::OpenCVTypeArg<'a>>::ExternContainer as $crate::traits::OpenCVTypeExternContainer>::ExternSend);
72+
fn $extern_set<'a>(instance: $vector_extern_mut, index: $crate::platform_types::size_t, val: <<<$type as $crate::traits::OpenCVType<'a>>::Arg as $crate::traits::OpenCVTypeArg<'a>>::ExternContainer as $crate::traits::OpenCVTypeExternContainer>::ExternSend);
73+
}
74+
5875
impl $crate::manual::core::VectorExtern<$type> for $crate::manual::core::Vector<$type> {
5976
#[inline(always)]
6077
unsafe fn extern_new() -> $vector_extern_mut {
61-
extern "C" { fn $extern_new() -> $vector_extern_mut; }
6278
$extern_new()
6379
}
6480

6581
#[inline(always)]
6682
unsafe fn extern_delete(&mut self) {
67-
extern "C" { fn $extern_delete(instance: $vector_extern_mut); }
6883
$extern_delete(self.as_raw_mut())
6984
}
7085

7186
#[inline(always)]
7287
unsafe fn extern_len(&self) -> $crate::platform_types::size_t {
73-
extern "C" { fn $extern_len(instance: $vector_extern_const) -> $crate::platform_types::size_t; }
7488
$extern_len(self.as_raw())
7589
}
7690

7791
#[inline(always)]
7892
unsafe fn extern_is_empty(&self) -> bool {
79-
extern "C" { fn $extern_is_empty(instance: $vector_extern_const) -> bool; }
8093
$extern_is_empty(self.as_raw())
8194
}
8295

8396
#[inline(always)]
8497
unsafe fn extern_capacity(&self) -> $crate::platform_types::size_t {
85-
extern "C" { fn $extern_capacity(instance: $vector_extern_const) -> $crate::platform_types::size_t; }
8698
$extern_capacity(self.as_raw())
8799
}
88100

89101
#[inline(always)]
90102
unsafe fn extern_shrink_to_fit(&mut self) {
91-
extern "C" { fn $extern_shrink_to_fit(instance: $vector_extern_mut); }
92103
$extern_shrink_to_fit(self.as_raw_mut())
93104
}
94105

95106
#[inline(always)]
96107
unsafe fn extern_reserve(&mut self, additional: $crate::platform_types::size_t) {
97-
extern "C" { fn $extern_reserve(instance: $vector_extern_mut, additional: $crate::platform_types::size_t); }
98108
$extern_reserve(self.as_raw_mut(), additional)
99109
}
100110

101111
#[inline(always)]
102112
unsafe fn extern_remove(&mut self, index: $crate::platform_types::size_t) {
103-
extern "C" { fn $extern_remove(instance: $vector_extern_mut, index: $crate::platform_types::size_t); }
104113
$extern_remove(self.as_raw_mut(), index)
105114
}
106115

107116
#[inline(always)]
108117
unsafe fn extern_swap(&mut self, index1: $crate::platform_types::size_t, index2: $crate::platform_types::size_t) {
109-
extern "C" { fn $extern_swap(instance: $vector_extern_mut, index1: $crate::platform_types::size_t, index2: $crate::platform_types::size_t); }
110118
$extern_swap(self.as_raw_mut(), index1, index2)
111119
}
112120

113121
#[inline(always)]
114122
unsafe fn extern_clear(&mut self) {
115-
extern "C" { fn $extern_clear(instance: $vector_extern_mut); }
116123
$extern_clear(self.as_raw_mut())
117124
}
118125

119126
#[inline(always)]
120127
unsafe fn extern_get(&self, index: $crate::platform_types::size_t) -> $crate::sys::Result<<$type as $crate::traits::OpenCVType<'_>>::ExternReceive> {
121-
extern "C" { fn $extern_get<'a>(instance: $vector_extern_const, index: $crate::platform_types::size_t) -> $crate::sys::Result<<$type as $crate::traits::OpenCVType<'a>>::ExternReceive>; }
122128
$extern_get(self.as_raw(), index)
123129
}
124130

125131
#[inline(always)]
126132
unsafe fn extern_push<'a>(&mut self, val: <<<$type as $crate::traits::OpenCVType<'a>>::Arg as $crate::traits::OpenCVTypeArg<'a>>::ExternContainer as $crate::traits::OpenCVTypeExternContainer>::ExternSend) {
127-
extern "C" { fn $extern_push<'a>(instance: $vector_extern_mut, val: <<<$type as $crate::traits::OpenCVType<'a>>::Arg as $crate::traits::OpenCVTypeArg<'a>>::ExternContainer as $crate::traits::OpenCVTypeExternContainer>::ExternSend); }
128133
$extern_push(self.as_raw_mut(), val)
129134
}
130135

131136
#[inline(always)]
132137
unsafe fn extern_push_owned(&mut self, val: <<$type as $crate::traits::OpenCVType>::ExternContainer as $crate::traits::OpenCVTypeExternContainer>::ExternSend) {
133-
extern "C" { fn $extern_push<'a>(instance: $vector_extern_mut, val: <<<$type as $crate::traits::OpenCVType<'a>>::Arg as $crate::traits::OpenCVTypeArg<'a>>::ExternContainer as $crate::traits::OpenCVTypeExternContainer>::ExternSend); }
134138
$extern_push(self.as_raw_mut(), val)
135139
}
136140

137141
#[inline(always)]
138142
unsafe fn extern_insert<'a>(&mut self, index: $crate::platform_types::size_t, val: <<<$type as $crate::traits::OpenCVType<'a>>::Arg as $crate::traits::OpenCVTypeArg<'a>>::ExternContainer as $crate::traits::OpenCVTypeExternContainer>::ExternSend) {
139-
extern "C" { fn $extern_insert<'a>(instance: $vector_extern_mut, index: $crate::platform_types::size_t, val: <<<$type as $crate::traits::OpenCVType<'a>>::Arg as $crate::traits::OpenCVTypeArg<'a>>::ExternContainer as $crate::traits::OpenCVTypeExternContainer>::ExternSend); }
140143
$extern_insert(self.as_raw_mut(), index, val)
141144
}
142145

143146
#[inline(always)]
144147
unsafe fn extern_set<'a>(&mut self, index: $crate::platform_types::size_t, val: <<<$type as $crate::traits::OpenCVType<'a>>::Arg as $crate::traits::OpenCVTypeArg<'a>>::ExternContainer as $crate::traits::OpenCVTypeExternContainer>::ExternSend) {
145-
extern "C" { fn $extern_set<'a>(instance: $vector_extern_mut, index: $crate::platform_types::size_t, val: <<<$type as $crate::traits::OpenCVType<'a>>::Arg as $crate::traits::OpenCVTypeArg<'a>>::ExternContainer as $crate::traits::OpenCVTypeExternContainer>::ExternSend); }
146148
$extern_set(self.as_raw_mut(), index, val)
147149
}
148150
}

0 commit comments

Comments
 (0)