|
|
@@ -84,19 +84,19 @@ class scheduler {
|
|
|
auto *process = static_cast<Proc *>(handler.instance.get());
|
|
|
process->tick(delta, data);
|
|
|
|
|
|
- auto dead = process->dead();
|
|
|
-
|
|
|
- if(dead) {
|
|
|
- if(handler.next && !process->rejected()) {
|
|
|
+ if(process->rejected()) {
|
|
|
+ return true;
|
|
|
+ } else if(process->dead()) {
|
|
|
+ if(handler.next) {
|
|
|
handler = std::move(*handler.next);
|
|
|
// forces the process to exit the uninitialized state
|
|
|
- dead = handler.update(handler, {}, nullptr);
|
|
|
- } else {
|
|
|
- handler.instance.reset();
|
|
|
+ return handler.update(handler, {}, nullptr);
|
|
|
}
|
|
|
+
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
- return dead;
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
template<typename Proc>
|
|
|
@@ -252,19 +252,17 @@ public:
|
|
|
* @param data Optional data.
|
|
|
*/
|
|
|
void update(const Delta delta, void *data = nullptr) {
|
|
|
- bool clean = false;
|
|
|
+ auto sz = handlers.size();
|
|
|
|
|
|
for(auto pos = handlers.size(); pos; --pos) {
|
|
|
auto &handler = handlers[pos-1];
|
|
|
- const bool dead = handler.update(handler, delta, data);
|
|
|
- clean = clean || dead;
|
|
|
- }
|
|
|
|
|
|
- if(clean) {
|
|
|
- handlers.erase(std::remove_if(handlers.begin(), handlers.end(), [](auto &handler) {
|
|
|
- return !handler.instance;
|
|
|
- }), handlers.end());
|
|
|
+ if(const auto dead = handler.update(handler, delta, data); dead) {
|
|
|
+ std::swap(handler, handlers[--sz]);
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+ handlers.erase(handlers.begin() + sz, handlers.end());
|
|
|
}
|
|
|
|
|
|
/**
|