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
20pub fn test_destructurer<'a, T: internal::Test<'a>>(_: &'a mut T) -> T::Test {
24 unsafe { unreachable_unchecked() }
26}
27
28pub 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 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}