blob: 492fc91e561eb9ab2db026383ecd5b035a1edb86 [file] [log] [blame]
David Tolnay265f6a02020-03-18 20:13:55 -07001#![allow(clippy::boxed_local, clippy::trivially_copy_pass_by_ref)]
2
David Tolnayad5b8af2020-01-26 16:59:13 -08003use cxx::{CxxString, UniquePtr};
David Tolnayb6c5ea72020-03-16 13:36:28 -07004use std::fmt::{self, Display};
David Tolnayad5b8af2020-01-26 16:59:13 -08005
David Tolnay97c72102020-01-25 16:49:00 -08006#[cxx::bridge(namespace = tests)]
7pub mod ffi {
David Tolnayad5b8af2020-01-26 16:59:13 -08008 struct Shared {
9 z: usize,
10 }
11
David Tolnay97c72102020-01-25 16:49:00 -080012 extern "C" {
13 include!("tests/ffi/tests.h");
David Tolnayad5b8af2020-01-26 16:59:13 -080014
15 type C;
16
17 fn c_return_primitive() -> usize;
18 fn c_return_shared() -> Shared;
David Tolnaybe13d8a2020-03-06 15:45:39 -080019 fn c_return_box() -> Box<R>;
David Tolnayad5b8af2020-01-26 16:59:13 -080020 fn c_return_unique_ptr() -> UniquePtr<C>;
21 fn c_return_ref(shared: &Shared) -> &usize;
22 fn c_return_str(shared: &Shared) -> &str;
23 fn c_return_rust_string() -> String;
24 fn c_return_unique_ptr_string() -> UniquePtr<CxxString>;
25
26 fn c_take_primitive(n: usize);
27 fn c_take_shared(shared: Shared);
28 fn c_take_box(r: Box<R>);
29 fn c_take_unique_ptr(c: UniquePtr<C>);
David Tolnaya7d00e82020-03-06 15:50:14 -080030 fn c_take_ref_r(r: &R);
David Tolnayad5b8af2020-01-26 16:59:13 -080031 fn c_take_ref_c(c: &C);
32 fn c_take_str(s: &str);
33 fn c_take_rust_string(s: String);
34 fn c_take_unique_ptr_string(s: UniquePtr<CxxString>);
David Tolnayebef4a22020-03-17 15:33:47 -070035
36 fn c_try_return_void() -> Result<()>;
37 fn c_try_return_primitive() -> Result<usize>;
38 fn c_fail_return_primitive() -> Result<usize>;
David Tolnay99642622020-03-25 13:07:35 -070039 fn c_try_return_box() -> Result<Box<R>>;
40 fn c_try_return_ref(s: &String) -> Result<&String>;
41 fn c_try_return_str(s: &str) -> Result<&str>;
42 fn c_try_return_rust_string() -> Result<String>;
43 fn c_try_return_unique_ptr_string() -> Result<UniquePtr<CxxString>>;
David Tolnay97c72102020-01-25 16:49:00 -080044 }
David Tolnayad5b8af2020-01-26 16:59:13 -080045
46 extern "Rust" {
47 type R;
48
49 fn r_return_primitive() -> usize;
50 fn r_return_shared() -> Shared;
David Tolnay5cd8d612020-03-06 15:56:30 -080051 fn r_return_box() -> Box<R>;
David Tolnay4b3a66e2020-03-06 16:14:00 -080052 fn r_return_unique_ptr() -> UniquePtr<C>;
David Tolnayad5b8af2020-01-26 16:59:13 -080053 fn r_return_ref(shared: &Shared) -> &usize;
54 fn r_return_str(shared: &Shared) -> &str;
55 fn r_return_rust_string() -> String;
David Tolnay85db24862020-03-06 16:24:41 -080056 fn r_return_unique_ptr_string() -> UniquePtr<CxxString>;
David Tolnayad5b8af2020-01-26 16:59:13 -080057
58 fn r_take_primitive(n: usize);
59 fn r_take_shared(shared: Shared);
60 fn r_take_box(r: Box<R>);
61 fn r_take_unique_ptr(c: UniquePtr<C>);
62 fn r_take_ref_r(r: &R);
63 fn r_take_ref_c(c: &C);
64 fn r_take_str(s: &str);
65 fn r_take_rust_string(s: String);
66 fn r_take_unique_ptr_string(s: UniquePtr<CxxString>);
David Tolnayb6c5ea72020-03-16 13:36:28 -070067
David Tolnaycecada62020-03-17 01:45:58 -070068 fn r_try_return_void() -> Result<()>;
David Tolnayb6c5ea72020-03-16 13:36:28 -070069 fn r_try_return_primitive() -> Result<usize>;
70 fn r_fail_return_primitive() -> Result<usize>;
David Tolnayad5b8af2020-01-26 16:59:13 -080071 }
72}
73
David Tolnaybe13d8a2020-03-06 15:45:39 -080074pub type R = usize;
David Tolnayad5b8af2020-01-26 16:59:13 -080075
David Tolnayb6c5ea72020-03-16 13:36:28 -070076#[derive(Debug)]
77struct Error;
78
79impl std::error::Error for Error {}
80
81impl Display for Error {
82 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
83 f.write_str("rust error")
84 }
85}
86
David Tolnayad5b8af2020-01-26 16:59:13 -080087fn r_return_primitive() -> usize {
88 2020
89}
90
91fn r_return_shared() -> ffi::Shared {
92 ffi::Shared { z: 2020 }
93}
94
David Tolnay5cd8d612020-03-06 15:56:30 -080095fn r_return_box() -> Box<R> {
96 Box::new(2020)
97}
98
David Tolnay4b3a66e2020-03-06 16:14:00 -080099fn r_return_unique_ptr() -> UniquePtr<ffi::C> {
100 extern "C" {
101 fn cxx_test_suite_get_unique_ptr() -> *mut ffi::C;
102 }
103 unsafe { UniquePtr::from_raw(cxx_test_suite_get_unique_ptr()) }
104}
105
David Tolnayad5b8af2020-01-26 16:59:13 -0800106fn r_return_ref(shared: &ffi::Shared) -> &usize {
107 &shared.z
108}
109
110fn r_return_str(shared: &ffi::Shared) -> &str {
111 let _ = shared;
112 "2020"
113}
114
115fn r_return_rust_string() -> String {
116 "2020".to_owned()
117}
118
David Tolnay85db24862020-03-06 16:24:41 -0800119fn r_return_unique_ptr_string() -> UniquePtr<CxxString> {
120 extern "C" {
121 fn cxx_test_suite_get_unique_ptr_string() -> *mut CxxString;
122 }
123 unsafe { UniquePtr::from_raw(cxx_test_suite_get_unique_ptr_string()) }
124}
125
David Tolnayad5b8af2020-01-26 16:59:13 -0800126fn r_take_primitive(n: usize) {
David Tolnayf306da42020-02-22 19:55:43 -0800127 assert_eq!(n, 2020);
David Tolnayad5b8af2020-01-26 16:59:13 -0800128}
129
130fn r_take_shared(shared: ffi::Shared) {
David Tolnayf306da42020-02-22 19:55:43 -0800131 assert_eq!(shared.z, 2020);
David Tolnayad5b8af2020-01-26 16:59:13 -0800132}
133
134fn r_take_box(r: Box<R>) {
135 let _ = r;
136}
137
138fn r_take_unique_ptr(c: UniquePtr<ffi::C>) {
139 let _ = c;
140}
141
142fn r_take_ref_r(r: &R) {
143 let _ = r;
144}
145
146fn r_take_ref_c(c: &ffi::C) {
147 let _ = c;
148}
149
150fn r_take_str(s: &str) {
David Tolnayf306da42020-02-22 19:55:43 -0800151 assert_eq!(s, "2020");
David Tolnayad5b8af2020-01-26 16:59:13 -0800152}
153
154fn r_take_rust_string(s: String) {
David Tolnayf306da42020-02-22 19:55:43 -0800155 assert_eq!(s, "2020");
David Tolnayad5b8af2020-01-26 16:59:13 -0800156}
157
158fn r_take_unique_ptr_string(s: UniquePtr<CxxString>) {
David Tolnayf306da42020-02-22 19:55:43 -0800159 assert_eq!(s.as_ref().unwrap().to_str().unwrap(), "2020");
David Tolnay97c72102020-01-25 16:49:00 -0800160}
David Tolnayb6c5ea72020-03-16 13:36:28 -0700161
David Tolnaycecada62020-03-17 01:45:58 -0700162fn r_try_return_void() -> Result<(), Error> {
163 Ok(())
164}
165
David Tolnayb6c5ea72020-03-16 13:36:28 -0700166fn r_try_return_primitive() -> Result<usize, Error> {
167 Ok(2020)
168}
169
170fn r_fail_return_primitive() -> Result<usize, Error> {
171 Err(Error)
172}