1#![no_std]
2#![doc = include_str!("../README.md")]
3
4pub use extern_trait_impl::*;
5
6#[doc(hidden)]
15#[derive(Clone, Copy)]
16#[repr(C)]
17#[cfg_attr(target_pointer_width = "32", repr(align(8)))]
18pub struct Repr(
19 *mut (),
20 *mut (),
21 core::marker::PhantomData<(
23 &'static mut (),
24 core::cell::UnsafeCell<()>,
25 core::marker::PhantomPinned,
26 )>,
27);
28
29const _: () = assert!(size_of::<Repr>() == size_of::<usize>() * 2);
30
31impl Repr {
32 #[doc(hidden)]
33 #[inline]
34 pub unsafe fn from_value<T: Sized>(value: T) -> Self {
35 const { assert!(size_of::<T>() <= size_of::<Repr>()) };
36 const { assert!(align_of::<T>() <= align_of::<Repr>()) };
37 let mut repr = core::mem::MaybeUninit::<Repr>::zeroed();
38 unsafe {
40 core::ptr::write(repr.as_mut_ptr().cast::<T>(), value);
41 repr.assume_init()
42 }
43 }
44
45 #[doc(hidden)]
46 #[inline]
47 pub unsafe fn into_value<T: Sized>(self) -> T {
48 const { assert!(size_of::<T>() <= size_of::<Repr>()) };
49 const { assert!(align_of::<T>() <= align_of::<Repr>()) };
50 unsafe { core::ptr::read((&self as *const Repr).cast::<T>()) }
53 }
54}
55
56#[doc(hidden)]
57pub mod __private {
58 #[doc(hidden)]
59 pub use typeid::ConstTypeId;
60}