Expand description
The dep_type
, impl_dep_obj
, and with_builder
macro expansion example.
ⓘ
dep_type! {
#[derive(Debug)]
pub struct MyDepType = MyDepTypeId[MyDepType] {
prop_1: bool = false,
prop_2: i32 = 10,
}
}
macro_attr! {
#[derive(Component!(stop=MyDepTypeStop), Debug)]
struct MyDepTypePrivateData {
dep_data: MyDepType,
}
}
impl ComponentStop for MyDepTypeStop {
with_arena_in_state_part!(MyApp { .my_dep_types });
fn stop(&self, state: &mut dyn State, id: Id<MyDepTypePrivateData>) {
MyDepTypeId(id).drop_bindings_priv(state);
}
}
macro_attr! {
#[derive(NewtypeComponentId!, Debug, Copy, Clone, Eq, PartialEq, Hash, Ord, PartialOrd)]
pub struct MyDepTypeId(Id<MyDepTypePrivateData>);
}
impl DetachedDepObjId for MyDepTypeId { }
#[derive(Debug, Stop)]
pub struct MyApp {
my_dep_types: Arena<MyDepTypePrivateData>,
}
impl MyDepTypeId {
pub fn new(state: &mut dyn State) -> MyDepTypeId {
let app: &mut MyApp = state.get_mut();
app.my_dep_types.insert(|id| (MyDepTypePrivateData {
dep_data: MyDepType::new_priv()
}, MyDepTypeId(id)))
}
pub fn drop_self(self, state: &mut dyn State) {
self.drop_bindings_priv(state);
let app: &mut MyApp = state.get_mut();
app.my_dep_types.remove(self.0);
}
with_builder!(MyDepType);
}
impl_dep_obj!(MyDepTypeId {
fn<MyDepType>() -> (MyDepType) { MyApp { .my_dep_types } | .dep_data }
});
// OR equvalent:
impl_dep_obj!(MyDepTypeId {
fn<MyDepType>(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
}
}
});