Skip to content

Commit 2bad81e

Browse files
committed
Implement StageLabel for Box<dyn StageLabel>
1 parent a291b5a commit 2bad81e

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

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

0 commit comments

Comments
 (0)