Skip to content

Commit f81208a

Browse files
authored
impl ReadOnlyFetch for Or, FetchOr, and FetchMutated (#763)
1 parent 5cd67f7 commit f81208a

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

crates/bevy_ecs/hecs/src/query.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,9 @@ macro_rules! impl_or_query {
263263
true $( && $T.should_skip(n) )+
264264
}
265265
}
266+
267+
unsafe impl<$( $T: ReadOnlyFetch ),+> ReadOnlyFetch for Or<($( $T ),+)> {}
268+
unsafe impl<$( $T: ReadOnlyFetch ),+> ReadOnlyFetch for FetchOr<($( $T ),+)> {}
266269
};
267270
}
268271

@@ -320,6 +323,7 @@ impl<'a, T: Component> Query for Mutated<'a, T> {
320323

321324
#[doc(hidden)]
322325
pub struct FetchMutated<T>(NonNull<T>, NonNull<bool>);
326+
unsafe impl<T> ReadOnlyFetch for FetchMutated<T> {}
323327

324328
impl<'a, T: Component> Fetch<'a> for FetchMutated<T> {
325329
type Item = Mutated<'a, T>;

crates/bevy_ecs/src/system/into_system.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,43 @@ mod tests {
489489
assert!(*resources.get::<bool>().unwrap(), "system ran");
490490
}
491491

492+
#[test]
493+
fn or_query_set_system() {
494+
// Regression test for issue #762
495+
use crate::{Added, Changed, Mutated, Or};
496+
fn query_system(
497+
mut ran: ResMut<bool>,
498+
set: QuerySet<(
499+
Query<Or<(Changed<A>, Changed<B>)>>,
500+
Query<Or<(Added<A>, Added<B>)>>,
501+
Query<Or<(Mutated<A>, Mutated<B>)>>,
502+
)>,
503+
) {
504+
let changed = set.q0().iter().count();
505+
let added = set.q1().iter().count();
506+
let mutated = set.q2().iter().count();
507+
508+
assert_eq!(changed, 1);
509+
assert_eq!(added, 1);
510+
assert_eq!(mutated, 0);
511+
512+
*ran = true;
513+
}
514+
515+
let mut world = World::default();
516+
let mut resources = Resources::default();
517+
resources.insert(false);
518+
world.spawn((A, B));
519+
520+
let mut schedule = Schedule::default();
521+
schedule.add_stage("update");
522+
schedule.add_system_to_stage("update", query_system.system());
523+
524+
schedule.run(&mut world, &mut resources);
525+
526+
assert!(*resources.get::<bool>().unwrap(), "system ran");
527+
}
528+
492529
#[test]
493530
fn changed_resource_system() {
494531
fn incr_e_on_flip(_run_on_flip: ChangedRes<bool>, mut i: Mut<i32>) {

0 commit comments

Comments
 (0)