summaryrefslogtreecommitdiff
path: root/src/buildtool/multithreading/task.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildtool/multithreading/task.hpp')
-rw-r--r--src/buildtool/multithreading/task.hpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/buildtool/multithreading/task.hpp b/src/buildtool/multithreading/task.hpp
new file mode 100644
index 00000000..49eb20a9
--- /dev/null
+++ b/src/buildtool/multithreading/task.hpp
@@ -0,0 +1,38 @@
+#ifndef INCLUDED_SRC_BUILDTOOL_MULTITHREADING_TASK_HPP
+#define INCLUDED_SRC_BUILDTOOL_MULTITHREADING_TASK_HPP
+
+#include <functional>
+#include <type_traits>
+
+class Task {
+ public:
+ using TaskFunc = std::function<void()>;
+
+ Task() noexcept = default;
+
+ // NOLINTNEXTLINE(modernize-pass-by-value)
+ explicit Task(TaskFunc const& function) noexcept : f_{function} {}
+ explicit Task(TaskFunc&& function) noexcept : f_{std::move(function)} {}
+
+ void operator()() { f_(); }
+
+ // To be able to discern whether the internal f_ has been set or not,
+ // allowing us to write code such as:
+ /*
+ Task t;
+ while (!t) {
+ t = TryGetTaskFromQueue(); // (*)
+ }
+ t(); // (**)
+ */
+ // (*) does `return Task();` or `return {};` if queue is empty or locked)
+ // (**) we can now surely execute the task (and be sure it won't throw any
+ // exception) (for the sake of the example, imagine we are sure that the
+ // queue wasn't empty, otherwise this would be an infinite loop)
+ explicit operator bool() const noexcept { return f_.operator bool(); }
+
+ private:
+ TaskFunc f_{};
+};
+
+#endif // INCLUDED_SRC_BUILDTOOL_MULTITHREADING_TASK_HPP