#[doc(hidden)]
pub const fn __manually_drop_inner_ref<T>(slot: &core::mem::ManuallyDrop<T>) -> &T {
unsafe { core::mem::transmute(slot) }
}
#[macro_export]
macro_rules! const_destructure_struct {
(let $S:ident { $($field:ident: $var:ident),* } = $value:expr) => {
let value = $value;
let __destructures_all_fields_and_fields_are_unique = || {
let $S { $($field: _),* } = &value;
};
let value = ::core::mem::ManuallyDrop::new($value);
let value = $crate::__manually_drop_inner_ref(&value);
$(
let $var = unsafe { ::core::ptr::addr_of!(value.$field).read() };
)*
}
}
#[macro_export]
macro_rules! const_destructure_tuple {
(let ($($var:ident),*) = $value:expr) => {
$crate::const_destructure_tuple!(@impl ($($var),*); (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) => (); let () = $value);
};
(@impl (); ($($index_rest:tt),*) => ($($ty:tt),*); let ($($index:tt: $var:ident),*) = $value:expr) => {
let value: ($($ty,)*) = $value; let value = ::core::mem::ManuallyDrop::new(value);
let value = $crate::__manually_drop_inner_ref(&value);
$(
let $var = unsafe { ::core::ptr::addr_of!(value.$index).read() };
)*
};
(@impl ($var_head:ident $(,$var_tail:ident)*); () => ($($ty:tt),*); let ($($index:tt: $var:ident),*) = $value:expr) => {
compile_error!("tuple arity is larger than the maximum supported arity 12")
};
(@impl ($var_head:ident $(,$var_tail:ident)*); ($index_head:tt $(,$index_tail:tt)*) => ($($ty:tt),*); let ($($index:tt: $var:ident),*) = $value:expr) => {
$crate::const_destructure_tuple!(@impl ($($var_tail),*); ($($index_tail),*) => ($($ty,)* _); let ($($index: $var,)* $index_head: $var_head) = $value);
};
}