hv-elastic 0.2.1

Almost-safe abstractions for lengthening lifetimes and `'static` "loaning" of non-`'static` types
Documentation
//! [`Stretched`] implementations and types for the [`hv_ecs`] crate.

use core::fmt;
use core::marker::PhantomData;

use crate::{Stretchable, Stretched};

/// The type of a stretched [`BatchWriter`].
#[repr(C, align(8))]
pub struct StretchedBatchWriter<T>(
    [u8; core::mem::size_of::<hv_ecs::BatchWriter<u8>>()],
    PhantomData<T>,
);

impl<T> fmt::Debug for StretchedBatchWriter<T> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "StretchedBatchWriter(..)")
    }
}

static_assertions::assert_eq_size!(StretchedBatchWriter<u32>, hv_ecs::BatchWriter<u32>);
static_assertions::assert_eq_align!(StretchedBatchWriter<u32>, hv_ecs::BatchWriter<u32>);

unsafe impl<T: 'static> Stretched for StretchedBatchWriter<T> {
    type Parameterized<'a> = hv_ecs::BatchWriter<'a, T>;

    impl_stretched_methods!();
}

impl<'a, T: 'static> Stretchable<'a> for hv_ecs::BatchWriter<'a, T> {
    type Stretched = StretchedBatchWriter<T>;
}