diff options
Diffstat (limited to 'src/server/Task.cpp')
-rw-r--r-- | src/server/Task.cpp | 87 |
1 files changed, 53 insertions, 34 deletions
diff --git a/src/server/Task.cpp b/src/server/Task.cpp index 0978e15d..497f7895 100644 --- a/src/server/Task.cpp +++ b/src/server/Task.cpp @@ -33,9 +33,9 @@ get_task(ParTask& task, RunContext& context) while (true) { // Push done end index as forward as possible - // while (task.done_end < task.children.size() && task.children[task.done_end]->done()) { - // ++task.done_end; - // } + while (task.done_end < task.children.size() && task.children[task.done_end].done()) { + ++task.done_end; + } if (task.done_end >= task.children.size()) { return nullptr; // All child tasks are finished @@ -63,8 +63,8 @@ struct Runner } void operator()(SeqTask& task) { - for (const auto& child : task.children) { - run(*child, context); + for (auto& child : task.children) { + run(child, context); } } @@ -104,47 +104,61 @@ steal(ParTask& task, RunContext& context) { const unsigned i = task.next++; if (i < task.children.size()) { - return task.children[i].get(); + return &task.children[i]; } return nullptr; } -std::unique_ptr<Task> -simplify(std::unique_ptr<Task>&& task) +static bool empty(Task& task) { -#if 0 - if (boost::get<SingleTask>(task.get())) { - return std::move(task); + if (SeqTask* seq = boost::get<SeqTask>(&task)) { + return seq->children.empty(); + } else if (ParTask* par = boost::get<ParTask>(&task)) { + return par->children.empty(); } - std::unique_ptr<Task> ret = std::unique_ptr<Task>(new Task(task->mode())); - for (auto&& c : task->_children) { + return false; +} + +template<typename T> +static Task +simplify(T&& task) +{ + typename std::remove_reference<T>::type ret; + for (auto&& c : task.children) { auto child = simplify(std::move(c)); - if (!child->empty()) { - if (child->mode() == task->mode()) { - // Merge child into parent - for (auto&& grandchild : child->_children) { - ret->append(std::move(grandchild)); + if (!empty(child)) { + if (T* merge_child = boost::get<T>(&child)) { + // Child has same type, merge into parent + for (auto&& grandchild : merge_child->children) { + ret.children.emplace_back(std::move(grandchild)); } } else { - // Add child task - ret->append(std::move(child)); + // Append child task + ret.children.emplace_back(std::move(child)); } } } - if (ret->_children.size() == 1) { - return std::move(ret->_children.front()); + return ret.children.size() == 1 ? std::move(ret.children.front()) + : Task(std::move(ret)); +} + +Task +simplify(Task&& task) +{ + if (SeqTask* seq = boost::get<SeqTask>(&task)) { + return simplify<SeqTask>(std::move(*seq)); + } else if (ParTask* par = boost::get<ParTask>(&task)) { + return simplify<ParTask>(std::move(*par)); } - return ret; -#endif - return nullptr; + + return std::move(task); } -#if 0 void -Task::dump(std::function<void (const std::string&)> sink, unsigned indent, bool first) const +dump(Task& task, std::function<void (const std::string&)> sink, unsigned indent, bool first) { if (!first) { sink("\n"); @@ -153,17 +167,22 @@ Task::dump(std::function<void (const std::string&)> sink, unsigned indent, bool } } - if (_mode == Mode::SINGLE) { - sink(_block->path()); - } else { - sink(((_mode == Mode::SEQUENTIAL) ? "(seq " : "(par ")); - for (size_t i = 0; i < _children.size(); ++i) { - _children[i]->dump(sink, indent + 5, i == 0); + if (SingleTask* single = boost::get<SingleTask>(&task)) { + sink(single->block->path()); + } else if (SeqTask* seq = boost::get<SeqTask>(&task)) { + sink("(seq "); + for (size_t i = 0; i < seq->children.size(); ++i) { + dump(seq->children[i], sink, indent + 5, i == 0); + } + sink(")"); + } else if (ParTask* par = boost::get<ParTask>(&task)) { + sink("(par "); + for (size_t i = 0; i < par->children.size(); ++i) { + dump(par->children[i], sink, indent + 5, i == 0); } sink(")"); } } -#endif } // namespace Server } // namespace Ingen |