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
14pub 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 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 {}