blob: fd546547b94b167dbc628d9faea3d618e2822611 [file] [log] [blame]
David Tolnayad5b8af2020-01-26 16:59:13 -08001use cxx::{CxxString, UniquePtr};
David Tolnayb6c5ea72020-03-16 13:36:28 -07002use std::fmt::{self, Display};
David Tolnayad5b8af2020-01-26 16:59:13 -08003
David Tolnay97c72102020-01-25 16:49:00 -08004#[cxx::bridge(namespace = tests)]
5pub mod ffi {
David Tolnayad5b8af2020-01-26 16:59:13 -08006 struct Shared {
7 z: usize,
8 }
9
David Tolnay97c72102020-01-25 16:49:00 -080010 extern "C" {
11 include!("tests/ffi/tests.h");
David Tolnayad5b8af2020-01-26 16:59:13 -080012
13 type C;
14
15 fn c_return_primitive() -> usize;
16 fn c_return_shared() -> Shared;
David Tolnaybe13d8a2020-03-06 15:45:39 -080017 fn c_return_box() -> Box<R>;
David Tolnayad5b8af2020-01-26 16:59:13 -080018 fn c_return_unique_ptr() -> UniquePtr<C>;
19 fn c_return_ref(shared: &Shared) -> &usize;
20 fn c_return_str(shared: &Shared) -> &str;
21 fn c_return_rust_string() -> String;
22 fn c_return_unique_ptr_string() -> UniquePtr<CxxString>;
23
24 fn c_take_primitive(n: usize);
25 fn c_take_shared(shared: Shared);
26 fn c_take_box(r: Box<R>);
27 fn c_take_unique_ptr(c: UniquePtr<C>);
David Tolnaya7d00e82020-03-06 15:50:14 -080028 fn c_take_ref_r(r: &R);
David Tolnayad5b8af2020-01-26 16:59:13 -080029 fn c_take_ref_c(c: &C);
30 fn c_take_str(s: &str);
31 fn c_take_rust_string(s: String);
32 fn c_take_unique_ptr_string(s: UniquePtr<CxxString>);
David Tolnay97c72102020-01-25 16:49:00 -080033 }
David Tolnayad5b8af2020-01-26 16:59:13 -080034
35 extern "Rust" {
36 type R;
37
38 fn r_return_primitive() -> usize;
39 fn r_return_shared() -> Shared;
David Tolnay5cd8d612020-03-06 15:56:30 -080040 fn r_return_box() -> Box<R>;
David Tolnay4b3a66e2020-03-06 16:14:00 -080041 fn r_return_unique_ptr() -> UniquePtr<C>;
David Tolnayad5b8af2020-01-26 16:59:13 -080042 fn r_return_ref(shared: &Shared) -> &usize;
43 fn r_return_str(shared: &Shared) -> &str;
44 fn r_return_rust_string() -> String;
David Tolnay85db24862020-03-06 16:24:41 -080045 fn r_return_unique_ptr_string() -> UniquePtr<CxxString>;
David Tolnayad5b8af2020-01-26 16:59:13 -080046
47 fn r_take_primitive(n: usize);
48 fn r_take_shared(shared: Shared);
49 fn r_take_box(r: Box<R>);
50 fn r_take_unique_ptr(c: UniquePtr<C>);
51 fn r_take_ref_r(r: &R);
52 fn r_take_ref_c(c: &C);
53 fn r_take_str(s: &str);
54 fn r_take_rust_string(s: String);
55 fn r_take_unique_ptr_string(s: UniquePtr<CxxString>);
David Tolnayb6c5ea72020-03-16 13:36:28 -070056
David Tolnaycecada62020-03-17 01:45:58 -070057 fn r_try_return_void() -> Result<()>;
David Tolnayb6c5ea72020-03-16 13:36:28 -070058 fn r_try_return_primitive() -> Result<usize>;
59 fn r_fail_return_primitive() -> Result<usize>;
David Tolnayad5b8af2020-01-26 16:59:13 -080060 }
61}
62
David Tolnaybe13d8a2020-03-06 15:45:39 -080063pub type R = usize;
David Tolnayad5b8af2020-01-26 16:59:13 -080064
David Tolnayb6c5ea72020-03-16 13:36:28 -070065#[derive(Debug)]
66struct Error;
67
68impl std::error::Error for Error {}
69
70impl Display for Error {
71 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
72 f.write_str("rust error")
73 }
74}
75
David Tolnayad5b8af2020-01-26 16:59:13 -080076fn r_return_primitive() -> usize {
77 2020
78}
79
80fn r_return_shared() -> ffi::Shared {
81 ffi::Shared { z: 2020 }
82}
83
David Tolnay5cd8d612020-03-06 15:56:30 -080084fn r_return_box() -> Box<R> {
85 Box::new(2020)
86}
87
David Tolnay4b3a66e2020-03-06 16:14:00 -080088fn r_return_unique_ptr() -> UniquePtr<ffi::C> {
89 extern "C" {
90 fn cxx_test_suite_get_unique_ptr() -> *mut ffi::C;
91 }
92 unsafe { UniquePtr::from_raw(cxx_test_suite_get_unique_ptr()) }
93}
94
David Tolnayad5b8af2020-01-26 16:59:13 -080095fn r_return_ref(shared: &ffi::Shared) -> &usize {
96 &shared.z
97}
98
99fn r_return_str(shared: &ffi::Shared) -> &str {
100 let _ = shared;
101 "2020"
102}
103
104fn r_return_rust_string() -> String {
105 "2020".to_owned()
106}
107
David Tolnay85db24862020-03-06 16:24:41 -0800108fn r_return_unique_ptr_string() -> UniquePtr<CxxString> {
109 extern "C" {
110 fn cxx_test_suite_get_unique_ptr_string() -> *mut CxxString;
111 }
112 unsafe { UniquePtr::from_raw(cxx_test_suite_get_unique_ptr_string()) }
113}
114
David Tolnayad5b8af2020-01-26 16:59:13 -0800115fn r_take_primitive(n: usize) {
David Tolnayf306da42020-02-22 19:55:43 -0800116 assert_eq!(n, 2020);
David Tolnayad5b8af2020-01-26 16:59:13 -0800117}
118
119fn r_take_shared(shared: ffi::Shared) {
David Tolnayf306da42020-02-22 19:55:43 -0800120 assert_eq!(shared.z, 2020);
David Tolnayad5b8af2020-01-26 16:59:13 -0800121}
122
123fn r_take_box(r: Box<R>) {
124 let _ = r;
125}
126
127fn r_take_unique_ptr(c: UniquePtr<ffi::C>) {
128 let _ = c;
129}
130
131fn r_take_ref_r(r: &R) {
132 let _ = r;
133}
134
135fn r_take_ref_c(c: &ffi::C) {
136 let _ = c;
137}
138
139fn r_take_str(s: &str) {
David Tolnayf306da42020-02-22 19:55:43 -0800140 assert_eq!(s, "2020");
David Tolnayad5b8af2020-01-26 16:59:13 -0800141}
142
143fn r_take_rust_string(s: String) {
David Tolnayf306da42020-02-22 19:55:43 -0800144 assert_eq!(s, "2020");
David Tolnayad5b8af2020-01-26 16:59:13 -0800145}
146
147fn r_take_unique_ptr_string(s: UniquePtr<CxxString>) {
David Tolnayf306da42020-02-22 19:55:43 -0800148 assert_eq!(s.as_ref().unwrap().to_str().unwrap(), "2020");
David Tolnay97c72102020-01-25 16:49:00 -0800149}
David Tolnayb6c5ea72020-03-16 13:36:28 -0700150
David Tolnaycecada62020-03-17 01:45:58 -0700151fn r_try_return_void() -> Result<(), Error> {
152 Ok(())
153}
154
David Tolnayb6c5ea72020-03-16 13:36:28 -0700155fn r_try_return_primitive() -> Result<usize, Error> {
156 Ok(2020)
157}
158
159fn r_fail_return_primitive() -> Result<usize, Error> {
160 Err(Error)
161}