Macro moore::node_storage
[−]
macro_rules! node_storage { ( $ name : ident < $ ( $ lt : tt ) , + > : $ ( $ node_name : ident : $ node_ref : ty => $ node : ty , ) + ) => { ... }; ( $ name : ident < $ ( $ lt : tt ) , + > where ( $ ( $ wh : tt ) + ) : $ ( $ node_name : ident : $ node_ref : ty => $ node : ty , ) + ) => { ... }; ( STRUCT_IMPL $ name : ident ; $ ( $ lt : tt ) , + ; $ ( $ node_name : ident , $ node_ref : ty , $ node : ty ; ) * ) => { ... }; ( TRAIT_IMPL $ name : ident ; $ ( $ lt : tt ) , + ; $ node_name : ident , $ node_ref : ty , $ node : ty ; $ ( $ tail_name : ident , $ tail_ref : ty , $ tail : ty ; ) * ) => { ... }; ( TRAIT_IMPL $ name : ident ; $ ( $ lt : tt ) , * ; ) => { ... }; }
Create a new table that implements the NodeStorage
trait.
The resulting table can then be used to store nodes in a type safe manner.
Example
#[macro_use] extern crate moore_common; use moore_common::score::NodeStorage; #[derive(PartialEq, Eq, Hash, Debug)] struct FooRef(usize); #[derive(PartialEq, Eq, Hash, Debug)] struct BarRef(usize); #[derive(PartialEq, Eq, Debug)] struct Foo; #[derive(PartialEq, Eq, Debug)] struct Bar; node_storage!(NodeTable<'tn>: foos: FooRef => &'tn Foo, bars: BarRef => &'tn Bar, ); let foo = &Foo; let bar = &Bar; let mut tbl = NodeTable::new(); tbl.set(FooRef(0), foo); tbl.set(BarRef(1), bar); assert_eq!(tbl.get(&FooRef(0)), Some(&foo)); assert_eq!(tbl.get(&BarRef(1)), Some(&bar)); // The following would produce a compiler error due to the type mismatch: // assert_eq!(tbl.get(&BarRef(0)), Some(&foo)); // assert_eq!(tbl.get(&FooRef(1)), Some(&bar));