pub mod task;
mod claim;
mod scheduler;
mod sealed;
mod sendable;
mod stage;
mod stager;
mod stages;
pub(crate) use stages::Stages;
use crate::{
doc,
registry,
resource,
};
use scheduler::Scheduler;
use sealed::Sealed;
use stage::Stage;
use stager::Stager;
use task::Task;
pub trait Schedule<'a, Registry, Resources, Indices>:
Sealed<'a, Registry, Resources, Indices>
where
Registry: registry::Registry,
Resources: resource::Resources,
{
}
impl<'a, T, Registry, Resources, Indices> Schedule<'a, Registry, Resources, Indices> for T
where
Registry: registry::Registry,
Resources: resource::Resources,
T: Sealed<'a, Registry, Resources, Indices>,
{
}
doc::non_root_macro! {
macro_rules! schedule {
($task:expr $(,$tasks:expr)* $(,)?) => (
($task, $crate::system::schedule::schedule!($($tasks,)*))
);
() => (
$crate::system::schedule::task::Null
);
}
}
pub(crate) mod inner {
use crate::doc;
doc::non_root_macro! {
macro_rules! Schedule {
($task:ty $(,$tasks:ty)* $(,)?) => (
($task, $crate::system::schedule::Schedule!($($tasks,)*))
);
() => (
$crate::system::schedule::task::Null
);
}
}
}
pub use inner::Schedule;
#[cfg(test)]
mod tests {
use super::Sealed as Schedule;
use crate::{
entity,
query::{
filter,
Result,
Views,
},
registry,
system::{
schedule::{
stage,
stages,
task,
},
ParSystem,
System,
},
Registry,
Resources,
};
use core::any::TypeId;
use rayon::iter::ParallelIterator;
struct A;
struct B;
struct C;
struct D;
struct E;
type Registry = Registry!(A, B, C, D, E);
#[test]
fn null() {
assert_eq!(
TypeId::of::<<task::Null as Schedule<'_, Registry, Resources!(), _>>::Stages>(),
TypeId::of::<stages::Null>()
);
}
#[test]
fn null_resources() {
assert_eq!(
TypeId::of::<
<task::Null as Schedule<'_, Registry!(), Resources!(A, B, C, D, E), _>>::Stages,
>(),
TypeId::of::<stages::Null>()
);
}
#[test]
fn null_components_and_resources() {
assert_eq!(
TypeId::of::<
<task::Null as Schedule<'_, Registry, Resources!(A, B, C, D, E), _>>::Stages,
>(),
TypeId::of::<stages::Null>()
);
}
#[test]
fn single_system_immut_a() {
struct ImmutA;
impl System for ImmutA {
type Views<'a> = Views!(&'a A);
type Filter = filter::None;
type ResourceViews<'a> = Views!();
type EntryViews<'a> = Views!();
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: Iterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
assert_eq!(
TypeId::of::<
<(task::System<ImmutA>, task::Null) as Schedule<
'_,
Registry,
Resources!(),
_
>>::Stages,
>(),
TypeId::of::<((&mut task::System<ImmutA>, stage::Null), stages::Null)>()
);
}
#[test]
fn single_system_mut_a() {
struct MutA;
impl System for MutA {
type Views<'a> = Views!(&'a mut A);
type Filter = filter::None;
type ResourceViews<'a> = Views!();
type EntryViews<'a> = Views!();
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: Iterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
assert_eq!(
TypeId::of::<
<(task::System<MutA>, task::Null) as Schedule<
'_,
Registry,
Resources!(),
_
>>::Stages,
>(),
TypeId::of::<((&mut task::System<MutA>, stage::Null), stages::Null)>()
);
}
#[test]
fn single_system_option_immut_a() {
struct OptionImmutA;
impl System for OptionImmutA {
type Views<'a> = Views!(Option<&'a A>);
type Filter = filter::None;
type ResourceViews<'a> = Views!();
type EntryViews<'a> = Views!();
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: Iterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
assert_eq!(
TypeId::of::<
<(task::System<OptionImmutA>, task::Null) as Schedule<
'_,
Registry,
Resources!(),
_,
>>::Stages,
>(),
TypeId::of::<((&mut task::System<OptionImmutA>, stage::Null), stages::Null)>()
);
}
#[test]
fn single_system_option_mut_a() {
struct OptionMutA;
impl System for OptionMutA {
type Views<'a> = Views!(Option<&'a mut A>);
type Filter = filter::None;
type ResourceViews<'a> = Views!();
type EntryViews<'a> = Views!();
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: Iterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
assert_eq!(
TypeId::of::<
<(task::System<OptionMutA>, task::Null) as Schedule<
'_,
Registry,
Resources!(),
_,
>>::Stages,
>(),
TypeId::of::<((&mut task::System<OptionMutA>, stage::Null), stages::Null)>()
);
}
#[test]
fn single_system_entity_identifier() {
struct EntityIdentifier;
impl System for EntityIdentifier {
type Views<'a> = Views!(entity::Identifier);
type Filter = filter::None;
type ResourceViews<'a> = Views!();
type EntryViews<'a> = Views!();
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: Iterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
assert_eq!(
TypeId::of::<
<(task::System<EntityIdentifier>, task::Null) as Schedule<
'_,
Registry,
Resources!(),
_,
>>::Stages,
>(),
TypeId::of::<(
(&mut task::System<EntityIdentifier>, stage::Null),
stages::Null
)>()
);
}
#[test]
fn single_par_system_immut_a() {
struct ImmutA;
impl ParSystem for ImmutA {
type Views<'a> = Views!(&'a A);
type Filter = filter::None;
type ResourceViews<'a> = Views!();
type EntryViews<'a> = Views!();
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: ParallelIterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
assert_eq!(
TypeId::of::<
<(task::ParSystem<ImmutA>, task::Null) as Schedule<
'_,
Registry,
Resources!(),
_,
>>::Stages,
>(),
TypeId::of::<((&mut task::ParSystem<ImmutA>, stage::Null), stages::Null)>()
);
}
#[test]
fn single_par_system_mut_a() {
struct MutA;
impl ParSystem for MutA {
type Views<'a> = Views!(&'a mut A);
type Filter = filter::None;
type ResourceViews<'a> = Views!();
type EntryViews<'a> = Views!();
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: ParallelIterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
assert_eq!(
TypeId::of::<
<(task::ParSystem<MutA>, task::Null) as Schedule<
'_,
Registry,
Resources!(),
_
>>::Stages,
>(),
TypeId::of::<((&mut task::ParSystem<MutA>, stage::Null), stages::Null)>()
);
}
#[test]
fn single_par_system_option_immut_a() {
struct OptionImmutA;
impl ParSystem for OptionImmutA {
type Views<'a> = Views!(Option<&'a A>);
type Filter = filter::None;
type ResourceViews<'a> = Views!();
type EntryViews<'a> = Views!();
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: ParallelIterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
assert_eq!(
TypeId::of::<
<(task::ParSystem<OptionImmutA>, task::Null) as Schedule<
'_,
Registry,
Resources!(),
_,
>>::Stages,
>(),
TypeId::of::<(
(&mut task::ParSystem<OptionImmutA>, stage::Null),
stages::Null
)>()
);
}
#[test]
fn single_par_system_option_mut_a() {
struct OptionMutA;
impl ParSystem for OptionMutA {
type Views<'a> = Views!(Option<&'a mut A>);
type Filter = filter::None;
type ResourceViews<'a> = Views!();
type EntryViews<'a> = Views!();
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: ParallelIterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
assert_eq!(
TypeId::of::<
<(task::ParSystem<OptionMutA>, task::Null) as Schedule<
'_,
Registry,
Resources!(),
_,
>>::Stages,
>(),
TypeId::of::<(
(&mut task::ParSystem<OptionMutA>, stage::Null),
stages::Null
)>()
);
}
#[test]
fn single_par_system_entity_identifier() {
struct EntityIdentifier;
impl ParSystem for EntityIdentifier {
type Views<'a> = Views!(entity::Identifier);
type Filter = filter::None;
type ResourceViews<'a> = Views!();
type EntryViews<'a> = Views!();
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: ParallelIterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
assert_eq!(
TypeId::of::<
<(task::ParSystem<EntityIdentifier>, task::Null) as Schedule<
'_,
Registry,
Resources!(),
_,
>>::Stages,
>(),
TypeId::of::<(
(&mut task::ParSystem<EntityIdentifier>, stage::Null),
stages::Null
)>()
);
}
#[test]
fn multiple_stages() {
struct AB;
impl System for AB {
type Views<'a> = Views!(&'a mut A, &'a mut B);
type Filter = filter::None;
type ResourceViews<'a> = Views!();
type EntryViews<'a> = Views!();
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: Iterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
struct CD;
impl System for CD {
type Views<'a> = Views!(&'a mut C, &'a mut D);
type Filter = filter::None;
type ResourceViews<'a> = Views!();
type EntryViews<'a> = Views!();
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: Iterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
struct CE;
impl System for CE {
type Views<'a> = Views!(&'a mut C, &'a mut E);
type Filter = filter::None;
type ResourceViews<'a> = Views!();
type EntryViews<'a> = Views!();
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: Iterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
assert_eq!(
TypeId::of::<
<(
task::System<AB>,
(task::System<CD>, (task::System<CE>, task::Null))
) as Schedule<'_, Registry, Resources!(), _>>::Stages,
>(),
TypeId::of::<(
(&mut task::System<AB>, (&mut task::System<CD>, stage::Null)),
((&mut task::System<CE>, stage::Null), stages::Null)
)>()
);
}
#[test]
fn resources_single_stage() {
struct Foo;
impl System for Foo {
type Views<'a> = Views!();
type Filter = filter::None;
type ResourceViews<'a> = Views!(&'a A);
type EntryViews<'a> = Views!();
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: Iterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
struct Bar;
impl ParSystem for Bar {
type Views<'a> = Views!();
type Filter = filter::None;
type ResourceViews<'a> = Views!(&'a A, &'a B);
type EntryViews<'a> = Views!();
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: ParallelIterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
assert_eq!(
TypeId::of::<
<(task::System<Foo>, (task::ParSystem<Bar>, task::Null)) as Schedule<
'_,
Registry!(),
Resources!(A, B),
_,
>>::Stages,
>(),
TypeId::of::<(
(
&mut task::System<Foo>,
(&mut task::ParSystem<Bar>, stage::Null)
),
stages::Null
)>()
);
}
#[test]
fn resources_multiple_stage() {
struct Foo;
impl System for Foo {
type Views<'a> = Views!();
type Filter = filter::None;
type ResourceViews<'a> = Views!(&'a mut A);
type EntryViews<'a> = Views!();
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: Iterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
struct Bar;
impl ParSystem for Bar {
type Views<'a> = Views!();
type Filter = filter::None;
type ResourceViews<'a> = Views!(&'a mut A, &'a B);
type EntryViews<'a> = Views!();
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: ParallelIterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
struct Baz;
impl System for Baz {
type Views<'a> = Views!();
type Filter = filter::None;
type ResourceViews<'a> = Views!(&'a mut B, &'a C);
type EntryViews<'a> = Views!();
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: Iterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
assert_eq!(
TypeId::of::<
<(
task::System<Foo>,
(task::ParSystem<Bar>, (task::System<Baz>, task::Null))
) as Schedule<'_, Registry!(), Resources!(A, B, C), _>>::Stages,
>(),
TypeId::of::<(
(&mut task::System<Foo>, stage::Null),
(
(&mut task::ParSystem<Bar>, stage::Null),
((&mut task::System<Baz>, stage::Null), stages::Null)
)
)>()
);
}
#[test]
fn entry_views_single_stage() {
struct Foo;
impl System for Foo {
type Views<'a> = Views!();
type Filter = filter::None;
type ResourceViews<'a> = Views!();
type EntryViews<'a> = Views!(&'a A);
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: Iterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
struct Bar;
impl ParSystem for Bar {
type Views<'a> = Views!();
type Filter = filter::None;
type ResourceViews<'a> = Views!();
type EntryViews<'a> = Views!(&'a A, &'a B);
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: ParallelIterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
assert_eq!(
TypeId::of::<
<(task::System<Foo>, (task::ParSystem<Bar>, task::Null)) as Schedule<
'_,
Registry,
Resources!(),
_,
>>::Stages,
>(),
TypeId::of::<(
(
&mut task::System<Foo>,
(&mut task::ParSystem<Bar>, stage::Null)
),
stages::Null
)>()
);
}
#[test]
fn entry_views_multiple_stages() {
struct Foo;
impl System for Foo {
type Views<'a> = Views!();
type Filter = filter::None;
type ResourceViews<'a> = Views!();
type EntryViews<'a> = Views!(&'a A);
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: Iterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
struct Bar;
impl ParSystem for Bar {
type Views<'a> = Views!();
type Filter = filter::None;
type ResourceViews<'a> = Views!();
type EntryViews<'a> = Views!(&'a mut A, &'a B);
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: ParallelIterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
assert_eq!(
TypeId::of::<
<(task::System<Foo>, (task::ParSystem<Bar>, task::Null)) as Schedule<
'_,
Registry,
Resources!(),
_,
>>::Stages,
>(),
TypeId::of::<(
(&mut task::System<Foo>, stage::Null),
((&mut task::ParSystem<Bar>, stage::Null), stages::Null)
)>()
);
}
#[test]
fn entry_views_single_stage_with_component_views() {
struct Foo;
impl System for Foo {
type Views<'a> = Views!(&'a A, &'a mut B);
type Filter = filter::None;
type ResourceViews<'a> = Views!();
type EntryViews<'a> = Views!(&'a A);
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: Iterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
struct Bar;
impl ParSystem for Bar {
type Views<'a> = Views!(&'a C, &'a mut D);
type Filter = filter::None;
type ResourceViews<'a> = Views!();
type EntryViews<'a> = Views!(&'a A, &'a C);
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: ParallelIterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
assert_eq!(
TypeId::of::<
<(task::System<Foo>, (task::ParSystem<Bar>, task::Null)) as Schedule<
'_,
Registry,
Resources!(),
_,
>>::Stages,
>(),
TypeId::of::<(
(
&mut task::System<Foo>,
(&mut task::ParSystem<Bar>, stage::Null)
),
stages::Null
)>()
);
}
#[test]
fn entry_views_multiple_stages_with_component_views() {
struct Foo;
impl System for Foo {
type Views<'a> = Views!(&'a A, &'a mut B);
type Filter = filter::None;
type ResourceViews<'a> = Views!();
type EntryViews<'a> = Views!(&'a A);
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: Iterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
struct Bar;
impl ParSystem for Bar {
type Views<'a> = Views!(&'a C, &'a mut D);
type Filter = filter::None;
type ResourceViews<'a> = Views!();
type EntryViews<'a> = Views!(&'a A, &'a B);
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: ParallelIterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
assert_eq!(
TypeId::of::<
<(task::System<Foo>, (task::ParSystem<Bar>, task::Null)) as Schedule<
'_,
Registry,
Resources!(),
_,
>>::Stages,
>(),
TypeId::of::<(
(&mut task::System<Foo>, stage::Null),
((&mut task::ParSystem<Bar>, stage::Null), stages::Null)
)>()
);
}
#[test]
fn registry_contains_non_sync_component() {
struct Foo;
impl System for Foo {
type Views<'a> = Views!();
type Filter = filter::None;
type ResourceViews<'a> = Views!();
type EntryViews<'a> = Views!();
#[cfg_attr(coverage_nightly, no_coverage)]
fn run<'a, R, S, I, E>(
&mut self,
_query_results: Result<R, S, I, Self::ResourceViews<'a>, Self::EntryViews<'a>, E>,
) where
R: registry::Registry,
I: Iterator<Item = Self::Views<'a>>,
{
unimplemented!()
}
}
assert_eq!(
TypeId::of::<
<(task::System<Foo>, task::Null) as Schedule<
'_,
(alloc::rc::Rc<A>, Registry),
Resources!(),
_,
>>::Stages,
>(),
TypeId::of::<((&mut task::System<Foo>, stage::Null), stages::Null)>()
);
}
}