1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
//! Components and their storage //! //! All components live within a storage, which may be //! an enum, a boxed trait, etc..., anything that implements //! the [`Storage`] trait. //! All types that can live within a storage must implement //! [`Component`] of that storage. //! //! # Example //! //! ```rust //! //! mecs::impl_enum_storage! { //! enum Components { //! A(i32), //! B(&'static str), //! C(f32), //! } //! } //! ``` //! //! # Manual Implementation //! //! ```rust //! use std::any::Any; //! use mecs::{Storage, Component}; //! //! enum Components<'a> { //! A(i32), //! B(&'a str), //! } //! //! impl<'a> Storage<'a> for Components<'a> //! { //! type Id = usize; //! //! fn id(&self) -> Self::Id { //! match self { //! Self::A(_) => <i32 as Component<Self>>::id(), //! Self::B(_) => <&'a str as Component<Self>>::id(), //! } //! } //! } //! //! impl<'a> Component<'a, Components<'a>> for i32 { //! fn id() -> <Components<'a> as Storage<'a>>::Id { 0 } //! //! fn get<'b>(storage: &'b Components<'a>) -> Option<&'b Self> { //! if let Components::A(num) = storage { Some( num ) } else { None } //! } //! //! fn get_mut<'b>(storage: &'b mut Components<'a>) -> Option<&'b mut Self> { //! if let Components::A(num) = storage { Some( num ) } else { None } //! } //! } //! //! impl<'a> Component<'a, Components<'a>> for &'a str { //! fn id() -> <Components<'a> as Storage<'a>>::Id { 1 } //! //! fn get<'b>(storage: &'b Components<'a>) -> Option<&'b Self> { //! if let Components::B(name) = storage { Some( name ) } else { None } //! } //! //! fn get_mut<'b>(storage: &'b mut Components<'a>) -> Option<&'b mut Self> { //! if let Components::B(name) = storage { Some( name ) } else { None } //! } //! } //! ``` // Modules #[cfg(test)] mod test; mod impl_macro; pub mod dyn_storage; // Exports pub use dyn_storage::DynStorage; // Traits //-------------------------------------------------------------------------------------------------- /// Storage for any number of components pub trait Storage<'a> { /// The type representing a unique id for each component /// within this storage. type Id; /// Returns the id of the current component within this /// storage. #[must_use] fn id(&self) -> Self::Id; } /// Trait implemented by all types within a storage. /// /// # Visitor /// This trait uses the visitor pattern to provide getters for /// the storage. pub trait Component<'a, S> where S: Storage<'a>, { /// Returns this component's id #[must_use] fn id() -> S::Id; /// Returns a reference to this component from a storage #[must_use] fn get(storage: &S) -> Option<&Self>; /// Returns a mutable reference to this component from a storage #[must_use] fn get_mut(storage: &mut S) -> Option<&mut Self>; } //--------------------------------------------------------------------------------------------------