From e0cfc13287abf746864d6e86176af691da0faa8a Mon Sep 17 00:00:00 2001 From: Intege-rs Date: Tue, 25 Feb 2025 01:25:08 -0500 Subject: [PATCH] ctuple for small c structs --- sub/core/src/ctuple.rs | 75 ++++++++++++++++++++++++++++++++++++++++++ sub/core/src/lib.rs | 3 ++ 2 files changed, 78 insertions(+) create mode 100644 sub/core/src/ctuple.rs diff --git a/sub/core/src/ctuple.rs b/sub/core/src/ctuple.rs new file mode 100644 index 0000000..a285f02 --- /dev/null +++ b/sub/core/src/ctuple.rs @@ -0,0 +1,75 @@ + +pub trait Tuple2CTuple { + type CTuple; +} + +// We place each tuple inside its own module so that it rustrover hints simply show it as C<...> +macro_rules! define_tuple { + ($struct_name:ident, $module_name:ident, $($T:ident),*) => { + pub mod $module_name { + #[repr(C)] + pub struct $struct_name<$($T),*>($(pub $T),*); + + impl<$($T),*> super::Tuple2CTuple for ($($T,)*) { + type CTuple = $struct_name<$($T,)*>; + } + } + }; +} + +// @formatter:off +define_tuple!(C, t0 , ); +define_tuple!(C, t1 , T0); +define_tuple!(C, t2 , T0, T1); +define_tuple!(C, t3 , T0, T1, T2); +define_tuple!(C, t4 , T0, T1, T2, T3); +define_tuple!(C, t5 , T0, T1, T2, T3, T4); +define_tuple!(C, t6 , T0, T1, T2, T3, T4, T5); +define_tuple!(C, t7 , T0, T1, T2, T3, T4, T5, T6); +define_tuple!(C, t8 , T0, T1, T2, T3, T4, T5, T6, T7); +define_tuple!(C, t9 , T0, T1, T2, T3, T4, T5, T6, T7, T8); +define_tuple!(C, t10, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9); +define_tuple!(C, t11, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10); +define_tuple!(C, t12, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11); +define_tuple!(C, t13, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12); +define_tuple!(C, t14, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13); +define_tuple!(C, t15, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14); +define_tuple!(C, t16, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T16); +// @formatter:on + +/// Helper macro to get the correct Tuple based on the number of arguments... +pub macro find_type { + // @formatter:off + () => { $crate::ctuple::t0::C }, + ($T0:tt) => { $crate::ctuple::t1::C }, + ($T0:tt, $T1:tt) => { $crate::ctuple::t2::C }, + ($T0:tt, $T1:tt, $T2:tt) => { $crate::ctuple::t3::C }, + ($T0:tt, $T1:tt, $T2:tt, $T3:tt) => { $crate::ctuple::t4::C }, + ($T0:tt, $T1:tt, $T2:tt, $T3:tt, $T4:tt) => { $crate::ctuple::t5::C }, + ($T0:tt, $T1:tt, $T2:tt, $T3:tt, $T4:tt, $T5:tt) => { $crate::ctuple::t6::C }, + ($T0:tt, $T1:tt, $T2:tt, $T3:tt, $T4:tt, $T5:tt, $T6:tt) => { $crate::ctuple::t7::C }, + ($T0:tt, $T1:tt, $T2:tt, $T3:tt, $T4:tt, $T5:tt, $T6:tt, $T7:tt) => { $crate::ctuple::t8::C }, + ($T0:tt, $T1:tt, $T2:tt, $T3:tt, $T4:tt, $T5:tt, $T6:tt, $T7:tt, $T8:tt) => { $crate::ctuple::t9::C }, + ($T0:tt, $T1:tt, $T2:tt, $T3:tt, $T4:tt, $T5:tt, $T6:tt, $T7:tt, $T8:tt, $T9:tt) => { $crate::ctuple::t10::C }, + ($T0:tt, $T1:tt, $T2:tt, $T3:tt, $T4:tt, $T5:tt, $T6:tt, $T7:tt, $T8:tt, $T9:tt, $T10:tt) => { $crate::ctuple::t11::C }, + ($T0:tt, $T1:tt, $T2:tt, $T3:tt, $T4:tt, $T5:tt, $T6:tt, $T7:tt, $T8:tt, $T9:tt, $T10:tt, $T11:tt) => { $crate::ctuple::t12::C }, + ($T0:tt, $T1:tt, $T2:tt, $T3:tt, $T4:tt, $T5:tt, $T6:tt, $T7:tt, $T8:tt, $T9:tt, $T10:tt, $T11:tt, $T12:tt) => { $crate::ctuple::t13::C }, + ($T0:tt, $T1:tt, $T2:tt, $T3:tt, $T4:tt, $T5:tt, $T6:tt, $T7:tt, $T8:tt, $T9:tt, $T10:tt, $T11:tt, $T12:tt, $T13:tt) => { $crate::ctuple::t14::C }, + ($T0:tt, $T1:tt, $T2:tt, $T3:tt, $T4:tt, $T5:tt, $T6:tt, $T7:tt, $T8:tt, $T9:tt, $T10:tt, $T11:tt, $T12:tt, $T13:tt, $T14:tt) => { $crate::ctuple::t15::C }, + ($T0:tt, $T1:tt, $T2:tt, $T3:tt, $T4:tt, $T5:tt, $T6:tt, $T7:tt, $T8:tt, $T9:tt, $T10:tt, $T11:tt, $T12:tt, $T13:tt, $T14:tt, $T15:tt) => { $crate::ctuple::t16::C }, + // @formatter:on +} + +#[allow(non_snake_case)] +pub macro C { + + // Simply use the Tuple2CTuple trait to convert the regular tuple to our ReprC variant + ($($types:ty),*) => { + <($($types,)*) as Tuple2CTuple>::CTuple + }, + + // use the auxiliary macro to find the correct tuple type and construct it + ($($values:expr),*) => { + $crate::ctuple::find_type!($($values),*)($($values),*) + }, +} \ No newline at end of file diff --git a/sub/core/src/lib.rs b/sub/core/src/lib.rs index 007f7a0..891db75 100644 --- a/sub/core/src/lib.rs +++ b/sub/core/src/lib.rs @@ -25,6 +25,8 @@ pub mod pstruct; pub mod align; pub mod never; + +pub mod ctuple; // // Export Preludes: // @@ -58,6 +60,7 @@ pub mod prelude { pub use crate::pod::{Pod,Mut}; pub use crate::align::Align; pub use crate::never::Never; + pub use crate::ctuple::C; } pub mod public {