diff --git a/crates/bevy_ecs/src/query/access.rs b/crates/bevy_ecs/src/query/access.rs index a28e6df23e..ea18adf841 100644 --- a/crates/bevy_ecs/src/query/access.rs +++ b/crates/bevy_ecs/src/query/access.rs @@ -71,16 +71,21 @@ impl fmt::Debug for Access { } impl Default for Access { fn default() -> Self { - Self { - reads_all: false, - reads_and_writes: Default::default(), - writes: Default::default(), - marker: PhantomData, - } + Self::new() } } impl Access { + /// Creates an empty [`Access`] collection. + pub const fn new() -> Self { + Self { + reads_all: false, + reads_and_writes: FixedBitSet::new(), + writes: FixedBitSet::new(), + marker: PhantomData, + } + } + /// Increases the set capacity to the specified amount. /// /// Does nothing if `capacity` is less than or equal to the current value. diff --git a/crates/bevy_ecs/src/system/system_piping.rs b/crates/bevy_ecs/src/system/system_piping.rs index d28158b697..dd343461b9 100644 --- a/crates/bevy_ecs/src/system/system_piping.rs +++ b/crates/bevy_ecs/src/system/system_piping.rs @@ -54,6 +54,21 @@ pub struct PipeSystem { archetype_component_access: Access, } +impl PipeSystem { + /// Manual constructor for creating a [`PipeSystem`]. + /// This should only be used when [`IntoPipeSystem::pipe`] cannot be used, + /// such as in `const` contexts. + pub const fn new(system_a: SystemA, system_b: SystemB, name: Cow<'static, str>) -> Self { + Self { + system_a, + system_b, + name, + component_access: Access::new(), + archetype_component_access: Access::new(), + } + } +} + impl> System for PipeSystem { type In = SystemA::In; type Out = SystemB::Out; @@ -154,13 +169,8 @@ where fn pipe(self, system: SystemB) -> PipeSystem { let system_a = IntoSystem::into_system(self); let system_b = IntoSystem::into_system(system); - PipeSystem { - name: Cow::Owned(format!("Pipe({}, {})", system_a.name(), system_b.name())), - system_a, - system_b, - archetype_component_access: Default::default(), - component_access: Default::default(), - } + let name = format!("Pipe({}, {})", system_a.name(), system_b.name()); + PipeSystem::new(system_a, system_b, Cow::Owned(name)) } }