diff options
Diffstat (limited to 'ecs/src/component')
| -rw-r--r-- | ecs/src/component/storage.rs | 53 | ||||
| -rw-r--r-- | ecs/src/component/storage/archetype.rs | 23 | 
2 files changed, 34 insertions, 42 deletions
| diff --git a/ecs/src/component/storage.rs b/ecs/src/component/storage.rs index 14f3ea4..f5cce57 100644 --- a/ecs/src/component/storage.rs +++ b/ecs/src/component/storage.rs @@ -216,38 +216,35 @@ impl Storage              });          } -        let add_edge_archetype_id = match archetype_node +        let add_edge_archetype_id = if let Some(add_edge_id) = archetype_node              .get_or_insert_edges(component_id, ArchetypeEdges::default)              .add          { -            Some(add_edge_id) => { -                if !self.graph.contains_archetype(add_edge_id) { -                    let (_, add_edge_comp_ids) = self -                        .graph -                        .get_node_by_id(archetype_id) -                        .expect("Archetype should exist") -                        .make_add_edge(component_id); - -                    self.graph.create_node(add_edge_id, &add_edge_comp_ids); -                } - -                add_edge_id -            } -            None => { -                let archetype_node = self +            if !self.graph.contains_archetype(add_edge_id) { +                let (_, add_edge_comp_ids) = self                      .graph                      .get_node_by_id(archetype_id) -                    .expect("Archetype should exist"); +                    .expect("Archetype should exist") +                    .make_add_edge(component_id); -                let (add_edge_id, add_edge_comp_ids) = -                    archetype_node.make_add_edge(component_id); +                self.graph.create_node(add_edge_id, &add_edge_comp_ids); +            } -                if !self.graph.contains_archetype(add_edge_id) { -                    self.graph.create_node(add_edge_id, &add_edge_comp_ids); -                } +            add_edge_id +        } else { +            let archetype_node = self +                .graph +                .get_node_by_id(archetype_id) +                .expect("Archetype should exist"); -                add_edge_id +            let (add_edge_id, add_edge_comp_ids) = +                archetype_node.make_add_edge(component_id); + +            if !self.graph.contains_archetype(add_edge_id) { +                self.graph.create_node(add_edge_id, &add_edge_comp_ids);              } + +            add_edge_id          };          let archetype_node = self @@ -592,8 +589,7 @@ pub struct ArchetypeRefIter<'storage, 'search_terms>      search_terms: ArchetypeSearchTerms<'search_terms>,  } -impl<'component_storage, 'search_terms> Iterator -    for ArchetypeRefIter<'component_storage, 'search_terms> +impl<'component_storage> Iterator for ArchetypeRefIter<'component_storage, '_>  {      type Item = &'component_storage Archetype; @@ -646,10 +642,7 @@ impl<'component_storage, 'search_terms> Iterator                      self.storage.imaginary_archetypes.borrow_mut().push(                          ImaginaryArchetype {                              id: add_edge_archetype_id, -                            component_ids: add_edge_archetype_comps -                                .iter() -                                .map(|comp_id| *comp_id) -                                .collect::<Vec<_>>(), +                            component_ids: add_edge_archetype_comps.clone(),                          },                      ); @@ -663,8 +656,6 @@ impl<'component_storage, 'search_terms> Iterator                          )),                          found.into_iter(),                      )); - -                    continue;                  }                  _ => {                      unreachable!(); diff --git a/ecs/src/component/storage/archetype.rs b/ecs/src/component/storage/archetype.rs index f8c204b..56dd5ae 100644 --- a/ecs/src/component/storage/archetype.rs +++ b/ecs/src/component/storage/archetype.rs @@ -155,7 +155,7 @@ impl Archetype              inner: Either::B(                  [component_id]                      .into_iter() -                    .zip(self.get_index_for_component(component_id).into_iter()), +                    .zip(self.get_index_for_component(component_id)),              ),          }      } @@ -219,19 +219,20 @@ type MatchingComponentIterFilterFn = fn(&((usize, &Uid), Uid)) -> bool;  type MatchingComponentIterMapFn = fn(((usize, &Uid), Uid)) -> (Uid, usize); +type InnerMatchingComponentIterA<'archetype> = Map< +    Filter< +        Zip<Enumerate<SliceIter<'archetype, Uid>>, RepeatN<Uid>>, +        MatchingComponentIterFilterFn, +    >, +    MatchingComponentIterMapFn, +>; + +type InnerMatchingComponentIterB = Zip<ArrayIntoIter<Uid, 1>, OptionIntoIter<usize>>; +  #[derive(Debug)]  pub struct MatchingComponentIter<'archetype>  { -    inner: Either< -        Map< -            Filter< -                Zip<Enumerate<SliceIter<'archetype, Uid>>, RepeatN<Uid>>, -                MatchingComponentIterFilterFn, -            >, -            MatchingComponentIterMapFn, -        >, -        Zip<ArrayIntoIter<Uid, 1>, OptionIntoIter<usize>>, -    >, +    inner: Either<InnerMatchingComponentIterA<'archetype>, InnerMatchingComponentIterB>,  }  impl Iterator for MatchingComponentIter<'_> | 
