blob: 01dc404e45781f870816c97db709a0aade03f11e [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 Tolnayad5b8af2020-01-26 16:59:13 -08007use cxx::{CxxString, UniquePtr};
David Tolnayb6c5ea72020-03-16 13:36:28 -07008use std::fmt::{self, Display};
David Tolnayad5b8af2020-01-26 16:59:13 -08009
David Tolnay97c72102020-01-25 16:49:00 -080010#[cxx::bridge(namespace = tests)]
11pub mod ffi {
David Tolnayad5b8af2020-01-26 16:59:13 -080012 struct Shared {
13 z: usize,
14 }
15
David Tolnay97c72102020-01-25 16:49:00 -080016 extern "C" {
17 include!("tests/ffi/tests.h");
David Tolnayad5b8af2020-01-26 16:59:13 -080018
19 type C;
20
21 fn c_return_primitive() -> usize;
22 fn c_return_shared() -> Shared;
David Tolnaybe13d8a2020-03-06 15:45:39 -080023 fn c_return_box() -> Box<R>;
David Tolnayad5b8af2020-01-26 16:59:13 -080024 fn c_return_unique_ptr() -> UniquePtr<C>;
25 fn c_return_ref(shared: &Shared) -> &usize;
26 fn c_return_str(shared: &Shared) -> &str;
Adrian Taylorf5dd5522020-04-13 16:50:14 -070027 fn c_return_sliceu8(shared: &Shared) -> &[u8];
David Tolnayad5b8af2020-01-26 16:59:13 -080028 fn c_return_rust_string() -> String;
29 fn c_return_unique_ptr_string() -> UniquePtr<CxxString>;
David Tolnaye1dcdf72020-04-24 17:40:55 -070030 fn c_return_unique_ptr_vector_u8() -> UniquePtr<CxxVector<u8>>;
31 fn c_return_unique_ptr_vector_f64() -> UniquePtr<CxxVector<f64>>;
32 fn c_return_unique_ptr_vector_shared() -> UniquePtr<CxxVector<Shared>>;
David Tolnay1bcc9fe2020-04-25 13:51:07 -070033 fn c_return_unique_ptr_vector_opaque() -> UniquePtr<CxxVector<C>>;
David Tolnayde5340e2020-04-25 14:03:21 -070034 fn c_return_ref_vector(c: &C) -> &CxxVector<u8>;
David Tolnayb41e74c2020-04-25 15:06:18 -070035 fn c_return_rust_vec() -> Vec<u8>;
David Tolnay77989692020-04-25 15:57:47 -070036 fn c_return_ref_rust_vec(c: &C) -> &Vec<u8>;
Joel Galensonba676072020-04-27 15:55:45 -070037 fn c_return_identity(_: usize) -> usize;
38 fn c_return_sum(_: usize, _: usize) -> usize;
David Tolnayad5b8af2020-01-26 16:59:13 -080039
40 fn c_take_primitive(n: usize);
41 fn c_take_shared(shared: Shared);
42 fn c_take_box(r: Box<R>);
43 fn c_take_unique_ptr(c: UniquePtr<C>);
David Tolnaya7d00e82020-03-06 15:50:14 -080044 fn c_take_ref_r(r: &R);
David Tolnayad5b8af2020-01-26 16:59:13 -080045 fn c_take_ref_c(c: &C);
46 fn c_take_str(s: &str);
Adrian Taylorf5dd5522020-04-13 16:50:14 -070047 fn c_take_sliceu8(s: &[u8]);
David Tolnayad5b8af2020-01-26 16:59:13 -080048 fn c_take_rust_string(s: String);
49 fn c_take_unique_ptr_string(s: UniquePtr<CxxString>);
David Tolnay9b304202020-04-25 13:54:55 -070050 fn c_take_unique_ptr_vector_u8(v: UniquePtr<CxxVector<u8>>);
51 fn c_take_unique_ptr_vector_f64(v: UniquePtr<CxxVector<f64>>);
52 fn c_take_unique_ptr_vector_shared(v: UniquePtr<CxxVector<Shared>>);
David Tolnay2244d1f2020-04-25 13:58:18 -070053 fn c_take_ref_vector(v: &CxxVector<u8>);
David Tolnayd2ce8a92020-04-25 16:16:45 -070054 fn c_take_rust_vec(v: Vec<u8>);
55 fn c_take_rust_vec_shared(v: Vec<Shared>);
myronahnda9be502020-04-29 05:47:23 +070056 fn c_take_rust_vec_shared_forward_iterator(v: Vec<Shared>);
David Tolnayd2ce8a92020-04-25 16:16:45 -070057 fn c_take_ref_rust_vec(v: &Vec<u8>);
myronahnda9be502020-04-29 05:47:23 +070058 fn c_take_ref_rust_vec_copy(v: &Vec<u8>);
David Tolnay75dca2e2020-03-25 20:17:52 -070059 fn c_take_callback(callback: fn(String) -> usize);
David Tolnayebef4a22020-03-17 15:33:47 -070060
61 fn c_try_return_void() -> Result<()>;
62 fn c_try_return_primitive() -> Result<usize>;
63 fn c_fail_return_primitive() -> Result<usize>;
David Tolnay99642622020-03-25 13:07:35 -070064 fn c_try_return_box() -> Result<Box<R>>;
65 fn c_try_return_ref(s: &String) -> Result<&String>;
66 fn c_try_return_str(s: &str) -> Result<&str>;
Adrian Taylorf5dd5522020-04-13 16:50:14 -070067 fn c_try_return_sliceu8(s: &[u8]) -> Result<&[u8]>;
David Tolnay99642622020-03-25 13:07:35 -070068 fn c_try_return_rust_string() -> Result<String>;
69 fn c_try_return_unique_ptr_string() -> Result<UniquePtr<CxxString>>;
David Tolnay8b9d1762020-04-25 16:05:46 -070070 fn c_try_return_rust_vec() -> Result<Vec<u8>>;
David Tolnay77989692020-04-25 15:57:47 -070071 fn c_try_return_ref_rust_vec(c: &C) -> Result<&Vec<u8>>;
Joel Galenson3d4f6122020-04-07 15:54:05 -070072
73 fn get(self: &C) -> usize;
74 fn set(self: &mut C, n: usize) -> usize;
Joel Galensone1e969d2020-04-21 12:50:20 -070075 fn get2(&self) -> usize;
76 fn set2(&mut self, n: usize) -> usize;
David Tolnay97c72102020-01-25 16:49:00 -080077 }
David Tolnayad5b8af2020-01-26 16:59:13 -080078
79 extern "Rust" {
80 type R;
Joel Galensonc1c4e7a2020-04-15 10:21:00 -070081 type R2;
David Tolnayad5b8af2020-01-26 16:59:13 -080082
83 fn r_return_primitive() -> usize;
84 fn r_return_shared() -> Shared;
David Tolnay5cd8d612020-03-06 15:56:30 -080085 fn r_return_box() -> Box<R>;
David Tolnay4b3a66e2020-03-06 16:14:00 -080086 fn r_return_unique_ptr() -> UniquePtr<C>;
David Tolnayad5b8af2020-01-26 16:59:13 -080087 fn r_return_ref(shared: &Shared) -> &usize;
88 fn r_return_str(shared: &Shared) -> &str;
89 fn r_return_rust_string() -> String;
David Tolnay85db24862020-03-06 16:24:41 -080090 fn r_return_unique_ptr_string() -> UniquePtr<CxxString>;
David Tolnay83c69e92020-04-25 16:59:39 -070091 fn r_return_rust_vec() -> Vec<u8>;
92 fn r_return_ref_rust_vec(shared: &Shared) -> &Vec<u8>;
Joel Galensonba676072020-04-27 15:55:45 -070093 fn r_return_identity(_: usize) -> usize;
94 fn r_return_sum(_: usize, _: usize) -> usize;
David Tolnayad5b8af2020-01-26 16:59:13 -080095
96 fn r_take_primitive(n: usize);
97 fn r_take_shared(shared: Shared);
98 fn r_take_box(r: Box<R>);
99 fn r_take_unique_ptr(c: UniquePtr<C>);
100 fn r_take_ref_r(r: &R);
101 fn r_take_ref_c(c: &C);
102 fn r_take_str(s: &str);
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700103 fn r_take_sliceu8(s: &[u8]);
David Tolnayad5b8af2020-01-26 16:59:13 -0800104 fn r_take_rust_string(s: String);
105 fn r_take_unique_ptr_string(s: UniquePtr<CxxString>);
David Tolnay83c69e92020-04-25 16:59:39 -0700106 fn r_take_rust_vec(v: Vec<u8>);
107 fn r_take_ref_rust_vec(v: &Vec<u8>);
David Tolnayb6c5ea72020-03-16 13:36:28 -0700108
David Tolnaycecada62020-03-17 01:45:58 -0700109 fn r_try_return_void() -> Result<()>;
David Tolnayb6c5ea72020-03-16 13:36:28 -0700110 fn r_try_return_primitive() -> Result<usize>;
111 fn r_fail_return_primitive() -> Result<usize>;
Joel Galensonc1c4e7a2020-04-15 10:21:00 -0700112
113 fn r_return_r2(n: usize) -> Box<R2>;
114 fn get(self: &R2) -> usize;
115 fn set(self: &mut R2, n: usize) -> usize;
David Tolnayad5b8af2020-01-26 16:59:13 -0800116 }
117}
118
David Tolnaybe13d8a2020-03-06 15:45:39 -0800119pub type R = usize;
David Tolnayad5b8af2020-01-26 16:59:13 -0800120
Joel Galensonc1c4e7a2020-04-15 10:21:00 -0700121pub struct R2(usize);
122
123impl R2 {
124 fn get(&self) -> usize {
125 self.0
126 }
127
128 fn set(&mut self, n: usize) -> usize {
129 self.0 = n;
130 n
131 }
132}
133
David Tolnayb6c5ea72020-03-16 13:36:28 -0700134#[derive(Debug)]
135struct Error;
136
137impl std::error::Error for Error {}
138
139impl Display for Error {
140 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
141 f.write_str("rust error")
142 }
143}
144
David Tolnayad5b8af2020-01-26 16:59:13 -0800145fn r_return_primitive() -> usize {
146 2020
147}
148
149fn r_return_shared() -> ffi::Shared {
150 ffi::Shared { z: 2020 }
151}
152
David Tolnay5cd8d612020-03-06 15:56:30 -0800153fn r_return_box() -> Box<R> {
154 Box::new(2020)
155}
156
David Tolnay4b3a66e2020-03-06 16:14:00 -0800157fn r_return_unique_ptr() -> UniquePtr<ffi::C> {
158 extern "C" {
159 fn cxx_test_suite_get_unique_ptr() -> *mut ffi::C;
160 }
161 unsafe { UniquePtr::from_raw(cxx_test_suite_get_unique_ptr()) }
162}
163
David Tolnayad5b8af2020-01-26 16:59:13 -0800164fn r_return_ref(shared: &ffi::Shared) -> &usize {
165 &shared.z
166}
167
168fn r_return_str(shared: &ffi::Shared) -> &str {
169 let _ = shared;
170 "2020"
171}
172
173fn r_return_rust_string() -> String {
174 "2020".to_owned()
175}
176
David Tolnay85db24862020-03-06 16:24:41 -0800177fn r_return_unique_ptr_string() -> UniquePtr<CxxString> {
178 extern "C" {
179 fn cxx_test_suite_get_unique_ptr_string() -> *mut CxxString;
180 }
181 unsafe { UniquePtr::from_raw(cxx_test_suite_get_unique_ptr_string()) }
182}
183
David Tolnay83c69e92020-04-25 16:59:39 -0700184fn r_return_rust_vec() -> Vec<u8> {
185 Vec::new()
186}
187
188fn r_return_ref_rust_vec(shared: &ffi::Shared) -> &Vec<u8> {
189 let _ = shared;
190 unimplemented!()
191}
192
Joel Galensonba676072020-04-27 15:55:45 -0700193fn r_return_identity(n: usize) -> usize {
194 n
195}
196
197fn r_return_sum(n1: usize, n2: usize) -> usize {
198 n1 + n2
199}
200
David Tolnayad5b8af2020-01-26 16:59:13 -0800201fn r_take_primitive(n: usize) {
David Tolnayf306da42020-02-22 19:55:43 -0800202 assert_eq!(n, 2020);
David Tolnayad5b8af2020-01-26 16:59:13 -0800203}
204
205fn r_take_shared(shared: ffi::Shared) {
David Tolnayf306da42020-02-22 19:55:43 -0800206 assert_eq!(shared.z, 2020);
David Tolnayad5b8af2020-01-26 16:59:13 -0800207}
208
209fn r_take_box(r: Box<R>) {
210 let _ = r;
211}
212
213fn r_take_unique_ptr(c: UniquePtr<ffi::C>) {
214 let _ = c;
215}
216
217fn r_take_ref_r(r: &R) {
218 let _ = r;
219}
220
221fn r_take_ref_c(c: &ffi::C) {
222 let _ = c;
223}
224
225fn r_take_str(s: &str) {
David Tolnayf306da42020-02-22 19:55:43 -0800226 assert_eq!(s, "2020");
David Tolnayad5b8af2020-01-26 16:59:13 -0800227}
228
229fn r_take_rust_string(s: String) {
David Tolnayf306da42020-02-22 19:55:43 -0800230 assert_eq!(s, "2020");
David Tolnayad5b8af2020-01-26 16:59:13 -0800231}
232
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700233fn r_take_sliceu8(s: &[u8]) {
234 assert_eq!(s.len(), 5);
David Tolnayefe81052020-04-14 16:28:24 -0700235 assert_eq!(std::str::from_utf8(s).unwrap(), "2020\0");
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700236}
237
David Tolnayad5b8af2020-01-26 16:59:13 -0800238fn r_take_unique_ptr_string(s: UniquePtr<CxxString>) {
David Tolnayf306da42020-02-22 19:55:43 -0800239 assert_eq!(s.as_ref().unwrap().to_str().unwrap(), "2020");
David Tolnay97c72102020-01-25 16:49:00 -0800240}
David Tolnayb6c5ea72020-03-16 13:36:28 -0700241
David Tolnay83c69e92020-04-25 16:59:39 -0700242fn r_take_rust_vec(v: Vec<u8>) {
243 let _ = v;
244}
245
246fn r_take_ref_rust_vec(v: &Vec<u8>) {
247 let _ = v;
248}
249
David Tolnaycecada62020-03-17 01:45:58 -0700250fn r_try_return_void() -> Result<(), Error> {
251 Ok(())
252}
253
David Tolnayb6c5ea72020-03-16 13:36:28 -0700254fn r_try_return_primitive() -> Result<usize, Error> {
255 Ok(2020)
256}
257
258fn r_fail_return_primitive() -> Result<usize, Error> {
259 Err(Error)
260}
Joel Galensonc1c4e7a2020-04-15 10:21:00 -0700261
262fn r_return_r2(n: usize) -> Box<R2> {
263 Box::new(R2(n))
264}