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
use crate::{IntoSendStorage, entity::EntitiesStorage, storage::{FastIndexExt, ReadOnlyStorage}, sync::{ReadGuardRef, OrderedIndexGuard}};
use std::{marker, ops::Deref};
use crate::Component;
use crate::Bitmask;
use super::{IterOptionWrapper, OrderedData, SafeIter};
use crate::storage::{HierarchicalStorage, StorageRef, IntoOrderedIter};
use crate::idtree;
pub struct ReadHierarchical<'a, T: Component>{
_marker: marker::PhantomData<&'a T>,
}
pub struct HierarchicalStorageRead<'a, S, BS, T>{
storage: BS,
marker_t: marker::PhantomData<&'a T>,
marker_s: marker::PhantomData<S>,
}
impl<'a, S, BS, T> FastIndexExt for HierarchicalStorageRead<'a, S, BS, T>
where
S: HierarchicalStorage<'a, T> + 'a,
BS: Deref<Target = S>,
T: Component
{
type FastIndex = idtree::NodeId;
type StaticTypeId = T;
fn fast_index(&self, guid: usize) -> idtree::NodeId {
unsafe{ self.storage.ordered_fast_index(guid) }
}
}
impl<'a, 'r, S, BS, T> StorageRef<'r> for HierarchicalStorageRead<'a, S, BS, T>
where
S: HierarchicalStorage<'a,T> + 'a,
BS: Deref<Target = S>,
T: Component
{
type Data = ReadHierarchical<'a, T>;
type Component = idtree::NodeRef<'r, T>;
unsafe fn get_fast_unchecked(&'r mut self, idx: idtree::NodeId) -> idtree::NodeRef<'r, T>{
self.storage.fast_get_node(idx)
}
unsafe fn get_unchecked(&'r mut self, guid: usize) -> idtree::NodeRef<'r, T>{
self.storage.get_node(guid)
}
fn contains(&self, guid: usize) -> bool{
self.storage.contains(guid)
}
}
impl<'a, 'r, S, T> IntoSendStorage<'r> for HierarchicalStorageRead<'a, S, ReadGuardRef<'a, S>, T>
where
'a: 'r,
S: HierarchicalStorage<'a,T> + 'a,
T: Component
{
type SendStorage = HierarchicalStorageRead<'a, S, &'r S, T>;
fn into_send_storage(&'r mut self) -> Self::SendStorage {
HierarchicalStorageRead {
storage: &self.storage,
marker_s: marker::PhantomData,
marker_t: marker::PhantomData,
}
}
}
unsafe impl<'a, S, BS, T> ReadOnlyStorage for HierarchicalStorageRead<'a, S, BS, T>{}
unsafe impl<T: Component> SafeIter<'_> for ReadHierarchical<'_, T>{}
impl<'a, T: Component> OrderedData<'a> for ReadHierarchical<'a,T>
where for<'b> <T as Component>::Storage: HierarchicalStorage<'b,T>,
for<'b> ReadGuardRef<'b, <T as Component>::Storage>: IntoOrderedIter
{
type Iter = IterOptionWrapper<<ReadGuardRef<'a, <T as Component>::Storage> as IntoOrderedIter>::OrderedIter>;
type Components = T;
type ComponentsRef = idtree::NodeRef<'a, T>;
type Storage = HierarchicalStorageRead<'a,
<T as Component>::Storage,
ReadGuardRef<'a, <T as Component>::Storage>,
Self::Components
>;
fn query_mask<E: EntitiesStorage>(entities: &E) -> Bitmask{
Bitmask::has(entities.component_mask::<T>())
}
fn into_iter<E: EntitiesStorage>(entities: &'a E) -> Self::Iter{
IterOptionWrapper{
it: entities.storage::<T>().map(|s| s.into_ordered_iter())
}
}
fn storage<E: EntitiesStorage>(entities: &'a E) -> Option<Self::Storage>{
Some(HierarchicalStorageRead{
storage: entities.storage::<T>()?,
marker_t: marker::PhantomData,
marker_s: marker::PhantomData,
})
}
fn ordered_ids<S: FastIndexExt, E: EntitiesStorage>(entities: &'a E, query_mask: Bitmask, unordered_storage: &S) -> OrderedIndexGuard<'a>{
entities.ordered_entities_for::<T,S>(query_mask, unordered_storage)
}
}