abi_stable/library/c_abi_testing/
functions.rs

1#![allow(clippy::missing_const_for_fn)]
2
3use super::*;
4
5/////////////////////////////////////
6
7/// Functions used to test that the C abi is the same in both the library and the loader.
8#[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
31/////////////////////////////////////
32
33/// Functions used to test that the C abi is the same in both the library and the loader.
34pub 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}