ref_cast

Derive Macro RefCast

Source
#[derive(RefCast)]
{
    // Attributes available to this derive:
    #[trivial]
}
Expand description

Derive the RefCast trait.

See the crate-level documentation for usage examples!

ยงAttributes

Use the #[trivial] attribute to mark any zero-sized fields that are not the one that references are going to be converted from.

use ref_cast::RefCast;
use std::marker::PhantomData;

#[derive(RefCast)]
#[repr(transparent)]
pub struct Generic<T, U> {
    raw: Vec<U>,
    #[trivial]
    aux: Variance<T, U>,
}

type Variance<T, U> = PhantomData<fn(T) -> U>;

Fields with a type named PhantomData or PhantomPinned are automatically recognized and do not need to be marked with this attribute.

use ref_cast::RefCast;
use std::marker::{PhantomData, PhantomPinned};

#[derive(RefCast)]  // generates a conversion from &[u8] to &Bytes<'_>
#[repr(transparent)]
pub struct Bytes<'arena> {
    lifetime: PhantomData<&'arena ()>,
    pin: PhantomPinned,
    bytes: [u8],
}