2
2
3
3
use std:: { any:: TypeId , cell:: Cell , ops:: Deref } ;
4
4
5
- use crate :: { Component , Components , Ecs , SparseSetRef , SparseSetStorage } ;
5
+ use crate :: { storage :: sparse_set , Component , Components , Ecs , SparseSetRef , SparseSetStorage } ;
6
6
7
7
/// Drives a query by yielding the entities
8
8
/// whose components satisfy the query parameters.
9
- pub struct QueryDriver < ' a > {
9
+ pub struct QueryDriver < ' w , ' q > {
10
10
/// A sparse set for each component in the query.
11
- sparse_sets : & ' a [ SparseSetRef < ' a > ] ,
11
+ sparse_sets : & ' q [ SparseSetRef < ' w > ] ,
12
12
13
13
/// The "lead" sparse set, chosen as the set with
14
14
/// the smallest number of components.
15
- lead : SparseSetRef < ' a > ,
15
+ lead : SparseSetRef < ' q > ,
16
16
17
17
/// Used as the yielded value for the iterator.
18
18
/// (We can't own this because of the lack of GATs.)
19
- dense_indices : & ' a [ Cell < u32 > ] ,
19
+ dense_indices : & ' q [ Cell < u32 > ] ,
20
20
}
21
21
22
- impl < ' a > QueryDriver < ' a > {
22
+ impl < ' w , ' q > QueryDriver < ' w , ' q > {
23
23
/// Creates a new `QueryDriver` given the sparse sets
24
24
/// whose components are required by the query.
25
25
///
26
26
/// `dense_indices` should be a zeroed slice of size `sparse_sets.len()`.
27
27
///
28
28
/// # Panics
29
29
/// Panics if `sparse_sets.len() != dense_indices.len()`.
30
- pub fn new ( sparse_sets : & ' a [ SparseSetRef < ' a > ] , dense_indices : & ' a [ Cell < u32 > ] ) -> Self {
30
+ pub fn new ( sparse_sets : & ' q [ SparseSetRef < ' w > ] , dense_indices : & ' q [ Cell < u32 > ] ) -> Self {
31
31
let lead = sparse_sets
32
32
. iter ( )
33
33
. min_by_key ( |set| set. len ( ) )
@@ -45,49 +45,69 @@ impl<'a> QueryDriver<'a> {
45
45
self . sparse_sets . len ( )
46
46
}
47
47
48
- /// Iterates over all `QueryItem`s yielded by the query.
49
- pub fn iter ( & mut self ) -> impl Iterator < Item = QueryItem < ' a > > + ' _ {
50
- let Self {
51
- lead,
52
- dense_indices,
53
- sparse_sets,
54
- } = self ;
55
- lead. iter ( )
56
- . filter_map ( move |( entity_index, dense_in_lead) | {
57
- for ( i, ( index, sparse_set) ) in
58
- dense_indices. iter ( ) . zip ( sparse_sets. iter ( ) ) . enumerate ( )
59
- {
60
- index. set ( sparse_set. dense_index_of ( entity_index) ?) ;
61
- }
62
-
63
- Some ( QueryItem {
64
- sparse_index : entity_index,
65
- dense_indices,
66
- } )
67
- } )
48
+ /// Iterates over dense and sparse indices matching the query.
49
+ pub fn iter ( & ' q mut self ) -> QueryDriverIter < ' w , ' q > {
50
+ QueryDriverIter {
51
+ lead_iter : self . lead . iter ( ) ,
52
+ driver : self ,
53
+ }
54
+ }
55
+ }
56
+
57
+ /// An iterator for a QueryDriver.
58
+ pub struct QueryDriverIter < ' w , ' q > {
59
+ driver : & ' q mut QueryDriver < ' w , ' q > ,
60
+ lead_iter : sparse_set:: Iter < ' q > ,
61
+ }
62
+
63
+ impl < ' w , ' q > Iterator for QueryDriverIter < ' w , ' q > {
64
+ type Item = QueryItem < ' q > ;
65
+
66
+ fn next ( & mut self ) -> Option < Self :: Item > {
67
+ loop {
68
+ let ( sparse_index, lead_dense_index) = self . lead_iter . next ( ) ?;
69
+
70
+ for ( dense_index, sparse_set) in self
71
+ . driver
72
+ . dense_indices
73
+ . iter ( )
74
+ . zip ( self . driver . sparse_sets . iter ( ) )
75
+ {
76
+ dense_index. set ( match sparse_set. dense_index_of ( sparse_index) {
77
+ Some ( d) => d,
78
+ None => continue ,
79
+ } ) ;
80
+ }
81
+
82
+ break Some ( QueryItem {
83
+ dense_indices : & self . driver . dense_indices ,
84
+ sparse_index,
85
+ } ) ;
86
+ }
68
87
}
69
88
}
70
89
71
90
/// An item yielded by a query.
72
- pub struct QueryItem < ' a > {
91
+ pub struct QueryItem < ' q > {
73
92
/// The `dense` index into the sparse set
74
93
/// of each component in the query.
75
- pub dense_indices : & ' a [ Cell < u32 > ] ,
94
+ pub dense_indices : & ' q [ Cell < u32 > ] ,
76
95
/// The sparse (entity) index of this item.
77
96
pub sparse_index : u32 ,
78
97
}
79
98
80
99
// -- Static queries
81
100
101
+ /*
82
102
/// A typed query element.
83
103
pub trait QueryParameter {
84
- type Output < ' a > ;
104
+ type Output;
85
105
type Component: Component;
86
106
87
107
unsafe fn get_unchecked_by_dense_index(
88
108
storage: &SparseSetStorage,
89
109
dense_index: u32,
90
- ) -> Self :: Output < ' _ > ;
110
+ ) -> Self::Output;
91
111
}
92
112
93
113
impl<'a, T> QueryParameter for &'a T
@@ -159,3 +179,4 @@ macro_rules! query_tuple_impl {
159
179
}
160
180
161
181
query_tuple_impl!(1, (T1, 0));
182
+ */
0 commit comments