cmake-template
Loading...
Searching...
No Matches
task.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <functional>
4#include <future>
5#include <vector>
6
7class ITask {
8public:
9 virtual ~ITask() = default;
10
11 virtual void execute() = 0;
12
13private:
14 std::vector<ITask*> _dependents{};
15 int _dependencies{ 0 };
16
17 friend class Exkit;
18};
19
20template <typename ResultType>
21class Task : public ITask {
22public:
33 explicit Task(std::function<ResultType()> function);
34
41 void execute() override;
42
51 ResultType get();
52
53private:
54 std::function<ResultType()> _function;
55 std::promise<ResultType> _promise;
56 std::shared_future<ResultType> _future;
57
58 friend class Exkit;
59};
60
61template <typename ResultType>
63public:
72 explicit TaskHandle(Task<ResultType>* task);
73
82 ResultType get() const;
83
84private:
85 Task<ResultType>* _task;
86
87 friend class Exkit;
88};
89
90// ------------------------- Implementation of template methods -------------------------
91
92template <typename ResultType>
94 if constexpr (std::is_void_v<ResultType>) {
95 handle.get();
96 return std::tuple<>{};
97 } else {
98 return std::tuple{ handle.get() };
99 }
100}
101
102template <typename... ResultTypes>
104 return std::tuple_cat(dependency_value(deps)...);
105}
106
107template <typename ResultType>
108Task<ResultType>::Task(std::function<ResultType()> function) : _function(std::move(function)), _future(_promise.get_future().share()) {}
109
110template <typename ResultType>
112 try {
113 if constexpr (std::is_void_v<ResultType>) {
114 _function();
115 _promise.set_value();
116 } else {
117 ResultType result = _function();
118 _promise.set_value(result);
119 }
120 } catch (...) {
121 _promise.set_exception(std::current_exception());
122 }
123}
124
125template <typename ResultType>
127 if constexpr (std::is_void_v<ResultType>) {
128 _future.get();
129 } else {
130 return _future.get();
131 }
132}
133
134template <typename ResultType>
136
137template <typename ResultType>
138ResultType TaskHandle<ResultType>::get() const {
139 return _task->get();
140}
Definition: exkit.hpp:12
auto task(FunctionType &&function)
Creates a new task with the given function.
Definition: exkit.hpp:131
Definition: task.hpp:7
virtual ~ITask()=default
virtual void execute()=0
Definition: task.hpp:62
TaskHandle(Task< ResultType > *task)
Construct a new TaskHandle object.
Definition: task.hpp:135
ResultType get() const
Retrieves the result of the task referred to by this handle.
Definition: task.hpp:138
Definition: task.hpp:21
ResultType get()
Retrieves the result of the task.
Definition: task.hpp:126
Task(std::function< ResultType()> function)
Construct a new Task object.
Definition: task.hpp:108
void execute() override
Executes the task's function and sets the result in the promise.
Definition: task.hpp:111
auto dependency_value(TaskHandle< ResultType > const &handle)
Definition: task.hpp:93
auto dependency_values(TaskHandle< ResultTypes > const &... deps)
Definition: task.hpp:103