blob: d4e96fc22ec0afcf5db747a136278b165a6d9410 [file] [log] [blame]
David Tolnaya95b2342020-04-09 23:26:05 -07001#![allow(
2 clippy::boxed_local,
3 clippy::ptr_arg,
4 clippy::trivially_copy_pass_by_ref
5)]
David Tolnay265f6a02020-03-18 20:13:55 -07006
David Tolnaya62cca22020-05-07 21:52:16 -07007pub mod module;
8
David Tolnayad5b8af2020-01-26 16:59:13 -08009use cxx::{CxxString, UniquePtr};
David Tolnayb6c5ea72020-03-16 13:36:28 -070010use std::fmt::{self, Display};
David Tolnayad5b8af2020-01-26 16:59:13 -080011
David Tolnay97c72102020-01-25 16:49:00 -080012#[cxx::bridge(namespace = tests)]
13pub mod ffi {
David Tolnayad5b8af2020-01-26 16:59:13 -080014 struct Shared {
15 z: usize,
16 }
17
Joel Galensonc03402a2020-04-23 17:31:09 -070018 enum Enum {
19 AVal,
20 BVal = 2020,
21 CVal,
22 }
23
David Tolnay97c72102020-01-25 16:49:00 -080024 extern "C" {
25 include!("tests/ffi/tests.h");
David Tolnayad5b8af2020-01-26 16:59:13 -080026
27 type C;
28
29 fn c_return_primitive() -> usize;
30 fn c_return_shared() -> Shared;
David Tolnaybe13d8a2020-03-06 15:45:39 -080031 fn c_return_box() -> Box<R>;
David Tolnayad5b8af2020-01-26 16:59:13 -080032 fn c_return_unique_ptr() -> UniquePtr<C>;
33 fn c_return_ref(shared: &Shared) -> &usize;
34 fn c_return_str(shared: &Shared) -> &str;
Adrian Taylorf5dd5522020-04-13 16:50:14 -070035 fn c_return_sliceu8(shared: &Shared) -> &[u8];
David Tolnayad5b8af2020-01-26 16:59:13 -080036 fn c_return_rust_string() -> String;
37 fn c_return_unique_ptr_string() -> UniquePtr<CxxString>;
David Tolnaye1dcdf72020-04-24 17:40:55 -070038 fn c_return_unique_ptr_vector_u8() -> UniquePtr<CxxVector<u8>>;
39 fn c_return_unique_ptr_vector_f64() -> UniquePtr<CxxVector<f64>>;
40 fn c_return_unique_ptr_vector_shared() -> UniquePtr<CxxVector<Shared>>;
David Tolnay1bcc9fe2020-04-25 13:51:07 -070041 fn c_return_unique_ptr_vector_opaque() -> UniquePtr<CxxVector<C>>;
David Tolnayde5340e2020-04-25 14:03:21 -070042 fn c_return_ref_vector(c: &C) -> &CxxVector<u8>;
David Tolnayb41e74c2020-04-25 15:06:18 -070043 fn c_return_rust_vec() -> Vec<u8>;
David Tolnay77989692020-04-25 15:57:47 -070044 fn c_return_ref_rust_vec(c: &C) -> &Vec<u8>;
Joel Galensonba676072020-04-27 15:55:45 -070045 fn c_return_identity(_: usize) -> usize;
46 fn c_return_sum(_: usize, _: usize) -> usize;
David Tolnayf6a89f22020-05-10 23:39:27 -070047 fn c_return_enum(n: u16) -> Enum;
David Tolnayad5b8af2020-01-26 16:59:13 -080048
49 fn c_take_primitive(n: usize);
50 fn c_take_shared(shared: Shared);
51 fn c_take_box(r: Box<R>);
David Tolnaya7d00e82020-03-06 15:50:14 -080052 fn c_take_ref_r(r: &R);
David Tolnayad5b8af2020-01-26 16:59:13 -080053 fn c_take_ref_c(c: &C);
54 fn c_take_str(s: &str);
Adrian Taylorf5dd5522020-04-13 16:50:14 -070055 fn c_take_sliceu8(s: &[u8]);
David Tolnayad5b8af2020-01-26 16:59:13 -080056 fn c_take_rust_string(s: String);
57 fn c_take_unique_ptr_string(s: UniquePtr<CxxString>);
David Tolnay9b304202020-04-25 13:54:55 -070058 fn c_take_unique_ptr_vector_u8(v: UniquePtr<CxxVector<u8>>);
59 fn c_take_unique_ptr_vector_f64(v: UniquePtr<CxxVector<f64>>);
60 fn c_take_unique_ptr_vector_shared(v: UniquePtr<CxxVector<Shared>>);
David Tolnay2244d1f2020-04-25 13:58:18 -070061 fn c_take_ref_vector(v: &CxxVector<u8>);
David Tolnayd2ce8a92020-04-25 16:16:45 -070062 fn c_take_rust_vec(v: Vec<u8>);
63 fn c_take_rust_vec_shared(v: Vec<Shared>);
myronahnda9be502020-04-29 05:47:23 +070064 fn c_take_rust_vec_shared_forward_iterator(v: Vec<Shared>);
David Tolnayd2ce8a92020-04-25 16:16:45 -070065 fn c_take_ref_rust_vec(v: &Vec<u8>);
myronahnda9be502020-04-29 05:47:23 +070066 fn c_take_ref_rust_vec_copy(v: &Vec<u8>);
David Tolnay75dca2e2020-03-25 20:17:52 -070067 fn c_take_callback(callback: fn(String) -> usize);
Joel Galensonc03402a2020-04-23 17:31:09 -070068 fn c_take_enum(e: Enum);
David Tolnayebef4a22020-03-17 15:33:47 -070069
70 fn c_try_return_void() -> Result<()>;
71 fn c_try_return_primitive() -> Result<usize>;
72 fn c_fail_return_primitive() -> Result<usize>;
David Tolnay99642622020-03-25 13:07:35 -070073 fn c_try_return_box() -> Result<Box<R>>;
74 fn c_try_return_ref(s: &String) -> Result<&String>;
75 fn c_try_return_str(s: &str) -> Result<&str>;
Adrian Taylorf5dd5522020-04-13 16:50:14 -070076 fn c_try_return_sliceu8(s: &[u8]) -> Result<&[u8]>;
David Tolnay99642622020-03-25 13:07:35 -070077 fn c_try_return_rust_string() -> Result<String>;
78 fn c_try_return_unique_ptr_string() -> Result<UniquePtr<CxxString>>;
David Tolnay8b9d1762020-04-25 16:05:46 -070079 fn c_try_return_rust_vec() -> Result<Vec<u8>>;
David Tolnay77989692020-04-25 15:57:47 -070080 fn c_try_return_ref_rust_vec(c: &C) -> Result<&Vec<u8>>;
Joel Galenson3d4f6122020-04-07 15:54:05 -070081
82 fn get(self: &C) -> usize;
83 fn set(self: &mut C, n: usize) -> usize;
Joel Galensone1e969d2020-04-21 12:50:20 -070084 fn get2(&self) -> usize;
85 fn set2(&mut self, n: usize) -> usize;
David Tolnay97c72102020-01-25 16:49:00 -080086 }
David Tolnayad5b8af2020-01-26 16:59:13 -080087
Joel Galenson0f654ff2020-05-04 20:04:21 -070088 extern "C" {
89 type COwnedEnum;
90 }
91
David Tolnayf6a89f22020-05-10 23:39:27 -070092 #[repr(u32)]
Joel Galenson0f654ff2020-05-04 20:04:21 -070093 enum COwnedEnum {
94 CVal1,
95 CVal2,
96 }
97
David Tolnayad5b8af2020-01-26 16:59:13 -080098 extern "Rust" {
99 type R;
Joel Galensonc1c4e7a2020-04-15 10:21:00 -0700100 type R2;
David Tolnayad5b8af2020-01-26 16:59:13 -0800101
102 fn r_return_primitive() -> usize;
103 fn r_return_shared() -> Shared;
David Tolnay5cd8d612020-03-06 15:56:30 -0800104 fn r_return_box() -> Box<R>;
David Tolnay4b3a66e2020-03-06 16:14:00 -0800105 fn r_return_unique_ptr() -> UniquePtr<C>;
David Tolnayad5b8af2020-01-26 16:59:13 -0800106 fn r_return_ref(shared: &Shared) -> &usize;
107 fn r_return_str(shared: &Shared) -> &str;
108 fn r_return_rust_string() -> String;
David Tolnay85db24862020-03-06 16:24:41 -0800109 fn r_return_unique_ptr_string() -> UniquePtr<CxxString>;
David Tolnay83c69e92020-04-25 16:59:39 -0700110 fn r_return_rust_vec() -> Vec<u8>;
111 fn r_return_ref_rust_vec(shared: &Shared) -> &Vec<u8>;
Joel Galensonba676072020-04-27 15:55:45 -0700112 fn r_return_identity(_: usize) -> usize;
113 fn r_return_sum(_: usize, _: usize) -> usize;
Joel Galensonc03402a2020-04-23 17:31:09 -0700114 fn r_return_enum(n: u32) -> Enum;
David Tolnayad5b8af2020-01-26 16:59:13 -0800115
116 fn r_take_primitive(n: usize);
117 fn r_take_shared(shared: Shared);
118 fn r_take_box(r: Box<R>);
119 fn r_take_unique_ptr(c: UniquePtr<C>);
120 fn r_take_ref_r(r: &R);
121 fn r_take_ref_c(c: &C);
122 fn r_take_str(s: &str);
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700123 fn r_take_sliceu8(s: &[u8]);
David Tolnayad5b8af2020-01-26 16:59:13 -0800124 fn r_take_rust_string(s: String);
125 fn r_take_unique_ptr_string(s: UniquePtr<CxxString>);
David Tolnay83c69e92020-04-25 16:59:39 -0700126 fn r_take_rust_vec(v: Vec<u8>);
127 fn r_take_ref_rust_vec(v: &Vec<u8>);
Joel Galensonc03402a2020-04-23 17:31:09 -0700128 fn r_take_enum(e: Enum);
David Tolnayb6c5ea72020-03-16 13:36:28 -0700129
David Tolnaycecada62020-03-17 01:45:58 -0700130 fn r_try_return_void() -> Result<()>;
David Tolnayb6c5ea72020-03-16 13:36:28 -0700131 fn r_try_return_primitive() -> Result<usize>;
132 fn r_fail_return_primitive() -> Result<usize>;
Joel Galensonc1c4e7a2020-04-15 10:21:00 -0700133
134 fn r_return_r2(n: usize) -> Box<R2>;
135 fn get(self: &R2) -> usize;
136 fn set(self: &mut R2, n: usize) -> usize;
David Tolnayad5b8af2020-01-26 16:59:13 -0800137 }
138}
139
David Tolnaybe13d8a2020-03-06 15:45:39 -0800140pub type R = usize;
David Tolnayad5b8af2020-01-26 16:59:13 -0800141
Joel Galensonc1c4e7a2020-04-15 10:21:00 -0700142pub struct R2(usize);
143
144impl R2 {
145 fn get(&self) -> usize {
146 self.0
147 }
148
149 fn set(&mut self, n: usize) -> usize {
150 self.0 = n;
151 n
152 }
153}
154
David Tolnayb6c5ea72020-03-16 13:36:28 -0700155#[derive(Debug)]
156struct Error;
157
158impl std::error::Error for Error {}
159
160impl Display for Error {
161 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
162 f.write_str("rust error")
163 }
164}
165
David Tolnayad5b8af2020-01-26 16:59:13 -0800166fn r_return_primitive() -> usize {
167 2020
168}
169
170fn r_return_shared() -> ffi::Shared {
171 ffi::Shared { z: 2020 }
172}
173
David Tolnay5cd8d612020-03-06 15:56:30 -0800174fn r_return_box() -> Box<R> {
175 Box::new(2020)
176}
177
David Tolnay4b3a66e2020-03-06 16:14:00 -0800178fn r_return_unique_ptr() -> UniquePtr<ffi::C> {
179 extern "C" {
180 fn cxx_test_suite_get_unique_ptr() -> *mut ffi::C;
181 }
182 unsafe { UniquePtr::from_raw(cxx_test_suite_get_unique_ptr()) }
183}
184
David Tolnayad5b8af2020-01-26 16:59:13 -0800185fn r_return_ref(shared: &ffi::Shared) -> &usize {
186 &shared.z
187}
188
189fn r_return_str(shared: &ffi::Shared) -> &str {
190 let _ = shared;
191 "2020"
192}
193
194fn r_return_rust_string() -> String {
195 "2020".to_owned()
196}
197
David Tolnay85db24862020-03-06 16:24:41 -0800198fn r_return_unique_ptr_string() -> UniquePtr<CxxString> {
199 extern "C" {
200 fn cxx_test_suite_get_unique_ptr_string() -> *mut CxxString;
201 }
202 unsafe { UniquePtr::from_raw(cxx_test_suite_get_unique_ptr_string()) }
203}
204
David Tolnay83c69e92020-04-25 16:59:39 -0700205fn r_return_rust_vec() -> Vec<u8> {
206 Vec::new()
207}
208
209fn r_return_ref_rust_vec(shared: &ffi::Shared) -> &Vec<u8> {
210 let _ = shared;
211 unimplemented!()
212}
213
Joel Galensonba676072020-04-27 15:55:45 -0700214fn r_return_identity(n: usize) -> usize {
215 n
216}
217
218fn r_return_sum(n1: usize, n2: usize) -> usize {
219 n1 + n2
220}
221
Joel Galensonc03402a2020-04-23 17:31:09 -0700222fn r_return_enum(n: u32) -> ffi::Enum {
David Tolnay884d91f2020-05-05 10:17:23 -0700223 if n == 0 {
Joel Galensonc03402a2020-04-23 17:31:09 -0700224 ffi::Enum::AVal
225 } else if n <= 2020 {
226 ffi::Enum::BVal
227 } else {
228 ffi::Enum::CVal
229 }
230}
231
David Tolnayad5b8af2020-01-26 16:59:13 -0800232fn r_take_primitive(n: usize) {
David Tolnayf306da42020-02-22 19:55:43 -0800233 assert_eq!(n, 2020);
David Tolnayad5b8af2020-01-26 16:59:13 -0800234}
235
236fn r_take_shared(shared: ffi::Shared) {
David Tolnayf306da42020-02-22 19:55:43 -0800237 assert_eq!(shared.z, 2020);
David Tolnayad5b8af2020-01-26 16:59:13 -0800238}
239
240fn r_take_box(r: Box<R>) {
241 let _ = r;
242}
243
244fn r_take_unique_ptr(c: UniquePtr<ffi::C>) {
245 let _ = c;
246}
247
248fn r_take_ref_r(r: &R) {
249 let _ = r;
250}
251
252fn r_take_ref_c(c: &ffi::C) {
253 let _ = c;
254}
255
256fn r_take_str(s: &str) {
David Tolnayf306da42020-02-22 19:55:43 -0800257 assert_eq!(s, "2020");
David Tolnayad5b8af2020-01-26 16:59:13 -0800258}
259
260fn r_take_rust_string(s: String) {
David Tolnayf306da42020-02-22 19:55:43 -0800261 assert_eq!(s, "2020");
David Tolnayad5b8af2020-01-26 16:59:13 -0800262}
263
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700264fn r_take_sliceu8(s: &[u8]) {
265 assert_eq!(s.len(), 5);
David Tolnayefe81052020-04-14 16:28:24 -0700266 assert_eq!(std::str::from_utf8(s).unwrap(), "2020\0");
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700267}
268
David Tolnayad5b8af2020-01-26 16:59:13 -0800269fn r_take_unique_ptr_string(s: UniquePtr<CxxString>) {
David Tolnayf306da42020-02-22 19:55:43 -0800270 assert_eq!(s.as_ref().unwrap().to_str().unwrap(), "2020");
David Tolnay97c72102020-01-25 16:49:00 -0800271}
David Tolnayb6c5ea72020-03-16 13:36:28 -0700272
David Tolnay83c69e92020-04-25 16:59:39 -0700273fn r_take_rust_vec(v: Vec<u8>) {
274 let _ = v;
275}
276
277fn r_take_ref_rust_vec(v: &Vec<u8>) {
278 let _ = v;
279}
280
Joel Galensonc03402a2020-04-23 17:31:09 -0700281fn r_take_enum(e: ffi::Enum) {
282 let _ = e;
283}
284
David Tolnaycecada62020-03-17 01:45:58 -0700285fn r_try_return_void() -> Result<(), Error> {
286 Ok(())
287}
288
David Tolnayb6c5ea72020-03-16 13:36:28 -0700289fn r_try_return_primitive() -> Result<usize, Error> {
290 Ok(2020)
291}
292
293fn r_fail_return_primitive() -> Result<usize, Error> {
294 Err(Error)
295}
Joel Galensonc1c4e7a2020-04-15 10:21:00 -0700296
297fn r_return_r2(n: usize) -> Box<R2> {
298 Box::new(R2(n))
299}