legion: remove filter types from system_fn macro and IntoSystem and use "casting" instead
This commit is contained in:
parent
74d0055a3d
commit
085cda8bc6
@ -29,7 +29,6 @@ pub fn impl_fn_systems(_input: TokenStream) -> TokenStream {
|
|||||||
let resource_vars = get_idents(|i| format!("r{}", i), max_resources);
|
let resource_vars = get_idents(|i| format!("r{}", i), max_resources);
|
||||||
let views = get_idents(|i| format!("V{}", i), max_views);
|
let views = get_idents(|i| format!("V{}", i), max_views);
|
||||||
let view_vars = get_idents(|i| format!("v{}", i), max_views);
|
let view_vars = get_idents(|i| format!("v{}", i), max_views);
|
||||||
let filters = get_idents(|i| format!("VF{}", i), max_views);
|
|
||||||
|
|
||||||
let mut tokens = TokenStream::new();
|
let mut tokens = TokenStream::new();
|
||||||
|
|
||||||
@ -60,7 +59,6 @@ pub fn impl_fn_systems(_input: TokenStream) -> TokenStream {
|
|||||||
for view_count in 0..=max_views {
|
for view_count in 0..=max_views {
|
||||||
let view = &views[0..view_count];
|
let view = &views[0..view_count];
|
||||||
let view_var = &view_vars[0..view_count];
|
let view_var = &view_vars[0..view_count];
|
||||||
let filter = &filters[0..view_count];
|
|
||||||
|
|
||||||
let view_tuple = tuple(view);
|
let view_tuple = tuple(view);
|
||||||
|
|
||||||
@ -84,20 +82,20 @@ pub fn impl_fn_systems(_input: TokenStream) -> TokenStream {
|
|||||||
} else if view_count == 1 {
|
} else if view_count == 1 {
|
||||||
quote! { SystemQuery<
|
quote! { SystemQuery<
|
||||||
#(#view),*,
|
#(#view),*,
|
||||||
#(#filter),*,
|
#(<#view as DefaultFilter>::Filter),*,
|
||||||
> }
|
> }
|
||||||
} else {
|
} else {
|
||||||
quote! { SystemQuery<
|
quote! { SystemQuery<
|
||||||
(#(#view),*),
|
(#(#view),*),
|
||||||
EntityFilterTuple<
|
EntityFilterTuple<
|
||||||
And<(
|
And<(
|
||||||
#(<#filter as EntityFilter>::ArchetypeFilter),*
|
#(<<#view as DefaultFilter>::Filter as EntityFilter>::ArchetypeFilter),*
|
||||||
)>,
|
)>,
|
||||||
And<(
|
And<(
|
||||||
#(<#filter as EntityFilter>::ChunksetFilter),*
|
#(<<#view as DefaultFilter>::Filter as EntityFilter>::ChunksetFilter),*
|
||||||
)>,
|
)>,
|
||||||
And<(
|
And<(
|
||||||
#(<#filter as EntityFilter>::ChunkFilter),*
|
#(<<#view as DefaultFilter>::Filter as EntityFilter>::ChunkFilter),*
|
||||||
)>,
|
)>,
|
||||||
>
|
>
|
||||||
> }
|
> }
|
||||||
@ -127,12 +125,12 @@ pub fn impl_fn_systems(_input: TokenStream) -> TokenStream {
|
|||||||
impl<'a,
|
impl<'a,
|
||||||
Func,
|
Func,
|
||||||
#(#resource: ResourceSet<PreparedResources = #resource> + 'static + Clone,)*
|
#(#resource: ResourceSet<PreparedResources = #resource> + 'static + Clone,)*
|
||||||
#(#view: for<'b> View<'b> + DefaultFilter<Filter = #filter> + ViewElement,
|
#(#view: for<'b> View<'b> + DefaultFilter + ViewElement,)*
|
||||||
#filter: EntityFilter + Sync + 'static),*
|
> IntoSystem<(#(#command_buffer)*), (#(#resource,)*), (#(#view,)*), ()> for Func
|
||||||
> IntoSystem<(#(#command_buffer)*), (#(#resource,)*), (#(#view,)*), (), ()> for Func
|
|
||||||
where
|
where
|
||||||
Func: FnMut(#(&mut #command_buffer,)* #(#resource,)* #(#view),*) + Send + Sync + 'static,
|
Func: FnMut(#(&mut #command_buffer,)* #(#resource,)* #(#view),*) + Send + Sync + 'static,
|
||||||
#(<#view as View<'a>>::Iter: Iterator<Item = #view>),*
|
#(<#view as View<'a>>::Iter: Iterator<Item = #view>,
|
||||||
|
<#view as DefaultFilter>::Filter: Sync),*
|
||||||
{
|
{
|
||||||
fn system_id(mut self, id: SystemId) -> Box<dyn Schedulable> {
|
fn system_id(mut self, id: SystemId) -> Box<dyn Schedulable> {
|
||||||
let resource_access: Access<ResourceTypeId> = #resource_access;
|
let resource_access: Access<ResourceTypeId> = #resource_access;
|
||||||
@ -189,7 +187,6 @@ pub fn impl_fn_query_systems(_input: TokenStream) -> TokenStream {
|
|||||||
let resources = get_idents(|i| format!("R{}", i), max_resources);
|
let resources = get_idents(|i| format!("R{}", i), max_resources);
|
||||||
let resource_vars = get_idents(|i| format!("r{}", i), max_resources);
|
let resource_vars = get_idents(|i| format!("r{}", i), max_resources);
|
||||||
let views = get_idents(|i| format!("V{}", i), max_queries);
|
let views = get_idents(|i| format!("V{}", i), max_queries);
|
||||||
let filters = get_idents(|i| format!("VF{}", i), max_queries);
|
|
||||||
let query_vars = get_idents(|i| format!("q{}", i), max_queries);
|
let query_vars = get_idents(|i| format!("q{}", i), max_queries);
|
||||||
|
|
||||||
let mut tokens = TokenStream::new();
|
let mut tokens = TokenStream::new();
|
||||||
@ -220,7 +217,6 @@ pub fn impl_fn_query_systems(_input: TokenStream) -> TokenStream {
|
|||||||
|
|
||||||
for query_count in 1..=max_queries {
|
for query_count in 1..=max_queries {
|
||||||
let view = &views[0..query_count];
|
let view = &views[0..query_count];
|
||||||
let filter = &filters[0..query_count];
|
|
||||||
let query_var = &query_vars[0..query_count];
|
let query_var = &query_vars[0..query_count];
|
||||||
|
|
||||||
let view_tuple = tuple(view);
|
let view_tuple = tuple(view);
|
||||||
@ -251,20 +247,14 @@ pub fn impl_fn_query_systems(_input: TokenStream) -> TokenStream {
|
|||||||
quote! {(#(#view,)*)}
|
quote! {(#(#view,)*)}
|
||||||
};
|
};
|
||||||
|
|
||||||
let filter_tuple_avoid_type_collision = if query_count == 1 {
|
|
||||||
quote! {(#(#filter)*,)}
|
|
||||||
} else {
|
|
||||||
quote! {(#(#filter,)*)}
|
|
||||||
};
|
|
||||||
|
|
||||||
tokens.extend(TokenStream::from(quote! {
|
tokens.extend(TokenStream::from(quote! {
|
||||||
impl<Func,
|
impl<Func,
|
||||||
#(#resource: ResourceSet<PreparedResources = #resource> + 'static + Clone,)*
|
#(#resource: ResourceSet<PreparedResources = #resource> + 'static + Clone,)*
|
||||||
#(#view: for<'b> View<'b> + DefaultFilter<Filter = #filter> + ViewElement,
|
#(#view: for<'b> View<'b> + DefaultFilter + ViewElement),*
|
||||||
#filter: EntityFilter + Sync + 'static),*
|
> IntoSystem<(#(#command_buffer)*), (#(#resource,)*), (), #view_tuple_avoid_type_collision> for Func
|
||||||
> IntoSystem<(#(#command_buffer)*), (#(#resource,)*), (), #view_tuple_avoid_type_collision, #filter_tuple_avoid_type_collision> for Func
|
|
||||||
where
|
where
|
||||||
Func: FnMut(#(&mut #command_buffer,)* &mut SubWorld, #(#resource,)* #(&mut SystemQuery<#view, #filter>),*) + Send + Sync + 'static,
|
Func: FnMut(#(&mut #command_buffer,)* &mut SubWorld, #(#resource,)* #(&mut SystemQuery<#view, <#view as DefaultFilter>::Filter>),*) + Send + Sync + 'static,
|
||||||
|
#(<#view as DefaultFilter>::Filter: Sync),*
|
||||||
{
|
{
|
||||||
fn system_id(mut self, id: SystemId) -> Box<dyn Schedulable> {
|
fn system_id(mut self, id: SystemId) -> Box<dyn Schedulable> {
|
||||||
let resource_access: Access<ResourceTypeId> = #resource_access;
|
let resource_access: Access<ResourceTypeId> = #resource_access;
|
||||||
@ -274,7 +264,7 @@ pub fn impl_fn_query_systems(_input: TokenStream) -> TokenStream {
|
|||||||
move |_command_buffer,
|
move |_command_buffer,
|
||||||
_world,
|
_world,
|
||||||
_resources: #resource_tuple,
|
_resources: #resource_tuple,
|
||||||
_queries: &mut (#(SystemQuery<#view, #filter>),*)
|
_queries: &mut (#(SystemQuery<#view, <#view as DefaultFilter>::Filter>),*)
|
||||||
| {
|
| {
|
||||||
let #resource_var_tuple = _resources;
|
let #resource_var_tuple = _resources;
|
||||||
let #query_var_tuple = _queries;
|
let #query_var_tuple = _queries;
|
||||||
|
@ -16,7 +16,7 @@ use legion_core::{
|
|||||||
use legion_fn_system_macro::{impl_fn_query_systems, impl_fn_systems};
|
use legion_fn_system_macro::{impl_fn_query_systems, impl_fn_systems};
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
|
|
||||||
pub trait IntoSystem<CommandBuffer, Resources, Views, Queries, Filters> {
|
pub trait IntoSystem<CommandBuffer, Resources, Views, Queries> {
|
||||||
fn system_id(self, id: SystemId) -> Box<dyn Schedulable>;
|
fn system_id(self, id: SystemId) -> Box<dyn Schedulable>;
|
||||||
fn system_named(self, name: &'static str) -> Box<dyn Schedulable>;
|
fn system_named(self, name: &'static str) -> Box<dyn Schedulable>;
|
||||||
fn system(self) -> Box<dyn Schedulable>;
|
fn system(self) -> Box<dyn Schedulable>;
|
||||||
|
Loading…
Reference in New Issue
Block a user