blob: c7096788af7680d53d0035493704a3178215b482 [file] [log] [blame]
David Tolnayad5b8af2020-01-26 16:59:13 -08001use cxx::{CxxString, UniquePtr};
2
David Tolnay97c72102020-01-25 16:49:00 -08003#[cxx::bridge(namespace = tests)]
4pub mod ffi {
David Tolnayad5b8af2020-01-26 16:59:13 -08005 struct Shared {
6 z: usize,
7 }
8
David Tolnay97c72102020-01-25 16:49:00 -08009 extern "C" {
10 include!("tests/ffi/tests.h");
David Tolnayad5b8af2020-01-26 16:59:13 -080011
12 type C;
13
14 fn c_return_primitive() -> usize;
15 fn c_return_shared() -> Shared;
David Tolnaybe13d8a2020-03-06 15:45:39 -080016 fn c_return_box() -> Box<R>;
David Tolnayad5b8af2020-01-26 16:59:13 -080017 fn c_return_unique_ptr() -> UniquePtr<C>;
18 fn c_return_ref(shared: &Shared) -> &usize;
19 fn c_return_str(shared: &Shared) -> &str;
20 fn c_return_rust_string() -> String;
21 fn c_return_unique_ptr_string() -> UniquePtr<CxxString>;
22
23 fn c_take_primitive(n: usize);
24 fn c_take_shared(shared: Shared);
25 fn c_take_box(r: Box<R>);
26 fn c_take_unique_ptr(c: UniquePtr<C>);
David Tolnaya7d00e82020-03-06 15:50:14 -080027 fn c_take_ref_r(r: &R);
David Tolnayad5b8af2020-01-26 16:59:13 -080028 fn c_take_ref_c(c: &C);
29 fn c_take_str(s: &str);
30 fn c_take_rust_string(s: String);
31 fn c_take_unique_ptr_string(s: UniquePtr<CxxString>);
David Tolnay97c72102020-01-25 16:49:00 -080032 }
David Tolnayad5b8af2020-01-26 16:59:13 -080033
34 extern "Rust" {
35 type R;
36
37 fn r_return_primitive() -> usize;
38 fn r_return_shared() -> Shared;
David Tolnay5cd8d612020-03-06 15:56:30 -080039 fn r_return_box() -> Box<R>;
David Tolnay4b3a66e2020-03-06 16:14:00 -080040 fn r_return_unique_ptr() -> UniquePtr<C>;
David Tolnayad5b8af2020-01-26 16:59:13 -080041 fn r_return_ref(shared: &Shared) -> &usize;
42 fn r_return_str(shared: &Shared) -> &str;
43 fn r_return_rust_string() -> String;
David Tolnay85db24862020-03-06 16:24:41 -080044 fn r_return_unique_ptr_string() -> UniquePtr<CxxString>;
David Tolnayad5b8af2020-01-26 16:59:13 -080045
46 fn r_take_primitive(n: usize);
47 fn r_take_shared(shared: Shared);
48 fn r_take_box(r: Box<R>);
49 fn r_take_unique_ptr(c: UniquePtr<C>);
50 fn r_take_ref_r(r: &R);
51 fn r_take_ref_c(c: &C);
52 fn r_take_str(s: &str);
53 fn r_take_rust_string(s: String);
54 fn r_take_unique_ptr_string(s: UniquePtr<CxxString>);
55 }
56}
57
David Tolnaybe13d8a2020-03-06 15:45:39 -080058pub type R = usize;
David Tolnayad5b8af2020-01-26 16:59:13 -080059
60fn r_return_primitive() -> usize {
61 2020
62}
63
64fn r_return_shared() -> ffi::Shared {
65 ffi::Shared { z: 2020 }
66}
67
David Tolnay5cd8d612020-03-06 15:56:30 -080068fn r_return_box() -> Box<R> {
69 Box::new(2020)
70}
71
David Tolnay4b3a66e2020-03-06 16:14:00 -080072fn r_return_unique_ptr() -> UniquePtr<ffi::C> {
73 extern "C" {
74 fn cxx_test_suite_get_unique_ptr() -> *mut ffi::C;
75 }
76 unsafe { UniquePtr::from_raw(cxx_test_suite_get_unique_ptr()) }
77}
78
David Tolnayad5b8af2020-01-26 16:59:13 -080079fn r_return_ref(shared: &ffi::Shared) -> &usize {
80 &shared.z
81}
82
83fn r_return_str(shared: &ffi::Shared) -> &str {
84 let _ = shared;
85 "2020"
86}
87
88fn r_return_rust_string() -> String {
89 "2020".to_owned()
90}
91
David Tolnay85db24862020-03-06 16:24:41 -080092fn r_return_unique_ptr_string() -> UniquePtr<CxxString> {
93 extern "C" {
94 fn cxx_test_suite_get_unique_ptr_string() -> *mut CxxString;
95 }
96 unsafe { UniquePtr::from_raw(cxx_test_suite_get_unique_ptr_string()) }
97}
98
David Tolnayad5b8af2020-01-26 16:59:13 -080099fn r_take_primitive(n: usize) {
David Tolnayf306da42020-02-22 19:55:43 -0800100 assert_eq!(n, 2020);
David Tolnayad5b8af2020-01-26 16:59:13 -0800101}
102
103fn r_take_shared(shared: ffi::Shared) {
David Tolnayf306da42020-02-22 19:55:43 -0800104 assert_eq!(shared.z, 2020);
David Tolnayad5b8af2020-01-26 16:59:13 -0800105}
106
107fn r_take_box(r: Box<R>) {
108 let _ = r;
109}
110
111fn r_take_unique_ptr(c: UniquePtr<ffi::C>) {
112 let _ = c;
113}
114
115fn r_take_ref_r(r: &R) {
116 let _ = r;
117}
118
119fn r_take_ref_c(c: &ffi::C) {
120 let _ = c;
121}
122
123fn r_take_str(s: &str) {
David Tolnayf306da42020-02-22 19:55:43 -0800124 assert_eq!(s, "2020");
David Tolnayad5b8af2020-01-26 16:59:13 -0800125}
126
127fn r_take_rust_string(s: String) {
David Tolnayf306da42020-02-22 19:55:43 -0800128 assert_eq!(s, "2020");
David Tolnayad5b8af2020-01-26 16:59:13 -0800129}
130
131fn r_take_unique_ptr_string(s: UniquePtr<CxxString>) {
David Tolnayf306da42020-02-22 19:55:43 -0800132 assert_eq!(s.as_ref().unwrap().to_str().unwrap(), "2020");
David Tolnay97c72102020-01-25 16:49:00 -0800133}