## RefCast

# 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],
    }