Skip to content

Commit 2166d5d

Browse files
committed
Introduce a boxed label wrapper type
1 parent 646a2c9 commit 2166d5d

File tree

12 files changed

+166
-117
lines changed

12 files changed

+166
-117
lines changed

crates/bevy_app/src/app.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use std::fmt::Debug;
1515

1616
#[cfg(feature = "trace")]
1717
use bevy_utils::tracing::info_span;
18-
bevy_utils::define_label!(AppLabel);
18+
bevy_utils::define_label!(AppLabel, BoxedAppLabel);
1919

2020
#[allow(clippy::needless_doctest_main)]
2121
/// A container of app logic and data.
@@ -56,7 +56,7 @@ pub struct App {
5656
pub runner: Box<dyn Fn(App)>,
5757
/// A container of [`Stage`]s set to be run in a linear order.
5858
pub schedule: Schedule,
59-
sub_apps: HashMap<Box<dyn AppLabel>, SubApp>,
59+
sub_apps: HashMap<BoxedAppLabel, SubApp>,
6060
}
6161

6262
/// Each `SubApp` has its own [`Schedule`] and [`World`], enabling a separation of concerns.
@@ -889,7 +889,7 @@ impl App {
889889
/// an [`Err`] containing the given label.
890890
pub fn get_sub_app_mut(&mut self, label: impl AppLabel) -> Result<&mut App, impl AppLabel> {
891891
self.sub_apps
892-
.get_mut((&label) as &dyn AppLabel)
892+
.get_mut(&label.dyn_clone())
893893
.map(|sub_app| &mut sub_app.app)
894894
.ok_or(label)
895895
}
@@ -910,7 +910,7 @@ impl App {
910910
/// an [`Err`] containing the given label.
911911
pub fn get_sub_app(&self, label: impl AppLabel) -> Result<&App, impl AppLabel> {
912912
self.sub_apps
913-
.get((&label) as &dyn AppLabel)
913+
.get(&label.dyn_clone())
914914
.map(|sub_app| &sub_app.app)
915915
.ok_or(label)
916916
}

crates/bevy_derive/src/lib.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ pub fn derive_enum_variant_meta(input: TokenStream) -> TokenStream {
8585
pub fn derive_app_label(input: TokenStream) -> TokenStream {
8686
let input = syn::parse_macro_input!(input as syn::DeriveInput);
8787
let mut trait_path = BevyManifest::default().get_path("bevy_app");
88+
let mut boxed_type_path = trait_path.clone();
8889
trait_path.segments.push(format_ident!("AppLabel").into());
89-
derive_label(input, &trait_path)
90+
boxed_type_path
91+
.segments
92+
.push(format_ident!("BoxedAppLabel").into());
93+
derive_label(input, &trait_path, &boxed_type_path)
9094
}

crates/bevy_ecs/macros/src/lib.rs

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -424,43 +424,62 @@ pub fn derive_world_query(input: TokenStream) -> TokenStream {
424424
#[proc_macro_derive(SystemLabel)]
425425
pub fn derive_system_label(input: TokenStream) -> TokenStream {
426426
let input = parse_macro_input!(input as DeriveInput);
427-
let mut trait_path = bevy_ecs_path();
428-
trait_path.segments.push(format_ident!("schedule").into());
429-
trait_path
430-
.segments
431-
.push(format_ident!("SystemLabel").into());
432-
derive_label(input, &trait_path)
427+
let LabelPaths {
428+
trait_path,
429+
boxed_type_path,
430+
} = label_paths("SystemLabel");
431+
derive_label(input, &trait_path, &boxed_type_path)
433432
}
434433

435434
#[proc_macro_derive(StageLabel)]
436435
pub fn derive_stage_label(input: TokenStream) -> TokenStream {
437436
let input = parse_macro_input!(input as DeriveInput);
438-
let mut trait_path = bevy_ecs_path();
439-
trait_path.segments.push(format_ident!("schedule").into());
440-
trait_path.segments.push(format_ident!("StageLabel").into());
441-
derive_label(input, &trait_path)
437+
let LabelPaths {
438+
trait_path,
439+
boxed_type_path,
440+
} = label_paths("StageLabel");
441+
derive_label(input, &trait_path, &boxed_type_path)
442442
}
443443

444444
#[proc_macro_derive(AmbiguitySetLabel)]
445445
pub fn derive_ambiguity_set_label(input: TokenStream) -> TokenStream {
446446
let input = parse_macro_input!(input as DeriveInput);
447-
let mut trait_path = bevy_ecs_path();
448-
trait_path.segments.push(format_ident!("schedule").into());
449-
trait_path
450-
.segments
451-
.push(format_ident!("AmbiguitySetLabel").into());
452-
derive_label(input, &trait_path)
447+
let LabelPaths {
448+
trait_path,
449+
boxed_type_path,
450+
} = label_paths("AmbiguitySetLabel");
451+
derive_label(input, &trait_path, &boxed_type_path)
453452
}
454453

455454
#[proc_macro_derive(RunCriteriaLabel)]
456455
pub fn derive_run_criteria_label(input: TokenStream) -> TokenStream {
457456
let input = parse_macro_input!(input as DeriveInput);
457+
let LabelPaths {
458+
trait_path,
459+
boxed_type_path,
460+
} = label_paths("RunCriteriaLabel");
461+
derive_label(input, &trait_path, &boxed_type_path)
462+
}
463+
464+
struct LabelPaths {
465+
trait_path: syn::Path,
466+
boxed_type_path: syn::Path,
467+
}
468+
469+
fn label_paths(label_trait_name: &'static str) -> LabelPaths {
458470
let mut trait_path = bevy_ecs_path();
459471
trait_path.segments.push(format_ident!("schedule").into());
472+
let mut boxed_type_path = trait_path.clone();
460473
trait_path
461474
.segments
462-
.push(format_ident!("RunCriteriaLabel").into());
463-
derive_label(input, &trait_path)
475+
.push(format_ident!("{}", label_trait_name).into());
476+
boxed_type_path
477+
.segments
478+
.push(format_ident!("Boxed{}", label_trait_name).into());
479+
LabelPaths {
480+
trait_path,
481+
boxed_type_path,
482+
}
464483
}
465484

466485
pub(crate) fn bevy_ecs_path() -> syn::Path {
Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
11
pub use bevy_ecs_macros::{AmbiguitySetLabel, RunCriteriaLabel, StageLabel, SystemLabel};
22
use bevy_utils::define_label;
33

4-
define_label!(StageLabel);
5-
define_label!(SystemLabel);
6-
define_label!(AmbiguitySetLabel);
7-
define_label!(RunCriteriaLabel);
8-
9-
pub(crate) type BoxedStageLabel = Box<dyn StageLabel>;
10-
pub(crate) type BoxedSystemLabel = Box<dyn SystemLabel>;
11-
pub(crate) type BoxedAmbiguitySetLabel = Box<dyn AmbiguitySetLabel>;
12-
pub(crate) type BoxedRunCriteriaLabel = Box<dyn RunCriteriaLabel>;
4+
define_label!(StageLabel, BoxedStageLabel);
5+
define_label!(SystemLabel, BoxedSystemLabel);
6+
define_label!(AmbiguitySetLabel, BoxedAmbiguitySetLabel);
7+
define_label!(RunCriteriaLabel, BoxedRunCriteriaLabel);

crates/bevy_ecs/src/schedule/mod.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ impl Schedule {
111111
/// schedule.add_stage("my_stage", SystemStage::parallel());
112112
/// ```
113113
pub fn add_stage<S: Stage>(&mut self, label: impl StageLabel, stage: S) -> &mut Self {
114-
let label: Box<dyn StageLabel> = label.dyn_clone();
114+
let label: BoxedStageLabel = label.dyn_clone();
115115
self.stage_order.push(label.clone());
116116
let prev = self.stages.insert(label.clone(), Box::new(stage));
117117
assert!(prev.is_none(), "Stage already exists: {:?}.", label);
@@ -135,7 +135,7 @@ impl Schedule {
135135
label: impl StageLabel,
136136
stage: S,
137137
) -> &mut Self {
138-
let label: Box<dyn StageLabel> = label.dyn_clone();
138+
let label: BoxedStageLabel = label.dyn_clone();
139139
let target = &target as &dyn StageLabel;
140140
let target_index = self
141141
.stage_order
@@ -169,7 +169,7 @@ impl Schedule {
169169
label: impl StageLabel,
170170
stage: S,
171171
) -> &mut Self {
172-
let label: Box<dyn StageLabel> = label.dyn_clone();
172+
let label: BoxedStageLabel = label.dyn_clone();
173173
let target = &target as &dyn StageLabel;
174174
let target_index = self
175175
.stage_order
@@ -307,7 +307,7 @@ impl Schedule {
307307
/// ```
308308
pub fn get_stage<T: Stage>(&self, label: &dyn StageLabel) -> Option<&T> {
309309
self.stages
310-
.get(label)
310+
.get(&label.dyn_clone())
311311
.and_then(|stage| stage.downcast_ref::<T>())
312312
}
313313

@@ -328,7 +328,7 @@ impl Schedule {
328328
/// ```
329329
pub fn get_stage_mut<T: Stage>(&mut self, label: &dyn StageLabel) -> Option<&mut T> {
330330
self.stages
331-
.get_mut(label)
331+
.get_mut(&label.dyn_clone())
332332
.and_then(|stage| stage.downcast_mut::<T>())
333333
}
334334

0 commit comments

Comments
 (0)