typewit/
utils.rs

1use core::mem::ManuallyDrop;
2
3#[repr(C)]
4pub union Transmuter<F, T> {
5    pub from: ManuallyDrop<F>,
6    pub to: ManuallyDrop<T>,
7}
8
9#[macro_export]
10#[doc(hidden)]
11macro_rules! __priv_transmute {
12    ($from:ty, $to:ty, $value:expr) => {{
13        $crate::__::ManuallyDrop::into_inner(
14            $crate::utils::Transmuter::<$from, $to> {
15                from: $crate::__::ManuallyDrop::new($value),
16            }
17            .to,
18        )
19    }};
20}
21
22
23macro_rules! conditionally_const {
24    (
25        feature = $feature:literal;
26        
27        $( #[$meta:meta] )*
28        $vis:vis fn $fn_name:ident $([$($generics:tt)*])? (
29            $($params:tt)*
30        ) -> $ret:ty 
31        $block:block
32    ) => (
33        $(#[$meta])*
34        #[cfg(feature = $feature)]
35        $vis const fn $fn_name $(<$($generics)*>)? ($($params)*) -> $ret $block
36
37        $(#[$meta])*
38        #[cfg(not(feature = $feature))]
39        $vis fn $fn_name $(<$($generics)*>)? ($($params)*) -> $ret $block
40    )
41} pub(crate) use conditionally_const;
42
43