abi_stable/library/c_abi_testing/
functions.rs
1#![allow(clippy::missing_const_for_fn)]
2
3use super::*;
4
5#[repr(C)]
9#[derive(StableAbi)]
10pub struct CAbiTestingFns {
11 pub(crate) take_pair_a: extern "C" fn(Tuple2<u16, ()>) -> u32,
12 pub(crate) take_pair_b: extern "C" fn(Tuple2<(), u16>) -> u32,
13 pub(crate) ret_pair_a: extern "C" fn(u32) -> Tuple2<u16, ()>,
14 pub(crate) ret_pair_b: extern "C" fn(u32) -> Tuple2<(), u16>,
15
16 pub(crate) take_triple_a: extern "C" fn(Tuple3<(), u16, u16>) -> u64,
17 pub(crate) take_triple_b: extern "C" fn(Tuple3<u16, (), u16>) -> u64,
18 pub(crate) take_triple_c: extern "C" fn(Tuple3<u16, u16, ()>) -> u64,
19 pub(crate) ret_triple_a: extern "C" fn(u64) -> Tuple3<(), u16, u16>,
20 pub(crate) ret_triple_b: extern "C" fn(u64) -> Tuple3<u16, (), u16>,
21 pub(crate) ret_triple_c: extern "C" fn(u64) -> Tuple3<u16, u16, ()>,
22
23 pub(crate) take_2_pairs_a: extern "C" fn(Tuple2<(), u16>, Tuple2<(), u16>) -> u64,
24 pub(crate) take_2_pairs_b: extern "C" fn(Tuple2<u16, ()>, Tuple2<u16, ()>) -> u64,
25 pub(crate) ret_2_pairs_a: extern "C" fn(u64) -> Tuple2<Tuple2<(), u16>, Tuple2<(), u16>>,
26 pub(crate) ret_2_pairs_b: extern "C" fn(u64) -> Tuple2<Tuple2<u16, ()>, Tuple2<u16, ()>>,
27
28 pub(crate) mixed_units: extern "C" fn(u16, MyUnit, u16, MyUnit, u16, MyUnit, u16) -> u64,
29}
30
31pub const C_ABI_TESTING_FNS: &CAbiTestingFns = &CAbiTestingFns {
35 take_pair_a,
36 take_pair_b,
37 ret_pair_a,
38 ret_pair_b,
39 take_triple_a,
40 take_triple_b,
41 take_triple_c,
42 ret_triple_a,
43 ret_triple_b,
44 ret_triple_c,
45 take_2_pairs_a,
46 take_2_pairs_b,
47 ret_2_pairs_a,
48 ret_2_pairs_b,
49 mixed_units,
50};
51
52pub(crate) extern "C" fn take_pair_a(pair: Tuple2<u16, ()>) -> u32 {
53 pair.0 as u32
54}
55pub(crate) extern "C" fn take_pair_b(pair: Tuple2<(), u16>) -> u32 {
56 (pair.1 as u32) << 16
57}
58pub(crate) extern "C" fn ret_pair_a(n: u32) -> Tuple2<u16, ()> {
59 Tuple2(n as u16, ())
60}
61pub(crate) extern "C" fn ret_pair_b(n: u32) -> Tuple2<(), u16> {
62 Tuple2((), (n >> 16) as u16)
63}
64
65pub(crate) extern "C" fn take_triple_a(triple: Tuple3<(), u16, u16>) -> u64 {
66 ((triple.1 as u64) << 16) + ((triple.2 as u64) << 32)
67}
68pub(crate) extern "C" fn take_triple_b(triple: Tuple3<u16, (), u16>) -> u64 {
69 (triple.0 as u64) + ((triple.2 as u64) << 32)
70}
71pub(crate) extern "C" fn take_triple_c(triple: Tuple3<u16, u16, ()>) -> u64 {
72 (triple.0 as u64) + ((triple.1 as u64) << 16)
73}
74pub(crate) extern "C" fn ret_triple_a(n: u64) -> Tuple3<(), u16, u16> {
75 Tuple3((), (n >> 16) as u16, (n >> 32) as u16)
76}
77pub(crate) extern "C" fn ret_triple_b(n: u64) -> Tuple3<u16, (), u16> {
78 Tuple3(n as u16, (), (n >> 32) as u16)
79}
80pub(crate) extern "C" fn ret_triple_c(n: u64) -> Tuple3<u16, u16, ()> {
81 Tuple3(n as u16, (n >> 16) as u16, ())
82}
83
84pub(crate) extern "C" fn take_2_pairs_a(a: Tuple2<(), u16>, b: Tuple2<(), u16>) -> u64 {
85 ((a.1 as u64) << 16) + ((b.1 as u64) << 48)
86}
87pub(crate) extern "C" fn take_2_pairs_b(a: Tuple2<u16, ()>, b: Tuple2<u16, ()>) -> u64 {
88 (a.0 as u64) + ((b.0 as u64) << 32)
89}
90pub(crate) extern "C" fn ret_2_pairs_a(n: u64) -> Tuple2<Tuple2<(), u16>, Tuple2<(), u16>> {
91 Tuple2(Tuple2((), (n >> 16) as u16), Tuple2((), (n >> 48) as u16))
92}
93pub(crate) extern "C" fn ret_2_pairs_b(n: u64) -> Tuple2<Tuple2<u16, ()>, Tuple2<u16, ()>> {
94 Tuple2(Tuple2(n as u16, ()), Tuple2((n >> 32) as u16, ()))
95}
96
97pub(crate) extern "C" fn mixed_units(
98 a: u16,
99 _: MyUnit,
100 b: u16,
101 _: MyUnit,
102 c: u16,
103 _: MyUnit,
104 d: u16,
105) -> u64 {
106 (a as u64) | ((b as u64) << 16) | ((c as u64) << 32) | ((d as u64) << 48)
107}