edict/query/
entities.rs

1use core::any::TypeId;
2
3use crate::{
4    archetype::Archetype,
5    component::ComponentInfo,
6    entity::{EntityId, EntityLoc, Location},
7    system::QueryArg,
8};
9
10use super::{
11    Access, AsQuery, DefaultQuery, Fetch, ImmutableQuery, IntoQuery, Query, SendQuery, WriteAlias,
12};
13
14/// [`Fetch`] type for the [`Entities`] query.
15pub struct EntitiesFetch<'a> {
16    archetype: u32,
17    entities: &'a [EntityId],
18}
19
20unsafe impl<'a> Fetch<'a> for EntitiesFetch<'a> {
21    type Item = EntityLoc<'a>;
22
23    #[inline(always)]
24    fn dangling() -> Self {
25        EntitiesFetch {
26            archetype: u32::MAX,
27            entities: &[],
28        }
29    }
30
31    #[inline(always)]
32    unsafe fn get_item(&mut self, idx: u32) -> EntityLoc<'a> {
33        let id = *self.entities.get_unchecked(idx as usize);
34        EntityLoc::from_parts(id, Location::new(self.archetype, idx))
35    }
36}
37
38marker_type! {
39    /// Queries entity ids.
40    pub struct Entities;
41}
42
43impl AsQuery for Entities {
44    type Query = Self;
45}
46
47impl IntoQuery for Entities {
48    #[inline(always)]
49    fn into_query(self) -> Self {
50        self
51    }
52}
53
54impl DefaultQuery for Entities {
55    #[inline(always)]
56    fn default_query() -> Self {
57        Entities
58    }
59}
60
61impl QueryArg for Entities {
62    #[inline(always)]
63    fn new() -> Self {
64        Entities
65    }
66}
67
68unsafe impl Query for Entities {
69    type Fetch<'a> = EntitiesFetch<'a>;
70    type Item<'a> = EntityLoc<'a>;
71
72    const MUTABLE: bool = false;
73
74    #[inline(always)]
75    fn component_access(&self, _comp: &ComponentInfo) -> Result<Option<Access>, WriteAlias> {
76        Ok(None)
77    }
78
79    #[inline(always)]
80    fn visit_archetype(&self, _archetype: &Archetype) -> bool {
81        true
82    }
83
84    #[inline(always)]
85    unsafe fn access_archetype(&self, _archetype: &Archetype, _f: impl FnMut(TypeId, Access)) {}
86
87    #[inline(always)]
88    unsafe fn fetch<'a>(
89        &self,
90        arch_idx: u32,
91        archetype: &'a Archetype,
92        _epoch: crate::epoch::EpochId,
93    ) -> EntitiesFetch<'a> {
94        EntitiesFetch {
95            archetype: arch_idx,
96            entities: archetype.entities(),
97        }
98    }
99
100    #[inline(always)]
101    fn reserved_entity_item<'a>(&self, id: EntityId, idx: u32) -> Option<EntityLoc<'a>>
102    where
103        EntityId: 'a,
104    {
105        Some(EntityLoc::from_parts(id, Location::reserved(idx)))
106    }
107}
108
109unsafe impl ImmutableQuery for Entities {}
110unsafe impl SendQuery for Entities {}