munge/
__macro.rs

1use core::{hint::unreachable_unchecked, marker::PhantomData};
2
3use crate::{internal, Borrow, Destructure, Restructure};
4
5pub fn make_destructurer<T: Destructure>(
6    value: T,
7) -> <T::Destructuring as internal::DestructuringFor<T>>::Destructurer
8where
9    T::Destructuring: internal::DestructuringFor<T>,
10{
11    internal::Destructurer::new(value)
12}
13
14pub fn destructurer_ptr<T: internal::Destructurer>(
15    destructurer: &mut T,
16) -> *mut <T::Inner as Destructure>::Underlying {
17    Destructure::underlying(destructurer.inner_mut())
18}
19
20/// # Safety
21///
22/// `test_destructurer` may not be called.
23pub fn test_destructurer<'a, T: internal::Test<'a>>(_: &'a mut T) -> T::Test {
24    // SAFETY: `test_destructurer` may not be called.
25    unsafe { unreachable_unchecked() }
26}
27
28/// # Safety
29///
30/// `ptr` must be a properly-aligned pointer to a subfield of the pointer
31/// underlying the inner value of `destructurer`.
32pub unsafe fn restructure_destructurer<T: internal::Destructurer, U>(
33    destructurer: &T,
34    ptr: *mut U,
35) -> <T::Inner as Restructure<U>>::Restructured
36where
37    T::Inner: Restructure<U>,
38{
39    // SAFETY: The caller has guaranteed that `ptr` is a properly-aligned
40    // pointer to a subfield of the pointer underlying the inner value of
41    // `destructurer`.
42    unsafe {
43        Restructure::restructure(
44            internal::Destructurer::inner(destructurer),
45            ptr,
46        )
47    }
48}
49
50pub fn get_destructure<T>(_: &T) -> PhantomData<T::Inner>
51where
52    T: internal::Destructurer,
53{
54    PhantomData
55}
56
57pub fn only_borrow_destructuring_may_use_rest_patterns<
58    T: Destructure<Destructuring = Borrow>,
59>(
60    _: PhantomData<T>,
61) {
62}