ctuple for small c structs

This commit is contained in:
Intege-rs
2025-02-25 01:25:08 -05:00
parent 6964bf6f7a
commit e0cfc13287
2 changed files with 78 additions and 0 deletions

75
sub/core/src/ctuple.rs Normal file
View File

@@ -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),*)
},
}

View File

@@ -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 {