1 #![allow(
2 clippy::boxed_local,
3 clippy::just_underscores_and_digits,
4 clippy::let_underscore_drop,
5 clippy::missing_safety_doc,
6 clippy::must_use_candidate,
7 clippy::needless_lifetimes,
8 clippy::needless_pass_by_value,
9 clippy::ptr_arg,
10 clippy::trivially_copy_pass_by_ref,
11 clippy::unnecessary_wraps,
12 clippy::unused_self
13 )]
14
15 pub mod cast;
16 pub mod module;
17
18 use cxx::{CxxString, CxxVector, SharedPtr, UniquePtr};
19 use std::fmt::{self, Display};
20 use std::mem::MaybeUninit;
21 use std::os::raw::c_char;
22
23 #[cxx::bridge(namespace = "tests")]
24 pub mod ffi {
25 #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
26 struct Shared {
27 z: usize,
28 }
29
30 #[derive(PartialEq, PartialOrd)]
31 struct SharedString {
32 msg: String,
33 }
34
35 #[derive(Debug, Hash, PartialOrd, Ord)]
36 enum Enum {
37 AVal,
38 BVal = 2020,
39 #[cxx_name = "CVal"]
40 LastVal,
41 }
42
43 #[namespace = "A"]
44 #[derive(Copy, Clone, Default)]
45 struct AShared {
46 z: usize,
47 }
48
49 #[namespace = "A"]
50 enum AEnum {
51 AAVal,
52 ABVal = 2020,
53 ACVal,
54 }
55
56 #[namespace = "A::B"]
57 enum ABEnum {
58 ABAVal,
59 ABBVal = 2020,
60 ABCVal,
61 }
62
63 #[namespace = "A::B"]
64 #[derive(Clone)]
65 struct ABShared {
66 z: usize,
67 }
68
69 #[namespace = "first"]
70 struct First {
71 second: Box<Second>,
72 }
73
74 #[namespace = "second"]
75 #[derive(Hash)]
76 struct Second {
77 i: i32,
78 e: COwnedEnum,
79 }
80
81 pub struct Array {
82 a: [i32; 4],
83 }
84
85 #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
86 pub struct StructWithLifetime<'a> {
87 s: &'a str,
88 }
89
90 unsafe extern "C++" {
91 include!("tests/ffi/tests.h");
92
93 type C;
94
c_return_primitive() -> usize95 fn c_return_primitive() -> usize;
c_return_shared() -> Shared96 fn c_return_shared() -> Shared;
c_return_box() -> Box<R>97 fn c_return_box() -> Box<R>;
c_return_unique_ptr() -> UniquePtr<C>98 fn c_return_unique_ptr() -> UniquePtr<C>;
c_return_shared_ptr() -> SharedPtr<C>99 fn c_return_shared_ptr() -> SharedPtr<C>;
c_return_ref(shared: &Shared) -> &usize100 fn c_return_ref(shared: &Shared) -> &usize;
c_return_mut(shared: &mut Shared) -> &mut usize101 fn c_return_mut(shared: &mut Shared) -> &mut usize;
c_return_str(shared: &Shared) -> &str102 fn c_return_str(shared: &Shared) -> &str;
c_return_slice_char(shared: &Shared) -> &[c_char]103 fn c_return_slice_char(shared: &Shared) -> &[c_char];
c_return_mutsliceu8(slice: &mut [u8]) -> &mut [u8]104 fn c_return_mutsliceu8(slice: &mut [u8]) -> &mut [u8];
c_return_rust_string() -> String105 fn c_return_rust_string() -> String;
c_return_unique_ptr_string() -> UniquePtr<CxxString>106 fn c_return_unique_ptr_string() -> UniquePtr<CxxString>;
c_return_unique_ptr_vector_u8() -> UniquePtr<CxxVector<u8>>107 fn c_return_unique_ptr_vector_u8() -> UniquePtr<CxxVector<u8>>;
c_return_unique_ptr_vector_f64() -> UniquePtr<CxxVector<f64>>108 fn c_return_unique_ptr_vector_f64() -> UniquePtr<CxxVector<f64>>;
c_return_unique_ptr_vector_string() -> UniquePtr<CxxVector<CxxString>>109 fn c_return_unique_ptr_vector_string() -> UniquePtr<CxxVector<CxxString>>;
c_return_unique_ptr_vector_shared() -> UniquePtr<CxxVector<Shared>>110 fn c_return_unique_ptr_vector_shared() -> UniquePtr<CxxVector<Shared>>;
c_return_unique_ptr_vector_opaque() -> UniquePtr<CxxVector<C>>111 fn c_return_unique_ptr_vector_opaque() -> UniquePtr<CxxVector<C>>;
c_return_ref_vector(c: &C) -> &CxxVector<u8>112 fn c_return_ref_vector(c: &C) -> &CxxVector<u8>;
c_return_mut_vector(c: Pin<&mut C>) -> Pin<&mut CxxVector<u8>>113 fn c_return_mut_vector(c: Pin<&mut C>) -> Pin<&mut CxxVector<u8>>;
c_return_rust_vec() -> Vec<u8>114 fn c_return_rust_vec() -> Vec<u8>;
c_return_ref_rust_vec(c: &C) -> &Vec<u8>115 fn c_return_ref_rust_vec(c: &C) -> &Vec<u8>;
c_return_mut_rust_vec(c: Pin<&mut C>) -> &mut Vec<u8>116 fn c_return_mut_rust_vec(c: Pin<&mut C>) -> &mut Vec<u8>;
c_return_rust_vec_string() -> Vec<String>117 fn c_return_rust_vec_string() -> Vec<String>;
c_return_identity(_: usize) -> usize118 fn c_return_identity(_: usize) -> usize;
c_return_sum(_: usize, _: usize) -> usize119 fn c_return_sum(_: usize, _: usize) -> usize;
c_return_enum(n: u16) -> Enum120 fn c_return_enum(n: u16) -> Enum;
c_return_ns_ref(shared: &AShared) -> &usize121 fn c_return_ns_ref(shared: &AShared) -> &usize;
c_return_nested_ns_ref(shared: &ABShared) -> &usize122 fn c_return_nested_ns_ref(shared: &ABShared) -> &usize;
c_return_ns_enum(n: u16) -> AEnum123 fn c_return_ns_enum(n: u16) -> AEnum;
c_return_nested_ns_enum(n: u16) -> ABEnum124 fn c_return_nested_ns_enum(n: u16) -> ABEnum;
c_return_const_ptr(n: usize) -> *const C125 fn c_return_const_ptr(n: usize) -> *const C;
c_return_mut_ptr(n: usize) -> *mut C126 fn c_return_mut_ptr(n: usize) -> *mut C;
127
c_take_primitive(n: usize)128 fn c_take_primitive(n: usize);
c_take_shared(shared: Shared)129 fn c_take_shared(shared: Shared);
c_take_box(r: Box<R>)130 fn c_take_box(r: Box<R>);
c_take_ref_r(r: &R)131 fn c_take_ref_r(r: &R);
c_take_ref_c(c: &C)132 fn c_take_ref_c(c: &C);
c_take_str(s: &str)133 fn c_take_str(s: &str);
c_take_slice_char(s: &[c_char])134 fn c_take_slice_char(s: &[c_char]);
c_take_slice_shared(s: &[Shared])135 fn c_take_slice_shared(s: &[Shared]);
c_take_slice_shared_sort(s: &mut [Shared])136 fn c_take_slice_shared_sort(s: &mut [Shared]);
c_take_slice_r(s: &[R])137 fn c_take_slice_r(s: &[R]);
c_take_slice_r_sort(s: &mut [R])138 fn c_take_slice_r_sort(s: &mut [R]);
c_take_rust_string(s: String)139 fn c_take_rust_string(s: String);
c_take_unique_ptr_string(s: UniquePtr<CxxString>)140 fn c_take_unique_ptr_string(s: UniquePtr<CxxString>);
c_take_unique_ptr_vector_u8(v: UniquePtr<CxxVector<u8>>)141 fn c_take_unique_ptr_vector_u8(v: UniquePtr<CxxVector<u8>>);
c_take_unique_ptr_vector_f64(v: UniquePtr<CxxVector<f64>>)142 fn c_take_unique_ptr_vector_f64(v: UniquePtr<CxxVector<f64>>);
c_take_unique_ptr_vector_string(v: UniquePtr<CxxVector<CxxString>>)143 fn c_take_unique_ptr_vector_string(v: UniquePtr<CxxVector<CxxString>>);
c_take_unique_ptr_vector_shared(v: UniquePtr<CxxVector<Shared>>)144 fn c_take_unique_ptr_vector_shared(v: UniquePtr<CxxVector<Shared>>);
c_take_ref_vector(v: &CxxVector<u8>)145 fn c_take_ref_vector(v: &CxxVector<u8>);
c_take_rust_vec(v: Vec<u8>)146 fn c_take_rust_vec(v: Vec<u8>);
c_take_rust_vec_shared(v: Vec<Shared>)147 fn c_take_rust_vec_shared(v: Vec<Shared>);
c_take_rust_vec_string(v: Vec<String>)148 fn c_take_rust_vec_string(v: Vec<String>);
c_take_rust_vec_index(v: Vec<u8>)149 fn c_take_rust_vec_index(v: Vec<u8>);
c_take_rust_vec_shared_index(v: Vec<Shared>)150 fn c_take_rust_vec_shared_index(v: Vec<Shared>);
c_take_rust_vec_shared_push(v: Vec<Shared>)151 fn c_take_rust_vec_shared_push(v: Vec<Shared>);
c_take_rust_vec_shared_forward_iterator(v: Vec<Shared>)152 fn c_take_rust_vec_shared_forward_iterator(v: Vec<Shared>);
c_take_rust_vec_shared_sort(v: Vec<Shared>)153 fn c_take_rust_vec_shared_sort(v: Vec<Shared>);
c_take_ref_rust_vec(v: &Vec<u8>)154 fn c_take_ref_rust_vec(v: &Vec<u8>);
c_take_ref_rust_vec_string(v: &Vec<String>)155 fn c_take_ref_rust_vec_string(v: &Vec<String>);
c_take_ref_rust_vec_index(v: &Vec<u8>)156 fn c_take_ref_rust_vec_index(v: &Vec<u8>);
c_take_ref_rust_vec_copy(v: &Vec<u8>)157 fn c_take_ref_rust_vec_copy(v: &Vec<u8>);
c_take_ref_shared_string(s: &SharedString) -> &SharedString158 fn c_take_ref_shared_string(s: &SharedString) -> &SharedString;
c_take_callback(callback: fn(String) -> usize)159 fn c_take_callback(callback: fn(String) -> usize);
c_take_callback_ref(callback: fn(&String))160 fn c_take_callback_ref(callback: fn(&String));
161 #[cxx_name = "c_take_callback_ref"]
c_take_callback_ref_lifetime<'a>(callback: fn(&'a String))162 fn c_take_callback_ref_lifetime<'a>(callback: fn(&'a String));
c_take_callback_mut(callback: fn(&mut String))163 fn c_take_callback_mut(callback: fn(&mut String));
c_take_enum(e: Enum)164 fn c_take_enum(e: Enum);
c_take_ns_enum(e: AEnum)165 fn c_take_ns_enum(e: AEnum);
c_take_nested_ns_enum(e: ABEnum)166 fn c_take_nested_ns_enum(e: ABEnum);
c_take_ns_shared(shared: AShared)167 fn c_take_ns_shared(shared: AShared);
c_take_nested_ns_shared(shared: ABShared)168 fn c_take_nested_ns_shared(shared: ABShared);
c_take_rust_vec_ns_shared(v: Vec<AShared>)169 fn c_take_rust_vec_ns_shared(v: Vec<AShared>);
c_take_rust_vec_nested_ns_shared(v: Vec<ABShared>)170 fn c_take_rust_vec_nested_ns_shared(v: Vec<ABShared>);
c_take_const_ptr(c: *const C) -> usize171 unsafe fn c_take_const_ptr(c: *const C) -> usize;
c_take_mut_ptr(c: *mut C) -> usize172 unsafe fn c_take_mut_ptr(c: *mut C) -> usize;
173
c_try_return_void() -> Result<()>174 fn c_try_return_void() -> Result<()>;
c_try_return_primitive() -> Result<usize>175 fn c_try_return_primitive() -> Result<usize>;
c_fail_return_primitive() -> Result<usize>176 fn c_fail_return_primitive() -> Result<usize>;
c_try_return_box() -> Result<Box<R>>177 fn c_try_return_box() -> Result<Box<R>>;
c_try_return_ref(s: &String) -> Result<&String>178 fn c_try_return_ref(s: &String) -> Result<&String>;
c_try_return_str(s: &str) -> Result<&str>179 fn c_try_return_str(s: &str) -> Result<&str>;
c_try_return_sliceu8(s: &[u8]) -> Result<&[u8]>180 fn c_try_return_sliceu8(s: &[u8]) -> Result<&[u8]>;
c_try_return_mutsliceu8(s: &mut [u8]) -> Result<&mut [u8]>181 fn c_try_return_mutsliceu8(s: &mut [u8]) -> Result<&mut [u8]>;
c_try_return_rust_string() -> Result<String>182 fn c_try_return_rust_string() -> Result<String>;
c_try_return_unique_ptr_string() -> Result<UniquePtr<CxxString>>183 fn c_try_return_unique_ptr_string() -> Result<UniquePtr<CxxString>>;
c_try_return_rust_vec() -> Result<Vec<u8>>184 fn c_try_return_rust_vec() -> Result<Vec<u8>>;
c_try_return_rust_vec_string() -> Result<Vec<String>>185 fn c_try_return_rust_vec_string() -> Result<Vec<String>>;
c_try_return_ref_rust_vec(c: &C) -> Result<&Vec<u8>>186 fn c_try_return_ref_rust_vec(c: &C) -> Result<&Vec<u8>>;
187
get(self: &C) -> usize188 fn get(self: &C) -> usize;
set(self: Pin<&mut C>, n: usize) -> usize189 fn set(self: Pin<&mut C>, n: usize) -> usize;
get2(&self) -> usize190 fn get2(&self) -> usize;
getRef(self: &C) -> &usize191 fn getRef(self: &C) -> &usize;
getMut(self: Pin<&mut C>) -> &mut usize192 fn getMut(self: Pin<&mut C>) -> &mut usize;
set_succeed(self: Pin<&mut C>, n: usize) -> Result<usize>193 fn set_succeed(self: Pin<&mut C>, n: usize) -> Result<usize>;
get_fail(self: Pin<&mut C>) -> Result<usize>194 fn get_fail(self: Pin<&mut C>) -> Result<usize>;
c_method_on_shared(self: &Shared) -> usize195 fn c_method_on_shared(self: &Shared) -> usize;
c_method_ref_on_shared(self: &Shared) -> &usize196 fn c_method_ref_on_shared(self: &Shared) -> &usize;
c_method_mut_on_shared(self: &mut Shared) -> &mut usize197 fn c_method_mut_on_shared(self: &mut Shared) -> &mut usize;
c_set_array(self: &mut Array, value: i32)198 fn c_set_array(self: &mut Array, value: i32);
199
c_get_use_count(weak: &WeakPtr<C>) -> usize200 fn c_get_use_count(weak: &WeakPtr<C>) -> usize;
201
202 #[rust_name = "i32_overloaded_method"]
cOverloadedMethod(&self, x: i32) -> String203 fn cOverloadedMethod(&self, x: i32) -> String;
204 #[rust_name = "str_overloaded_method"]
cOverloadedMethod(&self, x: &str) -> String205 fn cOverloadedMethod(&self, x: &str) -> String;
206 #[rust_name = "i32_overloaded_function"]
cOverloadedFunction(x: i32) -> String207 fn cOverloadedFunction(x: i32) -> String;
208 #[rust_name = "str_overloaded_function"]
cOverloadedFunction(x: &str) -> String209 fn cOverloadedFunction(x: &str) -> String;
210
211 #[namespace = "other"]
ns_c_take_ns_shared(shared: AShared)212 fn ns_c_take_ns_shared(shared: AShared);
213 }
214
215 extern "C++" {
216 include!("tests/ffi/module.rs.h");
217
218 type COwnedEnum;
219 type Job = crate::module::ffi::Job;
220 }
221
222 extern "Rust" {
223 #[derive(ExternType)]
224 type Reference<'a>;
225 }
226
227 unsafe extern "C++" {
228 type Borrow<'a>;
229
c_return_borrow<'a>(s: &'a CxxString) -> UniquePtr<Borrow<'a>>230 fn c_return_borrow<'a>(s: &'a CxxString) -> UniquePtr<Borrow<'a>>;
231
232 #[rust_name = "c_return_borrow_elided"]
c_return_borrow(s: &CxxString) -> UniquePtr<Borrow>233 fn c_return_borrow(s: &CxxString) -> UniquePtr<Borrow>;
234
const_member(self: &Borrow)235 fn const_member(self: &Borrow);
nonconst_member(self: Pin<&mut Borrow>)236 fn nonconst_member(self: Pin<&mut Borrow>);
237 }
238
239 #[repr(u32)]
240 #[derive(Hash)]
241 enum COwnedEnum {
242 #[cxx_name = "CVAL1"]
243 CVal1,
244 #[cxx_name = "CVAL2"]
245 CVal2,
246 }
247
248 extern "Rust" {
249 type R;
250
r_return_primitive() -> usize251 fn r_return_primitive() -> usize;
r_return_shared() -> Shared252 fn r_return_shared() -> Shared;
r_return_box() -> Box<R>253 fn r_return_box() -> Box<R>;
r_return_unique_ptr() -> UniquePtr<C>254 fn r_return_unique_ptr() -> UniquePtr<C>;
r_return_shared_ptr() -> SharedPtr<C>255 fn r_return_shared_ptr() -> SharedPtr<C>;
r_return_ref(shared: &Shared) -> &usize256 fn r_return_ref(shared: &Shared) -> &usize;
r_return_mut(shared: &mut Shared) -> &mut usize257 fn r_return_mut(shared: &mut Shared) -> &mut usize;
r_return_str(shared: &Shared) -> &str258 fn r_return_str(shared: &Shared) -> &str;
r_return_sliceu8(shared: &Shared) -> &[u8]259 fn r_return_sliceu8(shared: &Shared) -> &[u8];
r_return_mutsliceu8(slice: &mut [u8]) -> &mut [u8]260 fn r_return_mutsliceu8(slice: &mut [u8]) -> &mut [u8];
r_return_rust_string() -> String261 fn r_return_rust_string() -> String;
r_return_unique_ptr_string() -> UniquePtr<CxxString>262 fn r_return_unique_ptr_string() -> UniquePtr<CxxString>;
r_return_rust_vec() -> Vec<u8>263 fn r_return_rust_vec() -> Vec<u8>;
r_return_rust_vec_string() -> Vec<String>264 fn r_return_rust_vec_string() -> Vec<String>;
r_return_rust_vec_extern_struct() -> Vec<Job>265 fn r_return_rust_vec_extern_struct() -> Vec<Job>;
r_return_ref_rust_vec(shared: &Shared) -> &Vec<u8>266 fn r_return_ref_rust_vec(shared: &Shared) -> &Vec<u8>;
r_return_mut_rust_vec(shared: &mut Shared) -> &mut Vec<u8>267 fn r_return_mut_rust_vec(shared: &mut Shared) -> &mut Vec<u8>;
r_return_identity(_: usize) -> usize268 fn r_return_identity(_: usize) -> usize;
r_return_sum(_: usize, _: usize) -> usize269 fn r_return_sum(_: usize, _: usize) -> usize;
r_return_enum(n: u32) -> Enum270 fn r_return_enum(n: u32) -> Enum;
271
r_take_primitive(n: usize)272 fn r_take_primitive(n: usize);
r_take_shared(shared: Shared)273 fn r_take_shared(shared: Shared);
r_take_box(r: Box<R>)274 fn r_take_box(r: Box<R>);
r_take_unique_ptr(c: UniquePtr<C>)275 fn r_take_unique_ptr(c: UniquePtr<C>);
r_take_shared_ptr(c: SharedPtr<C>)276 fn r_take_shared_ptr(c: SharedPtr<C>);
r_take_ref_r(r: &R)277 fn r_take_ref_r(r: &R);
r_take_ref_c(c: &C)278 fn r_take_ref_c(c: &C);
r_take_str(s: &str)279 fn r_take_str(s: &str);
r_take_slice_char(s: &[c_char])280 fn r_take_slice_char(s: &[c_char]);
r_take_rust_string(s: String)281 fn r_take_rust_string(s: String);
r_take_unique_ptr_string(s: UniquePtr<CxxString>)282 fn r_take_unique_ptr_string(s: UniquePtr<CxxString>);
r_take_ref_vector(v: &CxxVector<u8>)283 fn r_take_ref_vector(v: &CxxVector<u8>);
r_take_ref_empty_vector(v: &CxxVector<u64>)284 fn r_take_ref_empty_vector(v: &CxxVector<u64>);
r_take_rust_vec(v: Vec<u8>)285 fn r_take_rust_vec(v: Vec<u8>);
r_take_rust_vec_string(v: Vec<String>)286 fn r_take_rust_vec_string(v: Vec<String>);
r_take_ref_rust_vec(v: &Vec<u8>)287 fn r_take_ref_rust_vec(v: &Vec<u8>);
r_take_ref_rust_vec_string(v: &Vec<String>)288 fn r_take_ref_rust_vec_string(v: &Vec<String>);
r_take_enum(e: Enum)289 fn r_take_enum(e: Enum);
290
r_try_return_void() -> Result<()>291 fn r_try_return_void() -> Result<()>;
r_try_return_primitive() -> Result<usize>292 fn r_try_return_primitive() -> Result<usize>;
r_try_return_box() -> Result<Box<R>>293 fn r_try_return_box() -> Result<Box<R>>;
r_fail_return_primitive() -> Result<usize>294 fn r_fail_return_primitive() -> Result<usize>;
r_try_return_sliceu8(s: &[u8]) -> Result<&[u8]>295 fn r_try_return_sliceu8(s: &[u8]) -> Result<&[u8]>;
r_try_return_mutsliceu8(s: &mut [u8]) -> Result<&mut [u8]>296 fn r_try_return_mutsliceu8(s: &mut [u8]) -> Result<&mut [u8]>;
297
get(self: &R) -> usize298 fn get(self: &R) -> usize;
set(self: &mut R, n: usize) -> usize299 fn set(self: &mut R, n: usize) -> usize;
r_method_on_shared(self: &Shared) -> String300 fn r_method_on_shared(self: &Shared) -> String;
r_get_array_sum(self: &Array) -> i32301 fn r_get_array_sum(self: &Array) -> i32;
302
303 #[cxx_name = "rAliasedFunction"]
r_aliased_function(x: i32) -> String304 fn r_aliased_function(x: i32) -> String;
305 }
306
307 struct Dag0 {
308 i: i32,
309 }
310
311 struct Dag1 {
312 dag2: Dag2,
313 vec: Vec<Dag3>,
314 }
315
316 struct Dag2 {
317 dag4: Dag4,
318 }
319
320 struct Dag3 {
321 dag1: Dag1,
322 }
323
324 struct Dag4 {
325 dag0: Dag0,
326 }
327
328 impl Box<Shared> {}
329 impl CxxVector<SharedString> {}
330 }
331
332 mod other {
333 use cxx::kind::{Opaque, Trivial};
334 use cxx::{type_id, CxxString, ExternType};
335
336 #[repr(C)]
337 pub struct D {
338 pub d: u64,
339 }
340
341 #[repr(C)]
342 pub struct E {
343 e: u64,
344 e_str: CxxString,
345 }
346
347 pub mod f {
348 use cxx::kind::Opaque;
349 use cxx::{type_id, CxxString, ExternType};
350
351 #[repr(C)]
352 pub struct F {
353 e: u64,
354 e_str: CxxString,
355 }
356
357 unsafe impl ExternType for F {
358 type Id = type_id!("F::F");
359 type Kind = Opaque;
360 }
361 }
362
363 #[repr(C)]
364 pub struct G {
365 pub g: u64,
366 }
367
368 unsafe impl ExternType for G {
369 type Id = type_id!("G::G");
370 type Kind = Trivial;
371 }
372
373 unsafe impl ExternType for D {
374 type Id = type_id!("tests::D");
375 type Kind = Trivial;
376 }
377
378 unsafe impl ExternType for E {
379 type Id = type_id!("tests::E");
380 type Kind = Opaque;
381 }
382 }
383
384 #[derive(PartialEq, Debug)]
385 pub struct R(pub usize);
386
387 impl R {
get(&self) -> usize388 fn get(&self) -> usize {
389 self.0
390 }
391
set(&mut self, n: usize) -> usize392 fn set(&mut self, n: usize) -> usize {
393 self.0 = n;
394 n
395 }
396 }
397
398 pub struct Reference<'a>(&'a String);
399
400 impl ffi::Shared {
r_method_on_shared(&self) -> String401 fn r_method_on_shared(&self) -> String {
402 "2020".to_owned()
403 }
404 }
405
406 impl ffi::Array {
r_get_array_sum(&self) -> i32407 pub fn r_get_array_sum(&self) -> i32 {
408 self.a.iter().sum()
409 }
410 }
411
412 #[derive(Debug)]
413 struct Error;
414
415 impl std::error::Error for Error {}
416
417 impl Display for Error {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result418 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
419 f.write_str("rust error")
420 }
421 }
422
r_return_primitive() -> usize423 fn r_return_primitive() -> usize {
424 2020
425 }
426
r_return_shared() -> ffi::Shared427 fn r_return_shared() -> ffi::Shared {
428 ffi::Shared { z: 2020 }
429 }
430
r_return_box() -> Box<R>431 fn r_return_box() -> Box<R> {
432 Box::new(R(2020))
433 }
434
r_return_unique_ptr() -> UniquePtr<ffi::C>435 fn r_return_unique_ptr() -> UniquePtr<ffi::C> {
436 extern "C" {
437 fn cxx_test_suite_get_unique_ptr() -> *mut ffi::C;
438 }
439 unsafe { UniquePtr::from_raw(cxx_test_suite_get_unique_ptr()) }
440 }
441
r_return_shared_ptr() -> SharedPtr<ffi::C>442 fn r_return_shared_ptr() -> SharedPtr<ffi::C> {
443 extern "C" {
444 fn cxx_test_suite_get_shared_ptr(repr: *mut SharedPtr<ffi::C>);
445 }
446 let mut shared_ptr = MaybeUninit::<SharedPtr<ffi::C>>::uninit();
447 let repr = shared_ptr.as_mut_ptr();
448 unsafe {
449 cxx_test_suite_get_shared_ptr(repr);
450 shared_ptr.assume_init()
451 }
452 }
453
r_return_ref(shared: &ffi::Shared) -> &usize454 fn r_return_ref(shared: &ffi::Shared) -> &usize {
455 &shared.z
456 }
457
r_return_mut(shared: &mut ffi::Shared) -> &mut usize458 fn r_return_mut(shared: &mut ffi::Shared) -> &mut usize {
459 &mut shared.z
460 }
461
r_return_str(shared: &ffi::Shared) -> &str462 fn r_return_str(shared: &ffi::Shared) -> &str {
463 let _ = shared;
464 "2020"
465 }
466
r_return_sliceu8(shared: &ffi::Shared) -> &[u8]467 fn r_return_sliceu8(shared: &ffi::Shared) -> &[u8] {
468 let _ = shared;
469 b"2020"
470 }
471
r_return_mutsliceu8(slice: &mut [u8]) -> &mut [u8]472 fn r_return_mutsliceu8(slice: &mut [u8]) -> &mut [u8] {
473 slice
474 }
475
r_return_rust_string() -> String476 fn r_return_rust_string() -> String {
477 "2020".to_owned()
478 }
479
r_return_unique_ptr_string() -> UniquePtr<CxxString>480 fn r_return_unique_ptr_string() -> UniquePtr<CxxString> {
481 extern "C" {
482 fn cxx_test_suite_get_unique_ptr_string() -> *mut CxxString;
483 }
484 unsafe { UniquePtr::from_raw(cxx_test_suite_get_unique_ptr_string()) }
485 }
486
r_return_rust_vec() -> Vec<u8>487 fn r_return_rust_vec() -> Vec<u8> {
488 Vec::new()
489 }
490
r_return_rust_vec_string() -> Vec<String>491 fn r_return_rust_vec_string() -> Vec<String> {
492 Vec::new()
493 }
494
r_return_rust_vec_extern_struct() -> Vec<ffi::Job>495 fn r_return_rust_vec_extern_struct() -> Vec<ffi::Job> {
496 Vec::new()
497 }
498
r_return_ref_rust_vec(shared: &ffi::Shared) -> &Vec<u8>499 fn r_return_ref_rust_vec(shared: &ffi::Shared) -> &Vec<u8> {
500 let _ = shared;
501 unimplemented!()
502 }
503
r_return_mut_rust_vec(shared: &mut ffi::Shared) -> &mut Vec<u8>504 fn r_return_mut_rust_vec(shared: &mut ffi::Shared) -> &mut Vec<u8> {
505 let _ = shared;
506 unimplemented!()
507 }
508
r_return_identity(n: usize) -> usize509 fn r_return_identity(n: usize) -> usize {
510 n
511 }
512
r_return_sum(n1: usize, n2: usize) -> usize513 fn r_return_sum(n1: usize, n2: usize) -> usize {
514 n1 + n2
515 }
516
r_return_enum(n: u32) -> ffi::Enum517 fn r_return_enum(n: u32) -> ffi::Enum {
518 if n == 0 {
519 ffi::Enum::AVal
520 } else if n <= 2020 {
521 ffi::Enum::BVal
522 } else {
523 ffi::Enum::LastVal
524 }
525 }
526
r_take_primitive(n: usize)527 fn r_take_primitive(n: usize) {
528 assert_eq!(n, 2020);
529 }
530
r_take_shared(shared: ffi::Shared)531 fn r_take_shared(shared: ffi::Shared) {
532 assert_eq!(shared.z, 2020);
533 }
534
r_take_box(r: Box<R>)535 fn r_take_box(r: Box<R>) {
536 let _ = r;
537 }
538
r_take_unique_ptr(c: UniquePtr<ffi::C>)539 fn r_take_unique_ptr(c: UniquePtr<ffi::C>) {
540 let _ = c;
541 }
542
r_take_shared_ptr(c: SharedPtr<ffi::C>)543 fn r_take_shared_ptr(c: SharedPtr<ffi::C>) {
544 let _ = c;
545 }
546
r_take_ref_r(r: &R)547 fn r_take_ref_r(r: &R) {
548 let _ = r;
549 }
550
r_take_ref_c(c: &ffi::C)551 fn r_take_ref_c(c: &ffi::C) {
552 let _ = c;
553 }
554
r_take_str(s: &str)555 fn r_take_str(s: &str) {
556 assert_eq!(s, "2020");
557 }
558
r_take_rust_string(s: String)559 fn r_take_rust_string(s: String) {
560 assert_eq!(s, "2020");
561 }
562
r_take_slice_char(s: &[c_char])563 fn r_take_slice_char(s: &[c_char]) {
564 assert_eq!(s.len(), 5);
565 let s = cast::c_char_to_unsigned(s);
566 assert_eq!(std::str::from_utf8(s).unwrap(), "2020\0");
567 }
568
r_take_unique_ptr_string(s: UniquePtr<CxxString>)569 fn r_take_unique_ptr_string(s: UniquePtr<CxxString>) {
570 assert_eq!(s.as_ref().unwrap().to_str().unwrap(), "2020");
571 }
572
r_take_ref_vector(v: &CxxVector<u8>)573 fn r_take_ref_vector(v: &CxxVector<u8>) {
574 let slice = v.as_slice();
575 assert_eq!(slice, [20, 2, 0]);
576 }
577
r_take_ref_empty_vector(v: &CxxVector<u64>)578 fn r_take_ref_empty_vector(v: &CxxVector<u64>) {
579 assert!(v.as_slice().is_empty());
580 assert!(v.is_empty());
581 }
582
r_take_rust_vec(v: Vec<u8>)583 fn r_take_rust_vec(v: Vec<u8>) {
584 let _ = v;
585 }
586
r_take_rust_vec_string(v: Vec<String>)587 fn r_take_rust_vec_string(v: Vec<String>) {
588 let _ = v;
589 }
590
r_take_ref_rust_vec(v: &Vec<u8>)591 fn r_take_ref_rust_vec(v: &Vec<u8>) {
592 let _ = v;
593 }
594
r_take_ref_rust_vec_string(v: &Vec<String>)595 fn r_take_ref_rust_vec_string(v: &Vec<String>) {
596 let _ = v;
597 }
598
r_take_enum(e: ffi::Enum)599 fn r_take_enum(e: ffi::Enum) {
600 let _ = e;
601 }
602
r_try_return_void() -> Result<(), Error>603 fn r_try_return_void() -> Result<(), Error> {
604 Ok(())
605 }
606
r_try_return_primitive() -> Result<usize, Error>607 fn r_try_return_primitive() -> Result<usize, Error> {
608 Ok(2020)
609 }
610
r_try_return_box() -> Result<Box<R>, Error>611 fn r_try_return_box() -> Result<Box<R>, Error> {
612 Ok(Box::new(R(2020)))
613 }
614
r_fail_return_primitive() -> Result<usize, Error>615 fn r_fail_return_primitive() -> Result<usize, Error> {
616 Err(Error)
617 }
618
r_try_return_sliceu8(slice: &[u8]) -> Result<&[u8], Error>619 fn r_try_return_sliceu8(slice: &[u8]) -> Result<&[u8], Error> {
620 Ok(slice)
621 }
622
r_try_return_mutsliceu8(slice: &mut [u8]) -> Result<&mut [u8], Error>623 fn r_try_return_mutsliceu8(slice: &mut [u8]) -> Result<&mut [u8], Error> {
624 Ok(slice)
625 }
626
r_aliased_function(x: i32) -> String627 fn r_aliased_function(x: i32) -> String {
628 x.to_string()
629 }
630