[][src]Macro components_arena::Component

macro_rules! Component {
    (()
        $(pub $((crate))?)? enum $name:ident
        $tail:tt ) => { ... };
    (()
        $(pub $((crate))?)? struct $name:ident
        $tail:tt ) => { ... };
    ((class=$class:ident)
        enum $name:ident
        < $( $lt:tt $( : $clt:tt $(+ $dlt:tt )* )? ),+ > $tail:tt ) => { ... };
    ((class=$class:ident)
        struct $name:ident
        < $( $lt:tt $( : $clt:tt $(+ $dlt:tt )* )? ),+ > $tail:tt ) => { ... };
    ((class=$class:ident)
        pub(crate) enum $name:ident
        < $( $lt:tt $( : $clt:tt $(+ $dlt:tt )* )? ),+ > $tail:tt ) => { ... };
    ((class=$class:ident)
        pub(crate) struct $name:ident
        < $( $lt:tt $( : $clt:tt $(+ $dlt:tt )* )? ),+ > $tail:tt ) => { ... };
    ((class=$class:ident)
        pub enum $name:ident
        < $( $lt:tt $( : $clt:tt $(+ $dlt:tt )* )? ),+ > $tail:tt ) => { ... };
    ((class=$class:ident)
        pub struct $name:ident
        < $( $lt:tt $( : $clt:tt $(+ $dlt:tt )* )? ),+ > $tail:tt ) => { ... };
    (@impl $name:ident) => { ... };
    (@impl ($($p:tt $($c:tt)?)?) $name:ident, $class:ident, < $g:tt >, < $r:tt >) => { ... };
}

Macro attribute for deriving Component trait.

Examples

Non-generic component

#[macro_use]
extern crate macro_attr;
#[macro_use]
extern crate components_arena;
use components_arena::{ComponentClassMutex, Arena};

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

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

// ...

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

Generic component

#[macro_use]
extern crate macro_attr;
#[macro_use]
extern crate components_arena;
use components_arena::{ComponentClassMutex, Arena};

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

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

// ...

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

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