Simplify the way run conditions are stored in the schedule (#8594)
# Objective `ScheduleGraph` currently stores run conditions in a `Option<Vec<BoxedCondition>>`. The `Option` is unnecessary, since we can just use an empty vector instead of `None`.
This commit is contained in:
parent
636f711d26
commit
1644426761
@ -380,9 +380,9 @@ impl SystemNode {
|
|||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct ScheduleGraph {
|
pub struct ScheduleGraph {
|
||||||
systems: Vec<SystemNode>,
|
systems: Vec<SystemNode>,
|
||||||
system_conditions: Vec<Option<Vec<BoxedCondition>>>,
|
system_conditions: Vec<Vec<BoxedCondition>>,
|
||||||
system_sets: Vec<SystemSetNode>,
|
system_sets: Vec<SystemSetNode>,
|
||||||
system_set_conditions: Vec<Option<Vec<BoxedCondition>>>,
|
system_set_conditions: Vec<Vec<BoxedCondition>>,
|
||||||
system_set_ids: HashMap<BoxedSystemSet, NodeId>,
|
system_set_ids: HashMap<BoxedSystemSet, NodeId>,
|
||||||
uninit: Vec<(NodeId, usize)>,
|
uninit: Vec<(NodeId, usize)>,
|
||||||
hierarchy: Dag,
|
hierarchy: Dag,
|
||||||
@ -465,20 +465,17 @@ impl ScheduleGraph {
|
|||||||
.enumerate()
|
.enumerate()
|
||||||
.filter_map(|(i, (system_node, condition))| {
|
.filter_map(|(i, (system_node, condition))| {
|
||||||
let system = system_node.inner.as_deref()?;
|
let system = system_node.inner.as_deref()?;
|
||||||
let condition = condition.as_ref()?.as_slice();
|
Some((NodeId::System(i), system, condition.as_slice()))
|
||||||
Some((NodeId::System(i), system, condition))
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns an iterator over all system sets in this schedule.
|
/// Returns an iterator over all system sets in this schedule.
|
||||||
pub fn system_sets(&self) -> impl Iterator<Item = (NodeId, &dyn SystemSet, &[BoxedCondition])> {
|
pub fn system_sets(&self) -> impl Iterator<Item = (NodeId, &dyn SystemSet, &[BoxedCondition])> {
|
||||||
self.system_set_ids.iter().map(|(_, node_id)| {
|
self.system_set_ids.iter().map(|(_, &node_id)| {
|
||||||
let set_node = &self.system_sets[node_id.index()];
|
let set_node = &self.system_sets[node_id.index()];
|
||||||
let set = &*set_node.inner;
|
let set = &*set_node.inner;
|
||||||
let conditions = self.system_set_conditions[node_id.index()]
|
let conditions = self.system_set_conditions[node_id.index()].as_slice();
|
||||||
.as_deref()
|
(node_id, set, conditions)
|
||||||
.unwrap_or(&[]);
|
|
||||||
(*node_id, set, conditions)
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -662,7 +659,7 @@ impl ScheduleGraph {
|
|||||||
// system init has to be deferred (need `&mut World`)
|
// system init has to be deferred (need `&mut World`)
|
||||||
self.uninit.push((id, 0));
|
self.uninit.push((id, 0));
|
||||||
self.systems.push(SystemNode::new(config.system));
|
self.systems.push(SystemNode::new(config.system));
|
||||||
self.system_conditions.push(Some(config.conditions));
|
self.system_conditions.push(config.conditions);
|
||||||
|
|
||||||
Ok(id)
|
Ok(id)
|
||||||
}
|
}
|
||||||
@ -708,8 +705,7 @@ impl ScheduleGraph {
|
|||||||
self.update_graphs(id, graph_info)?;
|
self.update_graphs(id, graph_info)?;
|
||||||
|
|
||||||
// system init has to be deferred (need `&mut World`)
|
// system init has to be deferred (need `&mut World`)
|
||||||
let system_set_conditions =
|
let system_set_conditions = &mut self.system_set_conditions[id.index()];
|
||||||
self.system_set_conditions[id.index()].get_or_insert_with(Vec::new);
|
|
||||||
self.uninit.push((id, system_set_conditions.len()));
|
self.uninit.push((id, system_set_conditions.len()));
|
||||||
system_set_conditions.append(&mut conditions);
|
system_set_conditions.append(&mut conditions);
|
||||||
|
|
||||||
@ -719,7 +715,7 @@ impl ScheduleGraph {
|
|||||||
fn add_set(&mut self, set: BoxedSystemSet) -> NodeId {
|
fn add_set(&mut self, set: BoxedSystemSet) -> NodeId {
|
||||||
let id = NodeId::Set(self.system_sets.len());
|
let id = NodeId::Set(self.system_sets.len());
|
||||||
self.system_sets.push(SystemSetNode::new(set.dyn_clone()));
|
self.system_sets.push(SystemSetNode::new(set.dyn_clone()));
|
||||||
self.system_set_conditions.push(None);
|
self.system_set_conditions.push(Vec::new());
|
||||||
self.system_set_ids.insert(set, id);
|
self.system_set_ids.insert(set, id);
|
||||||
id
|
id
|
||||||
}
|
}
|
||||||
@ -852,17 +848,13 @@ impl ScheduleGraph {
|
|||||||
match id {
|
match id {
|
||||||
NodeId::System(index) => {
|
NodeId::System(index) => {
|
||||||
self.systems[index].get_mut().unwrap().initialize(world);
|
self.systems[index].get_mut().unwrap().initialize(world);
|
||||||
if let Some(v) = self.system_conditions[index].as_mut() {
|
for condition in &mut self.system_conditions[index] {
|
||||||
for condition in v.iter_mut() {
|
condition.initialize(world);
|
||||||
condition.initialize(world);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
NodeId::Set(index) => {
|
NodeId::Set(index) => {
|
||||||
if let Some(v) = self.system_set_conditions[index].as_mut() {
|
for condition in self.system_set_conditions[index].iter_mut().skip(i) {
|
||||||
for condition in v.iter_mut().skip(i) {
|
condition.initialize(world);
|
||||||
condition.initialize(world);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1123,11 +1115,7 @@ impl ScheduleGraph {
|
|||||||
.filter(|&(_i, id)| {
|
.filter(|&(_i, id)| {
|
||||||
// ignore system sets that have no conditions
|
// ignore system sets that have no conditions
|
||||||
// ignore system type sets (already covered, they don't have conditions)
|
// ignore system type sets (already covered, they don't have conditions)
|
||||||
id.is_set()
|
id.is_set() && !self.system_set_conditions[id.index()].is_empty()
|
||||||
&& self.system_set_conditions[id.index()]
|
|
||||||
.as_ref()
|
|
||||||
.filter(|v| !v.is_empty())
|
|
||||||
.is_some()
|
|
||||||
})
|
})
|
||||||
.unzip();
|
.unzip();
|
||||||
|
|
||||||
@ -1215,7 +1203,7 @@ impl ScheduleGraph {
|
|||||||
.zip(schedule.system_conditions.drain(..))
|
.zip(schedule.system_conditions.drain(..))
|
||||||
{
|
{
|
||||||
self.systems[id.index()].inner = Some(system);
|
self.systems[id.index()].inner = Some(system);
|
||||||
self.system_conditions[id.index()] = Some(conditions);
|
self.system_conditions[id.index()] = conditions;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (id, conditions) in schedule
|
for (id, conditions) in schedule
|
||||||
@ -1223,7 +1211,7 @@ impl ScheduleGraph {
|
|||||||
.drain(..)
|
.drain(..)
|
||||||
.zip(schedule.set_conditions.drain(..))
|
.zip(schedule.set_conditions.drain(..))
|
||||||
{
|
{
|
||||||
self.system_set_conditions[id.index()] = Some(conditions);
|
self.system_set_conditions[id.index()] = conditions;
|
||||||
}
|
}
|
||||||
|
|
||||||
*schedule = self.build_schedule(components)?;
|
*schedule = self.build_schedule(components)?;
|
||||||
@ -1231,13 +1219,13 @@ impl ScheduleGraph {
|
|||||||
// move systems into new schedule
|
// move systems into new schedule
|
||||||
for &id in &schedule.system_ids {
|
for &id in &schedule.system_ids {
|
||||||
let system = self.systems[id.index()].inner.take().unwrap();
|
let system = self.systems[id.index()].inner.take().unwrap();
|
||||||
let conditions = self.system_conditions[id.index()].take().unwrap();
|
let conditions = std::mem::take(&mut self.system_conditions[id.index()]);
|
||||||
schedule.systems.push(system);
|
schedule.systems.push(system);
|
||||||
schedule.system_conditions.push(conditions);
|
schedule.system_conditions.push(conditions);
|
||||||
}
|
}
|
||||||
|
|
||||||
for &id in &schedule.set_ids {
|
for &id in &schedule.set_ids {
|
||||||
let conditions = self.system_set_conditions[id.index()].take().unwrap();
|
let conditions = std::mem::take(&mut self.system_set_conditions[id.index()]);
|
||||||
schedule.set_conditions.push(conditions);
|
schedule.set_conditions.push(conditions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user