@@ -13,17 +13,14 @@ use super::{QueryFetch, QueryItem, ReadOnlyWorldQuery};
13
13
///
14
14
/// This struct is created by the [`Query::iter`](crate::system::Query::iter) and
15
15
/// [`Query::iter_mut`](crate::system::Query::iter_mut) methods.
16
- pub struct QueryIter < ' w , ' s , Q : WorldQuery , QF : Fetch < ' w , State = Q :: State > , F : WorldQuery > {
16
+ pub struct QueryIter < ' w , ' s , Q : WorldQuery , F : WorldQuery > {
17
17
tables : & ' w Tables ,
18
18
archetypes : & ' w Archetypes ,
19
19
query_state : & ' s QueryState < Q , F > ,
20
- cursor : QueryIterationCursor < ' w , ' s , Q , QF , F > ,
20
+ cursor : QueryIterationCursor < ' w , ' s , Q , F > ,
21
21
}
22
22
23
- impl < ' w , ' s , Q : WorldQuery , QF , F : WorldQuery > QueryIter < ' w , ' s , Q , QF , F >
24
- where
25
- QF : Fetch < ' w , State = Q :: State > ,
26
- {
23
+ impl < ' w , ' s , Q : WorldQuery , F : WorldQuery > QueryIter < ' w , ' s , Q , F > {
27
24
/// # Safety
28
25
/// This does not check for mutable query correctness. To be safe, make sure mutable queries
29
26
/// have unique access to the components they query.
44
41
}
45
42
}
46
43
47
- impl < ' w , ' s , Q : WorldQuery , QF , F : WorldQuery > Iterator for QueryIter < ' w , ' s , Q , QF , F >
48
- where
49
- QF : Fetch < ' w , State = Q :: State > ,
50
- {
51
- type Item = QF :: Item ;
44
+ impl < ' w , ' s , Q : WorldQuery , F : WorldQuery > Iterator for QueryIter < ' w , ' s , Q , F > {
45
+ type Item = QueryItem < ' w , Q > ;
52
46
53
47
#[ inline( always) ]
54
48
fn next ( & mut self ) -> Option < Self :: Item > {
@@ -69,42 +63,32 @@ where
69
63
. map ( |id| self . archetypes [ * id] . len ( ) )
70
64
. sum ( ) ;
71
65
72
- let archetype_query = F :: Fetch :: IS_ARCHETYPAL && QF :: IS_ARCHETYPAL ;
66
+ let archetype_query = Q :: Fetch :: IS_ARCHETYPAL && F :: Fetch :: IS_ARCHETYPAL ;
73
67
let min_size = if archetype_query { max_size } else { 0 } ;
74
68
( min_size, Some ( max_size) )
75
69
}
76
70
}
77
71
78
72
// This is correct as [`QueryIter`] always returns `None` once exhausted.
79
- impl < ' w , ' s , Q : WorldQuery , QF , F : WorldQuery > FusedIterator for QueryIter < ' w , ' s , Q , QF , F > where
80
- QF : Fetch < ' w , State = Q :: State >
81
- {
82
- }
73
+ impl < ' w , ' s , Q : WorldQuery , F : WorldQuery > FusedIterator for QueryIter < ' w , ' s , Q , F > { }
83
74
84
75
/// An [`Iterator`] over query results of a [`Query`](crate::system::Query).
85
76
///
86
77
/// This struct is created by the [`Query::iter_many`](crate::system::Query::iter_many) method.
87
- pub struct QueryManyIter <
88
- ' w ,
89
- ' s ,
90
- Q : WorldQuery ,
91
- QF : Fetch < ' w , State = Q :: State > ,
92
- F : WorldQuery ,
93
- I : Iterator ,
94
- > where
78
+ pub struct QueryManyIter < ' w , ' s , Q : WorldQuery , F : WorldQuery , I : Iterator >
79
+ where
95
80
I :: Item : Borrow < Entity > ,
96
81
{
97
82
entity_iter : I ,
98
83
entities : & ' w Entities ,
99
84
tables : & ' w Tables ,
100
85
archetypes : & ' w Archetypes ,
101
- fetch : QF ,
86
+ fetch : QueryFetch < ' w , Q > ,
102
87
filter : QueryFetch < ' w , F > ,
103
88
query_state : & ' s QueryState < Q , F > ,
104
89
}
105
90
106
- impl < ' w , ' s , Q : WorldQuery , QF : Fetch < ' w , State = Q :: State > , F : WorldQuery , I : Iterator >
107
- QueryManyIter < ' w , ' s , Q , QF , F , I >
91
+ impl < ' w , ' s , Q : WorldQuery , F : WorldQuery , I : Iterator > QueryManyIter < ' w , ' s , Q , F , I >
108
92
where
109
93
I :: Item : Borrow < Entity > ,
110
94
{
@@ -119,14 +103,14 @@ where
119
103
entity_list : EntityList ,
120
104
last_change_tick : u32 ,
121
105
change_tick : u32 ,
122
- ) -> QueryManyIter < ' w , ' s , Q , QF , F , I > {
123
- let fetch = QF :: init (
106
+ ) -> QueryManyIter < ' w , ' s , Q , F , I > {
107
+ let fetch = Q :: Fetch :: init (
124
108
world,
125
109
& query_state. fetch_state ,
126
110
last_change_tick,
127
111
change_tick,
128
112
) ;
129
- let filter = QueryFetch :: < F > :: init (
113
+ let filter = F :: Fetch :: init (
130
114
world,
131
115
& query_state. filter_state ,
132
116
last_change_tick,
@@ -144,12 +128,11 @@ where
144
128
}
145
129
}
146
130
147
- impl < ' w , ' s , Q : WorldQuery , QF : Fetch < ' w , State = Q :: State > , F : WorldQuery , I : Iterator > Iterator
148
- for QueryManyIter < ' w , ' s , Q , QF , F , I >
131
+ impl < ' w , ' s , Q : WorldQuery , F : WorldQuery , I : Iterator > Iterator for QueryManyIter < ' w , ' s , Q , F , I >
149
132
where
150
133
I :: Item : Borrow < Entity > ,
151
134
{
152
- type Item = QF :: Item ;
135
+ type Item = QueryItem < ' w , Q > ;
153
136
154
137
#[ inline( always) ]
155
138
fn next ( & mut self ) -> Option < Self :: Item > {
@@ -201,7 +184,7 @@ pub struct QueryCombinationIter<'w, 's, Q: WorldQuery, F: WorldQuery, const K: u
201
184
tables : & ' w Tables ,
202
185
archetypes : & ' w Archetypes ,
203
186
query_state : & ' s QueryState < Q , F > ,
204
- cursors : [ QueryIterationCursor < ' w , ' s , Q , QueryFetch < ' w , Q > , F > ; K ] ,
187
+ cursors : [ QueryIterationCursor < ' w , ' s , Q , F > ; K ] ,
205
188
}
206
189
207
190
impl < ' w , ' s , Q : WorldQuery , F : WorldQuery , const K : usize > QueryCombinationIter < ' w , ' s , Q , F , K > {
@@ -219,11 +202,10 @@ impl<'w, 's, Q: WorldQuery, F: WorldQuery, const K: usize> QueryCombinationIter<
219
202
// Initialize array with cursors.
220
203
// There is no FromIterator on arrays, so instead initialize it manually with MaybeUninit
221
204
222
- let mut array: MaybeUninit < [ QueryIterationCursor < ' w , ' s , Q , QueryFetch < ' w , Q > , F > ; K ] > =
223
- MaybeUninit :: uninit ( ) ;
205
+ let mut array: MaybeUninit < [ QueryIterationCursor < ' w , ' s , Q , F > ; K ] > = MaybeUninit :: uninit ( ) ;
224
206
let ptr = array
225
207
. as_mut_ptr ( )
226
- . cast :: < QueryIterationCursor < ' w , ' s , Q , QueryFetch < ' w , Q > , F > > ( ) ;
208
+ . cast :: < QueryIterationCursor < ' w , ' s , Q , F > > ( ) ;
227
209
if K != 0 {
228
210
ptr. write ( QueryIterationCursor :: init (
229
211
world,
@@ -367,10 +349,9 @@ where
367
349
}
368
350
}
369
351
370
- impl < ' w , ' s , Q : WorldQuery , QF , F > ExactSizeIterator for QueryIter < ' w , ' s , Q , QF , F >
352
+ impl < ' w , ' s , Q : WorldQuery , F : WorldQuery > ExactSizeIterator for QueryIter < ' w , ' s , Q , F >
371
353
where
372
- QF : Fetch < ' w , State = Q :: State > ,
373
- F : WorldQuery + ArchetypeFilter ,
354
+ F : ArchetypeFilter ,
374
355
{
375
356
fn len ( & self ) -> usize {
376
357
self . query_state
@@ -405,21 +386,21 @@ where
405
386
{
406
387
}
407
388
408
- struct QueryIterationCursor < ' w , ' s , Q : WorldQuery , QF : Fetch < ' w , State = Q :: State > , F : WorldQuery > {
389
+ struct QueryIterationCursor < ' w , ' s , Q : WorldQuery , F : WorldQuery > {
409
390
table_id_iter : std:: slice:: Iter < ' s , TableId > ,
410
391
archetype_id_iter : std:: slice:: Iter < ' s , ArchetypeId > ,
411
- fetch : QF ,
392
+ fetch : QueryFetch < ' w , Q > ,
412
393
filter : QueryFetch < ' w , F > ,
413
394
// length of the table table or length of the archetype, depending on whether both `Q`'s and `F`'s fetches are dense
414
395
current_len : usize ,
415
396
// either table row or archetype index, depending on whether both `Q`'s and `F`'s fetches are dense
416
397
current_index : usize ,
417
- phantom : PhantomData < ( & ' w ( ) , Q ) > ,
398
+ phantom : PhantomData < Q > ,
418
399
}
419
400
420
- impl < ' w , ' s , Q : WorldQuery , QF , F : WorldQuery > Clone for QueryIterationCursor < ' w , ' s , Q , QF , F >
401
+ impl < ' w , ' s , Q : WorldQuery , F : WorldQuery > Clone for QueryIterationCursor < ' w , ' s , Q , F >
421
402
where
422
- QF : Fetch < ' w , State = Q :: State > + Clone ,
403
+ QueryFetch < ' w , Q > : Clone ,
423
404
QueryFetch < ' w , F > : Clone ,
424
405
{
425
406
fn clone ( & self ) -> Self {
@@ -435,11 +416,8 @@ where
435
416
}
436
417
}
437
418
438
- impl < ' w , ' s , Q : WorldQuery , QF , F : WorldQuery > QueryIterationCursor < ' w , ' s , Q , QF , F >
439
- where
440
- QF : Fetch < ' w , State = Q :: State > ,
441
- {
442
- const IS_DENSE : bool = QF :: IS_DENSE && <QueryFetch < ' static , F > >:: IS_DENSE ;
419
+ impl < ' w , ' s , Q : WorldQuery , F : WorldQuery > QueryIterationCursor < ' w , ' s , Q , F > {
420
+ const IS_DENSE : bool = Q :: Fetch :: IS_DENSE && F :: Fetch :: IS_DENSE ;
443
421
444
422
unsafe fn init_empty (
445
423
world : & ' w World ,
@@ -460,13 +438,13 @@ where
460
438
last_change_tick : u32 ,
461
439
change_tick : u32 ,
462
440
) -> Self {
463
- let fetch = QF :: init (
441
+ let fetch = Q :: Fetch :: init (
464
442
world,
465
443
& query_state. fetch_state ,
466
444
last_change_tick,
467
445
change_tick,
468
446
) ;
469
- let filter = QueryFetch :: < F > :: init (
447
+ let filter = F :: Fetch :: init (
470
448
world,
471
449
& query_state. filter_state ,
472
450
last_change_tick,
@@ -485,7 +463,7 @@ where
485
463
486
464
/// retrieve item returned from most recent `next` call again.
487
465
#[ inline]
488
- unsafe fn peek_last ( & mut self ) -> Option < QF :: Item > {
466
+ unsafe fn peek_last ( & mut self ) -> Option < QueryItem < ' w , Q > > {
489
467
if self . current_index > 0 {
490
468
if Self :: IS_DENSE {
491
469
Some ( self . fetch . table_fetch ( self . current_index - 1 ) )
@@ -509,7 +487,7 @@ where
509
487
tables : & ' w Tables ,
510
488
archetypes : & ' w Archetypes ,
511
489
query_state : & ' s QueryState < Q , F > ,
512
- ) -> Option < QF :: Item > {
490
+ ) -> Option < QueryItem < ' w , Q > > {
513
491
if Self :: IS_DENSE {
514
492
loop {
515
493
// we are on the beginning of the query, or finished processing a table, so skip to the next
0 commit comments