blob: 27f5f6d6dff1282e2b91027bfcd0fc9c68f94f66 [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>;
Myron Ahneba35cf2020-02-05 19:41:51 +070030 fn c_return_unique_ptr_vector_u8() -> UniquePtr<Vector<u8>>;
31 fn c_return_unique_ptr_vector_f64() -> UniquePtr<Vector<f64>>;
32 fn c_return_unique_ptr_vector_shared() -> UniquePtr<Vector<Shared>>;
David Tolnayad5b8af2020-01-26 16:59:13 -080033
34 fn c_take_primitive(n: usize);
35 fn c_take_shared(shared: Shared);
36 fn c_take_box(r: Box<R>);
37 fn c_take_unique_ptr(c: UniquePtr<C>);
David Tolnaya7d00e82020-03-06 15:50:14 -080038 fn c_take_ref_r(r: &R);
David Tolnayad5b8af2020-01-26 16:59:13 -080039 fn c_take_ref_c(c: &C);
40 fn c_take_str(s: &str);
Adrian Taylorf5dd5522020-04-13 16:50:14 -070041 fn c_take_sliceu8(s: &[u8]);
David Tolnayad5b8af2020-01-26 16:59:13 -080042 fn c_take_rust_string(s: String);
43 fn c_take_unique_ptr_string(s: UniquePtr<CxxString>);
Myron Ahneba35cf2020-02-05 19:41:51 +070044 fn c_take_unique_ptr_vector_u8(s: UniquePtr<Vector<u8>>);
45 fn c_take_unique_ptr_vector_f64(s: UniquePtr<Vector<f64>>);
46 fn c_take_unique_ptr_vector_shared(s: UniquePtr<Vector<Shared>>);
47
48 fn c_take_vec_u8(v: &Vec<u8>);
49 fn c_take_vec_shared(v: &Vec<Shared>);
David Tolnay75dca2e2020-03-25 20:17:52 -070050 fn c_take_callback(callback: fn(String) -> usize);
David Tolnayebef4a22020-03-17 15:33:47 -070051
52 fn c_try_return_void() -> Result<()>;
53 fn c_try_return_primitive() -> Result<usize>;
54 fn c_fail_return_primitive() -> Result<usize>;
Myron Ahneba35cf2020-02-05 19:41:51 +070055 fn c_try_return_string() -> Result<UniquePtr<CxxString>>;
56 fn c_fail_return_string() -> Result<UniquePtr<CxxString>>;
David Tolnay99642622020-03-25 13:07:35 -070057 fn c_try_return_box() -> Result<Box<R>>;
58 fn c_try_return_ref(s: &String) -> Result<&String>;
59 fn c_try_return_str(s: &str) -> Result<&str>;
Adrian Taylorf5dd5522020-04-13 16:50:14 -070060 fn c_try_return_sliceu8(s: &[u8]) -> Result<&[u8]>;
David Tolnay99642622020-03-25 13:07:35 -070061 fn c_try_return_rust_string() -> Result<String>;
62 fn c_try_return_unique_ptr_string() -> Result<UniquePtr<CxxString>>;
Joel Galenson3d4f6122020-04-07 15:54:05 -070063
64 fn get(self: &C) -> usize;
65 fn set(self: &mut C, n: usize) -> usize;
Joel Galensone1e969d2020-04-21 12:50:20 -070066 fn get2(&self) -> usize;
67 fn set2(&mut self, n: usize) -> usize;
David Tolnay97c72102020-01-25 16:49:00 -080068 }
David Tolnayad5b8af2020-01-26 16:59:13 -080069
70 extern "Rust" {
71 type R;
Joel Galensonc1c4e7a2020-04-15 10:21:00 -070072 type R2;
David Tolnayad5b8af2020-01-26 16:59:13 -080073
74 fn r_return_primitive() -> usize;
75 fn r_return_shared() -> Shared;
David Tolnay5cd8d612020-03-06 15:56:30 -080076 fn r_return_box() -> Box<R>;
David Tolnay4b3a66e2020-03-06 16:14:00 -080077 fn r_return_unique_ptr() -> UniquePtr<C>;
David Tolnayad5b8af2020-01-26 16:59:13 -080078 fn r_return_ref(shared: &Shared) -> &usize;
79 fn r_return_str(shared: &Shared) -> &str;
80 fn r_return_rust_string() -> String;
David Tolnay85db24862020-03-06 16:24:41 -080081 fn r_return_unique_ptr_string() -> UniquePtr<CxxString>;
David Tolnayad5b8af2020-01-26 16:59:13 -080082
83 fn r_take_primitive(n: usize);
84 fn r_take_shared(shared: Shared);
85 fn r_take_box(r: Box<R>);
86 fn r_take_unique_ptr(c: UniquePtr<C>);
87 fn r_take_ref_r(r: &R);
88 fn r_take_ref_c(c: &C);
89 fn r_take_str(s: &str);
Adrian Taylorf5dd5522020-04-13 16:50:14 -070090 fn r_take_sliceu8(s: &[u8]);
David Tolnayad5b8af2020-01-26 16:59:13 -080091 fn r_take_rust_string(s: String);
92 fn r_take_unique_ptr_string(s: UniquePtr<CxxString>);
David Tolnayb6c5ea72020-03-16 13:36:28 -070093
David Tolnaycecada62020-03-17 01:45:58 -070094 fn r_try_return_void() -> Result<()>;
David Tolnayb6c5ea72020-03-16 13:36:28 -070095 fn r_try_return_primitive() -> Result<usize>;
96 fn r_fail_return_primitive() -> Result<usize>;
Joel Galensonc1c4e7a2020-04-15 10:21:00 -070097
98 fn r_return_r2(n: usize) -> Box<R2>;
99 fn get(self: &R2) -> usize;
100 fn set(self: &mut R2, n: usize) -> usize;
David Tolnayad5b8af2020-01-26 16:59:13 -0800101 }
102}
103
David Tolnaybe13d8a2020-03-06 15:45:39 -0800104pub type R = usize;
David Tolnayad5b8af2020-01-26 16:59:13 -0800105
Joel Galensonc1c4e7a2020-04-15 10:21:00 -0700106pub struct R2(usize);
107
108impl R2 {
109 fn get(&self) -> usize {
110 self.0
111 }
112
113 fn set(&mut self, n: usize) -> usize {
114 self.0 = n;
115 n
116 }
117}
118
David Tolnayb6c5ea72020-03-16 13:36:28 -0700119#[derive(Debug)]
120struct Error;
121
122impl std::error::Error for Error {}
123
124impl Display for Error {
125 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
126 f.write_str("rust error")
127 }
128}
129
David Tolnayad5b8af2020-01-26 16:59:13 -0800130fn r_return_primitive() -> usize {
131 2020
132}
133
134fn r_return_shared() -> ffi::Shared {
135 ffi::Shared { z: 2020 }
136}
137
David Tolnay5cd8d612020-03-06 15:56:30 -0800138fn r_return_box() -> Box<R> {
139 Box::new(2020)
140}
141
David Tolnay4b3a66e2020-03-06 16:14:00 -0800142fn r_return_unique_ptr() -> UniquePtr<ffi::C> {
143 extern "C" {
144 fn cxx_test_suite_get_unique_ptr() -> *mut ffi::C;
145 }
146 unsafe { UniquePtr::from_raw(cxx_test_suite_get_unique_ptr()) }
147}
148
David Tolnayad5b8af2020-01-26 16:59:13 -0800149fn r_return_ref(shared: &ffi::Shared) -> &usize {
150 &shared.z
151}
152
153fn r_return_str(shared: &ffi::Shared) -> &str {
154 let _ = shared;
155 "2020"
156}
157
158fn r_return_rust_string() -> String {
159 "2020".to_owned()
160}
161
David Tolnay85db24862020-03-06 16:24:41 -0800162fn r_return_unique_ptr_string() -> UniquePtr<CxxString> {
163 extern "C" {
164 fn cxx_test_suite_get_unique_ptr_string() -> *mut CxxString;
165 }
166 unsafe { UniquePtr::from_raw(cxx_test_suite_get_unique_ptr_string()) }
167}
168
David Tolnayad5b8af2020-01-26 16:59:13 -0800169fn r_take_primitive(n: usize) {
David Tolnayf306da42020-02-22 19:55:43 -0800170 assert_eq!(n, 2020);
David Tolnayad5b8af2020-01-26 16:59:13 -0800171}
172
173fn r_take_shared(shared: ffi::Shared) {
David Tolnayf306da42020-02-22 19:55:43 -0800174 assert_eq!(shared.z, 2020);
David Tolnayad5b8af2020-01-26 16:59:13 -0800175}
176
177fn r_take_box(r: Box<R>) {
178 let _ = r;
179}
180
181fn r_take_unique_ptr(c: UniquePtr<ffi::C>) {
182 let _ = c;
183}
184
185fn r_take_ref_r(r: &R) {
186 let _ = r;
187}
188
189fn r_take_ref_c(c: &ffi::C) {
190 let _ = c;
191}
192
193fn r_take_str(s: &str) {
David Tolnayf306da42020-02-22 19:55:43 -0800194 assert_eq!(s, "2020");
David Tolnayad5b8af2020-01-26 16:59:13 -0800195}
196
197fn r_take_rust_string(s: String) {
David Tolnayf306da42020-02-22 19:55:43 -0800198 assert_eq!(s, "2020");
David Tolnayad5b8af2020-01-26 16:59:13 -0800199}
200
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700201fn r_take_sliceu8(s: &[u8]) {
202 assert_eq!(s.len(), 5);
David Tolnayefe81052020-04-14 16:28:24 -0700203 assert_eq!(std::str::from_utf8(s).unwrap(), "2020\0");
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700204}
205
David Tolnayad5b8af2020-01-26 16:59:13 -0800206fn r_take_unique_ptr_string(s: UniquePtr<CxxString>) {
David Tolnayf306da42020-02-22 19:55:43 -0800207 assert_eq!(s.as_ref().unwrap().to_str().unwrap(), "2020");
David Tolnay97c72102020-01-25 16:49:00 -0800208}
David Tolnayb6c5ea72020-03-16 13:36:28 -0700209
David Tolnaycecada62020-03-17 01:45:58 -0700210fn r_try_return_void() -> Result<(), Error> {
211 Ok(())
212}
213
David Tolnayb6c5ea72020-03-16 13:36:28 -0700214fn r_try_return_primitive() -> Result<usize, Error> {
215 Ok(2020)
216}
217
218fn r_fail_return_primitive() -> Result<usize, Error> {
219 Err(Error)
220}
Joel Galensonc1c4e7a2020-04-15 10:21:00 -0700221
222fn r_return_r2(n: usize) -> Box<R2> {
223 Box::new(R2(n))
224}