use crate::arena::Arena;
pub trait CopyInto {
type Output<'arena>: 'arena;
fn copy_into<'arena, A>(&self, arena: &'arena A) -> Self::Output<'arena>
where
A: Arena;
}
#[must_use]
#[inline]
pub fn copy_ref_into<'arena, T, A>(value: &T, arena: &'arena A) -> &'arena T::Output<'arena>
where
T: CopyInto,
A: Arena,
{
arena.alloc(value.copy_into(arena))
}
#[must_use]
#[inline]
pub fn copy_slice_into<'arena, T, A>(values: &[T], arena: &'arena A) -> &'arena [T::Output<'arena>]
where
T: CopyInto,
A: Arena,
{
arena.alloc_slice_fill_iter(values.iter().map(|value| value.copy_into(arena)))
}
macro_rules! trivial_copy_into {
($ty:ty) => {
impl CopyInto for $ty {
type Output<'arena> = $ty;
fn copy_into<'arena, A>(&self, _arena: &'arena A) -> Self::Output<'arena>
where
A: Arena,
{
*self
}
}
};
($($ty:ty),+) => {
$(trivial_copy_into!($ty);)+
};
}
trivial_copy_into!((), bool, u8, u16, u32, u64, usize, i8, i16, i32, i64, isize, f32, f64);