[][src]Macro components_arena::Component

macro_rules! Component {
    (
        ($(class=$class:ident)?)
        $vis:vis enum $name:ident
        $($body:tt)*
    ) => { ... };
    (
        ($(class=$class:ident)?)
        $vis:vis struct $name:ident
        $($body:tt)*
    ) => { ... };
    (
        @impl [$vis:vis] [$name:ident] [] [] [] [] $($body:tt)*
    ) => { ... };
    (
        @impl [$vis:vis] [$name:ident] [$class:ident] [] [] [] $($body:tt)*
    ) => { ... };
    (
        @impl [$vis:vis] [$name:ident] [] [$($g:tt)+] [$($r:tt)+] [$($w:tt)*] $($body:tt)*
    ) => { ... };
    (
        @impl [$vis:vis] [$name:ident] [$class:ident] [$($g:tt)+] [$($r:tt)+] [$($w:tt)*] $($body:tt)*
    ) => { ... };
    (
        @self [$name:ident]
    ) => { ... };
    (
        @class [$vis:vis] [$name:ident] [$class:ident] [$($g:tt)*] [$($r:tt)*] [$($w:tt)*]
    ) => { ... };
}

Macro attribute for deriving Component trait.

Examples

Non-generic component

macro_attr! {
    #[derive(Component!)]
    struct Item { /* ... */ }
}

static ITEM: ComponentClassMutex<Item> = ComponentClassMutex::new();

// ...

let mut arena = Arena::new(&mut ITEM.lock().unwrap());
let id = arena.insert(|id| (Item { /* ... */ }, id));

Generic component

macro_attr! {
    #[derive(Component!(class=ItemComponent))]
    struct Item<T> {
        context: T
    }
}

static ITEM: ComponentClassMutex<ItemComponent> = ComponentClassMutex::new();

// ...

let mut arena_u8 = Arena::new(&mut ITEM.lock().unwrap());
let _ = arena_u8.insert(|id| (Item { context: 7u8 }, id));

let mut arena_u32 = Arena::new(&mut ITEM.lock().unwrap());
let _ = arena_u32.insert(|id| (Item { context: 7u32 }, id));