#[cfg(no_std)]
use alloc::boxed::Box;
use super::{
discriminant::Discriminant,
inlined::Inlined,
VariantHandle
};
pub enum BoxedArgument
{
Allocated(Box<dyn VariantHandle>),
Inlined(Inlined)
}
impl BoxedArgument
{
#[inline(always)]
pub unsafe fn from_owned(store: *mut dyn VariantHandle,
discriminant: Discriminant) -> Self
{
debug_assert!(!store.is_null());
match discriminant
{
Discriminant::Inlined =>
{
let inlined = Inlined::from(store);
Self::Inlined(inlined)
}
Discriminant::Allocated =>
{
let allocated = unsafe { Box::from_raw(store) };
Self::Allocated(allocated)
}
_ => unreachable!()
}
}
}