#[cfg(test)]
mod test;
use std::{any::TypeId, collections::HashSet, marker::PhantomData};
use crate::{
prelude::{Filter, Query},
query::{QueryFragment, WorldQuery},
};
pub struct QuerySet<Inner> {
world: std::ptr::NonNull<crate::World>,
_m: PhantomData<Inner>,
}
unsafe impl<T> Send for QuerySet<T> {}
unsafe impl<T> Sync for QuerySet<T> {}
macro_rules! impl_tuple {
($($idx: tt , $t: ident , $f: ident , $q: ident , $q_mut: ident , $set: ident);+ $(;)?) => {
impl<'a, $($t, $f),*> QuerySet<($(Query<'a, $t, $f>),*)>
where
$(
$t: QueryFragment,
$f: Filter,
)*
{
$(
pub fn $q<'b>(&'b self) -> Query<'b, $t, $f>
where 'a: 'b
{
unsafe {Query::new(self.world.as_ref())}
}
pub fn $q_mut<'b>(&'b mut self) -> Query<'b, $t, $f>
where 'a: 'b
{
unsafe {Query::new(self.world.as_ref())}
}
)*
}
unsafe impl<'a, $($t, $f),*> WorldQuery<'a> for QuerySet<($(Query<'a, $t, $f>),*)>
where
$(
$t: QueryFragment,
$f: Filter,
)*
{
fn new(db: &'a crate::World, _system_idx: usize) -> Self {
Self {
world: std::ptr::NonNull::from(db),
_m: PhantomData,
}
}
fn exclusive() -> bool {false}
fn read_only() -> bool {
true
$(
&&
<$t as QueryFragment>::read_only()
)*
}
fn components_mut(set: &mut HashSet<TypeId>) {
$(
let mut $set = set.clone();
<$t as QueryFragment>::types_mut(&mut $set);
)*
$(
set.extend($set.into_iter());
)*
}
fn components_const(set: &mut HashSet<TypeId>) {
$(
<$t as QueryFragment>::types_const(set);
)*
let mut mutable_components = HashSet::new();
let mut tmp = HashSet::new();
$(
tmp.clear();
<$t as QueryFragment>::types_mut(&mut tmp);
mutable_components.extend(tmp.drain());
)*
set.retain(|t| !mutable_components.contains(t));
}
}
};
}
impl_tuple!(0 , T0 , F0 , q0 , q0_mut , set0; 1 , T1 , F1 , q1 , q1_mut , set1;);
impl_tuple!(0 , T0 , F0 , q0 , q0_mut , set0; 1 , T1 , F1 , q1 , q1_mut , set1; 2 , T2 , F2 , q2 , q2_mut , set2;);
impl_tuple!(0 , T0 , F0 , q0 , q0_mut , set0; 1 , T1 , F1 , q1 , q1_mut , set1; 2 , T2 , F2 , q2 , q2_mut , set2; 3 , T3 , F3 , q3 , q3_mut , set3;);
impl_tuple!(0 , T0 , F0 , q0 , q0_mut , set0; 1 , T1 , F1 , q1 , q1_mut , set1; 2 , T2 , F2 , q2 , q2_mut , set2; 3 , T3 , F3 , q3 , q3_mut , set3; 4 , T4 , F4 , q4 , q4_mut , set4;);
impl_tuple!(0 , T0 , F0 , q0 , q0_mut , set0; 1 , T1 , F1 , q1 , q1_mut , set1; 2 , T2 , F2 , q2 , q2_mut , set2; 3 , T3 , F3 , q3 , q3_mut , set3; 4 , T4 , F4 , q4 , q4_mut , set4; 5 , T5 , F5 , q5 , q5_mut , set5;);
impl_tuple!(0 , T0 , F0 , q0 , q0_mut , set0; 1 , T1 , F1 , q1 , q1_mut , set1; 2 , T2 , F2 , q2 , q2_mut , set2; 3 , T3 , F3 , q3 , q3_mut , set3; 4 , T4 , F4 , q4 , q4_mut , set4; 5 , T5 , F5 , q5 , q5_mut , set5; 6 , T6 , F6 , q6 , q6_mut , set6;);
impl_tuple!(0 , T0 , F0 , q0 , q0_mut , set0; 1 , T1 , F1 , q1 , q1_mut , set1; 2 , T2 , F2 , q2 , q2_mut , set2; 3 , T3 , F3 , q3 , q3_mut , set3; 4 , T4 , F4 , q4 , q4_mut , set4; 5 , T5 , F5 , q5 , q5_mut , set5; 6 , T6 , F6 , q6 , q6_mut , set6; 7 , T7 , F7 , q7 , q7_mut , set7;);
impl_tuple!(0 , T0 , F0 , q0 , q0_mut , set0; 1 , T1 , F1 , q1 , q1_mut , set1; 2 , T2 , F2 , q2 , q2_mut , set2; 3 , T3 , F3 , q3 , q3_mut , set3; 4 , T4 , F4 , q4 , q4_mut , set4; 5 , T5 , F5 , q5 , q5_mut , set5; 6 , T6 , F6 , q6 , q6_mut , set6; 7 , T7 , F7 , q7 , q7_mut , set7; 8 , T8 , F8 , q8 , q8_mut , set8;);
impl_tuple!(0 , T0 , F0 , q0 , q0_mut , set0; 1 , T1 , F1 , q1 , q1_mut , set1; 2 , T2 , F2 , q2 , q2_mut , set2; 3 , T3 , F3 , q3 , q3_mut , set3; 4 , T4 , F4 , q4 , q4_mut , set4; 5 , T5 , F5 , q5 , q5_mut , set5; 6 , T6 , F6 , q6 , q6_mut , set6; 7 , T7 , F7 , q7 , q7_mut , set7; 8 , T8 , F8 , q8 , q8_mut , set8; 9 , T9 , F9 , q9 , q9_mut , set9;);