diff options
author | David Robillard <d@drobilla.net> | 2017-10-05 19:15:57 +0200 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2017-12-16 13:57:39 +0100 |
commit | 4975f1e0b17cee620a58b29232867c667c24b0e3 (patch) | |
tree | 1fc112e2f672a04177fe5a629e6c880f90dd8154 /src/server/Task.hpp | |
parent | 60c7a0b8d376bdbd0d99dbe1b74fdb7ebe2cc2d9 (diff) | |
download | ingen-4975f1e0b17cee620a58b29232867c667c24b0e3.tar.gz ingen-4975f1e0b17cee620a58b29232867c667c24b0e3.tar.bz2 ingen-4975f1e0b17cee620a58b29232867c667c24b0e3.zip |
Simplify Task implementation
Diffstat (limited to 'src/server/Task.hpp')
-rw-r--r-- | src/server/Task.hpp | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/src/server/Task.hpp b/src/server/Task.hpp index 982a6206..203627a1 100644 --- a/src/server/Task.hpp +++ b/src/server/Task.hpp @@ -17,9 +17,10 @@ #ifndef INGEN_ENGINE_TASK_HPP #define INGEN_ENGINE_TASK_HPP +#include <atomic> #include <cassert> #include <deque> -#include <memory> +#include <functional> #include <ostream> namespace Ingen { @@ -55,6 +56,17 @@ public: , _done(task._done.load()) {} + Task& operator=(Task&& task) + { + _children = std::move(task._children); + _block = task._block; + _mode = task._mode; + _done_end = task._done_end; + _next = task._next.load(); + _done = task._done.load(); + return *this; + } + /** Run task in the given context. */ void run(RunContext& context); @@ -65,14 +77,14 @@ public: bool empty() const { return _mode != Mode::SINGLE && _children.empty(); } /** Simplify task expression. */ - static std::unique_ptr<Task> simplify(std::unique_ptr<Task>&& task); + static Task simplify(Task task); /** Steal a child task from this task (succeeds for PARALLEL only). */ Task* steal(RunContext& context); /** Prepend a child to this task. */ void push_front(Task&& task) { - _children.push_front(std::unique_ptr<Task>(new Task(std::move(task)))); + _children.emplace_front(std::move(task)); } Mode mode() const { return _mode; } @@ -82,13 +94,17 @@ public: void set_done(bool done) { _done = done; } private: - typedef std::deque<std::unique_ptr<Task>> Children; + typedef std::deque<Task> Children; Task(const Task&) = delete; Task& operator=(const Task&) = delete; Task* get_task(RunContext& context); + void append(Task t) { + _children.emplace_back(std::move(t)); + } + Children _children; ///< Vector of child tasks BlockImpl* _block; ///< Used for SINGLE only Mode _mode; ///< Execution mode |