Skip to content

Commit b56121f

Browse files
committed
Implement StageLabel for Box<dyn StageLabel>
1 parent 458cb7a commit b56121f

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

crates/bevy_ecs/src/schedule/label.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ define_label!(SystemLabel);
66
define_label!(AmbiguitySetLabel);
77
define_label!(RunCriteriaLabel);
88

9+
impl StageLabel for Box<dyn StageLabel> {
10+
fn dyn_clone(&self) -> Box<dyn StageLabel> {
11+
self.as_ref().dyn_clone()
12+
}
13+
}
14+
915
pub(crate) type BoxedStageLabel = Box<dyn StageLabel>;
1016
pub(crate) type BoxedSystemLabel = Box<dyn SystemLabel>;
1117
pub(crate) type BoxedAmbiguitySetLabel = Box<dyn AmbiguitySetLabel>;

crates/bevy_ecs/src/schedule/mod.rs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ impl Schedule {
138138
.stage_order
139139
.iter()
140140
.enumerate()
141-
.find(|(_i, stage_label)| &***stage_label == target)
141+
.find(|(_i, stage_label)| stage_label.dyn_clone() == target.dyn_clone())
142142
.map(|(i, _)| i)
143143
.unwrap_or_else(|| panic!("Target stage does not exist: {:?}.", target));
144144

@@ -174,7 +174,7 @@ impl Schedule {
174174
.stage_order
175175
.iter()
176176
.enumerate()
177-
.find(|(_i, stage_label)| &***stage_label == target)
177+
.find(|(_i, stage_label)| stage_label.dyn_clone() == target.dyn_clone())
178178
.map(|(i, _)| i)
179179
.unwrap_or_else(|| panic!("Target stage does not exist: {:?}.", target));
180180

@@ -372,3 +372,26 @@ impl Stage for Schedule {
372372
}
373373
}
374374
}
375+
376+
#[cfg(test)]
377+
mod tests {
378+
use super::*;
379+
380+
#[test]
381+
fn test_adding_after_boxed_stage() {
382+
let mut schedule = Schedule::default();
383+
schedule.add_stage("first", SystemStage::single_threaded());
384+
let stage = schedule.iter_stages().next().unwrap().0.dyn_clone();
385+
// shouldn't panic
386+
schedule.add_stage_after(stage, "second", SystemStage::single_threaded());
387+
}
388+
389+
#[test]
390+
fn test_adding_before_boxed_stage() {
391+
let mut schedule = Schedule::default();
392+
schedule.add_stage("first", SystemStage::single_threaded());
393+
let stage = schedule.iter_stages().next().unwrap().0.dyn_clone();
394+
// shouldn't panic
395+
schedule.add_stage_before(stage, "second", SystemStage::single_threaded());
396+
}
397+
}

0 commit comments

Comments
 (0)