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