Trait dep_obj::DepType [−][src]
pub trait DepType: Sized { type Id: ComponentId; }
Expand description
A dependency type.
Use the dep_type
or the dep_type_with_builder
macro
to create a type implementing this trait.
Examples
use components_arena::{Arena, Component, ComponentClassToken, ComponentId, Id}; use dep_obj::{Dispatcher, dep_obj, dep_type}; use dyn_context::State; use macro_attr_2018::macro_attr; use std::any::{Any, TypeId}; dep_type! { #[derive(Debug)] pub struct MyDepType in MyDepTypeId { prop_1: bool = false, prop_2: i32 = 10, } } macro_attr! { #[derive(Component!, Debug)] struct MyDepTypePrivateData { dep_data: MyDepType, } } macro_attr! { #[derive(ComponentId!, Debug, Copy, Clone, Eq, PartialEq, Hash, Ord, PartialOrd)] pub struct MyDepTypeId(Id<MyDepTypePrivateData>); } pub struct MyApp { dispatcher: Dispatcher, my_dep_types: Arena<MyDepTypePrivateData>, } impl State for MyApp { fn get_raw(&self, ty: TypeId) -> Option<&dyn Any> { if ty == TypeId::of::<Dispatcher>() { Some(&self.dispatcher) } else if ty == TypeId::of::<MyApp>() { Some(self) } else { None } } fn get_mut_raw(&mut self, ty: TypeId) -> Option<&mut dyn Any> { if ty == TypeId::of::<Dispatcher>() { Some(&mut self.dispatcher) } else if ty == TypeId::of::<MyApp>() { Some(self) } else { None } } } impl MyDepTypeId { pub fn new(app: &mut MyApp) -> MyDepTypeId { app.my_dep_types.insert(|id| (MyDepTypePrivateData { dep_data: MyDepType::new_priv() }, MyDepTypeId(id))) } dep_obj! { pub fn obj(self as this, app: MyApp) -> MyDepType { if mut { &mut app.my_dep_types[this.0].dep_data } else { &app.my_dep_types[this.0].dep_data } } } } fn main() { let mut my_dep_types_token = ComponentClassToken::new().unwrap(); let mut app = MyApp { dispatcher: Dispatcher::new(), my_dep_types: Arena::new(&mut my_dep_types_token), }; let id = MyDepTypeId::new(&mut app); assert_eq!(id.obj_ref(&app).get(MyDepType::PROP_2), &10); id.obj_mut(&mut app).set_distinct(MyDepType::PROP_2, 5); assert_eq!(id.obj_ref(&app).get(MyDepType::PROP_2), &5); }
Associated Types
type Id: ComponentId