Skip to content

Commit 5e651d0

Browse files
committed
Implement StageLabel for Box<dyn StageLabel>
1 parent 08eaa13 commit 5e651d0

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
@@ -141,7 +141,7 @@ impl Schedule {
141141
.stage_order
142142
.iter()
143143
.enumerate()
144-
.find(|(_i, stage_label)| &***stage_label == target)
144+
.find(|(_i, stage_label)| stage_label.dyn_clone() == target.dyn_clone())
145145
.map(|(i, _)| i)
146146
.unwrap_or_else(|| panic!("Target stage does not exist: {:?}.", target));
147147

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

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

0 commit comments

Comments
 (0)