diff options
Diffstat (limited to 'ecs')
| -rw-r--r-- | ecs/src/component/storage.rs | 11 | ||||
| -rw-r--r-- | ecs/src/lib.rs | 1 | ||||
| -rw-r--r-- | ecs/src/util.rs | 48 | 
3 files changed, 58 insertions, 2 deletions
| diff --git a/ecs/src/component/storage.rs b/ecs/src/component/storage.rs index e909395..9c149ed 100644 --- a/ecs/src/component/storage.rs +++ b/ecs/src/component/storage.rs @@ -12,6 +12,7 @@ use crate::component::{  use crate::entity::Uid as EntityUid;  use crate::lock::Lock;  use crate::type_name::TypeName; +use crate::util::Sortable;  use crate::EntityComponent;  #[derive(Debug, Default)] @@ -26,9 +27,12 @@ impl Storage  {      pub fn find_entities(          &self, -        components_metadata: impl IntoIterator<Item = ComponentMetadata>, +        mut components_metadata: impl IntoIterator<Item = ComponentMetadata> +            + Sortable<Item = ComponentMetadata>,      ) -> ArchetypeRefIter<'_>      { +        components_metadata.sort_by_key_b(|component_metadata| component_metadata.id); +          self.archetype_lookup              .get(&ArchetypeId::from_components_metadata(components_metadata))              .map_or_else(ArchetypeRefIter::new_empty, |archetypes_indices| { @@ -114,9 +118,12 @@ impl Storage      pub fn add_archetype_lookup_entry(          &mut self, -        components_metadata: impl IntoIterator<Item = ComponentMetadata>, +        mut components_metadata: impl IntoIterator<Item = ComponentMetadata> +            + Sortable<Item = ComponentMetadata>,      )      { +        components_metadata.sort_by_key_b(|component_metadata| component_metadata.id); +          self.pending_archetype_lookup_entries              .push(components_metadata.into_iter().collect());      } diff --git a/ecs/src/lib.rs b/ecs/src/lib.rs index b920b48..cf2f198 100644 --- a/ecs/src/lib.rs +++ b/ecs/src/lib.rs @@ -35,6 +35,7 @@ pub mod tuple;  pub mod type_name;  mod archetype; +mod util;  pub use ecs_macros::{Component, Sole}; diff --git a/ecs/src/util.rs b/ecs/src/util.rs new file mode 100644 index 0000000..f4f8632 --- /dev/null +++ b/ecs/src/util.rs @@ -0,0 +1,48 @@ +pub trait Sortable +{ +    type Item; + +    fn sort_by_key_b<Key, Func>(&mut self, func: Func) +    where +        Func: FnMut(&Self::Item) -> Key, +        Key: Ord; +} + +impl<Item> Sortable for [Item] +{ +    type Item = Item; + +    fn sort_by_key_b<Key, Func>(&mut self, func: Func) +    where +        Func: FnMut(&Self::Item) -> Key, +        Key: Ord, +    { +        self.sort_by_key(func) +    } +} + +impl<Item, const LENGTH: usize> Sortable for [Item; LENGTH] +{ +    type Item = Item; + +    fn sort_by_key_b<Key, Func>(&mut self, func: Func) +    where +        Func: FnMut(&Self::Item) -> Key, +        Key: Ord, +    { +        self.sort_by_key(func) +    } +} + +impl<Item> Sortable for Vec<Item> +{ +    type Item = Item; + +    fn sort_by_key_b<Key, Func>(&mut self, func: Func) +    where +        Func: FnMut(&Self::Item) -> Key, +        Key: Ord, +    { +        self.sort_by_key(func) +    } +} | 
