Geant4-11
Task.hh
Go to the documentation of this file.
1//
2// MIT License
3// Copyright (c) 2020 Jonathan R. Madsen
4// Permission is hereby granted, free of charge, to any person obtaining a copy
5// of this software and associated documentation files (the "Software"), to deal
6// in the Software without restriction, including without limitation the rights
7// to use, copy, modify, merge, publish, distribute, sublicense, and
8// copies of the Software, and to permit persons to whom the Software is
9// furnished to do so, subject to the following conditions:
10// The above copyright notice and this permission notice shall be included in
11// all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED
12// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
13// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
15// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
16// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
17// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
18//
19//
20// ---------------------------------------------------------------
21// Tasking class header file
22//
23// Class Description:
24//
25// This file defines the task types for TaskManager and ThreadPool
26//
27// ---------------------------------------------------------------
28// Author: Jonathan Madsen (Feb 13th 2018)
29// ---------------------------------------------------------------
30
31#pragma once
32
33#include "Globals.hh"
34#include "VTask.hh"
35
36#include <cstdint>
37#include <functional>
38#include <stdexcept>
39
40namespace PTL
41{
42class ThreadPool;
43
44//======================================================================================//
45
47template <typename RetT>
48class TaskFuture : public VTask
49{
50public:
51 typedef std::promise<RetT> promise_type;
52 typedef std::future<RetT> future_type;
53 typedef RetT result_type;
54
55public:
56 // pass a free function pointer
57 template <typename... Args>
58 TaskFuture(Args&&... args)
59 : VTask{ std::forward<Args>(args)... }
60 {}
61
62 virtual ~TaskFuture() = default;
63
64 TaskFuture(const TaskFuture&) = delete;
65 TaskFuture& operator=(const TaskFuture&) = delete;
66
67 TaskFuture(TaskFuture&&) = default;
69
70public:
71 // execution operator
72 virtual future_type get_future() = 0;
73 virtual void wait() = 0;
74 virtual RetT get() = 0;
75};
76
77//======================================================================================//
78
80template <typename RetT, typename... Args>
81class PackagedTask : public TaskFuture<RetT>
82{
83public:
84 typedef PackagedTask<RetT, Args...> this_type;
85 typedef std::promise<RetT> promise_type;
86 typedef std::future<RetT> future_type;
87 typedef std::packaged_task<RetT(Args...)> packaged_task_type;
88 typedef RetT result_type;
89 typedef std::tuple<Args...> tuple_type;
90
91public:
92 // pass a free function pointer
93 template <typename FuncT>
94 PackagedTask(FuncT func, Args... args)
95 : TaskFuture<RetT>{ true, 0 }
96 , m_ptask{ std::move(func) }
97 , m_args{ args... }
98 {}
99
100 template <typename FuncT>
101 PackagedTask(bool _is_native, intmax_t _depth, FuncT func, Args... args)
102 : TaskFuture<RetT>{ _is_native, _depth }
103 , m_ptask{ std::move(func) }
104 , m_args{ args... }
105 {}
106
107 virtual ~PackagedTask() = default;
108
109 PackagedTask(const PackagedTask&) = delete;
111
114
115public:
116 // execution operator
117 virtual void operator()() final { mpl::apply(std::move(m_ptask), std::move(m_args)); }
118 virtual future_type get_future() final { return m_ptask.get_future(); }
119 virtual void wait() final { return m_ptask.get_future().wait(); }
120 virtual RetT get() final { return m_ptask.get_future().get(); }
121
122private:
125};
126
127//======================================================================================//
128
130template <typename RetT, typename... Args>
131class Task : public TaskFuture<RetT>
132{
133public:
134 typedef Task<RetT, Args...> this_type;
135 typedef std::promise<RetT> promise_type;
136 typedef std::future<RetT> future_type;
137 typedef std::packaged_task<RetT(Args...)> packaged_task_type;
138 typedef RetT result_type;
139 typedef std::tuple<Args...> tuple_type;
140
141public:
142 template <typename FuncT>
143 Task(FuncT func, Args... args)
144 : TaskFuture<RetT>{}
145 , m_ptask{ std::move(func) }
146 , m_args{ args... }
147 {}
148
149 template <typename FuncT>
150 Task(bool _is_native, intmax_t _depth, FuncT func, Args... args)
151 : TaskFuture<RetT>{ _is_native, _depth }
152 , m_ptask{ std::move(func) }
153 , m_args{ args... }
154 {}
155
156 virtual ~Task() = default;
157
158 Task(const Task&) = delete;
159 Task& operator=(const Task&) = delete;
160
161 Task(Task&&) = default;
162 Task& operator=(Task&&) = default;
163
164public:
165 // execution operator
166 virtual void operator()() final
167 {
168 if(m_ptask.valid())
169 mpl::apply(std::move(m_ptask), std::move(m_args));
170 }
171 virtual future_type get_future() final { return m_ptask.get_future(); }
172 virtual void wait() final { return m_ptask.get_future().wait(); }
173 virtual RetT get() final { return m_ptask.get_future().get(); }
174
175private:
178};
179
180//======================================================================================//
181
183template <typename RetT>
184class Task<RetT, void> : public TaskFuture<RetT>
185{
186public:
188 typedef std::promise<RetT> promise_type;
189 typedef std::future<RetT> future_type;
190 typedef std::packaged_task<RetT()> packaged_task_type;
191 typedef RetT result_type;
192
193public:
194 template <typename FuncT>
195 Task(FuncT func)
196 : TaskFuture<RetT>()
197 , m_ptask{ std::move(func) }
198 {}
199
200 template <typename FuncT>
201 Task(bool _is_native, intmax_t _depth, FuncT func)
202 : TaskFuture<RetT>{ _is_native, _depth }
203 , m_ptask{ std::move(func) }
204 {}
205
206 virtual ~Task() = default;
207
208 Task(const Task&) = delete;
209 Task& operator=(const Task&) = delete;
210
211 Task(Task&&) = default;
212 Task& operator=(Task&&) = default;
213
214public:
215 // execution operator
216 virtual void operator()() final { m_ptask(); }
217 virtual future_type get_future() final { return m_ptask.get_future(); }
218 virtual void wait() final { return m_ptask.get_future().wait(); }
219 virtual RetT get() final { return m_ptask.get_future().get(); }
220
221private:
223};
224
225//======================================================================================//
226
228template <>
229class Task<void, void> : public TaskFuture<void>
230{
231public:
232 typedef void RetT;
234 typedef std::promise<RetT> promise_type;
235 typedef std::future<RetT> future_type;
236 typedef std::packaged_task<RetT()> packaged_task_type;
238
239public:
240 template <typename FuncT>
241 explicit Task(FuncT func)
242 : TaskFuture<RetT>{}
243 , m_ptask{ std::move(func) }
244 {}
245
246 template <typename FuncT>
247 Task(bool _is_native, intmax_t _depth, FuncT func)
248 : TaskFuture<RetT>{ _is_native, _depth }
249 , m_ptask{ std::move(func) }
250 {}
251
252 virtual ~Task() = default;
253
254 Task(const Task&) = delete;
255 Task& operator=(const Task&) = delete;
256
257 Task(Task&&) = default;
258 Task& operator=(Task&&) = default;
259
260public:
261 // execution operator
262 virtual void operator()() final { m_ptask(); }
263 virtual future_type get_future() final { return m_ptask.get_future(); }
264 virtual void wait() final { return m_ptask.get_future().wait(); }
265 virtual RetT get() final { return m_ptask.get_future().get(); }
266
267private:
269};
270
271//======================================================================================//
272
273} // namespace PTL
static char ** args
Definition: G4Xt.cc:51
The task class is supplied to thread_pool.
Definition: Task.hh:82
PackagedTask(const PackagedTask &)=delete
std::packaged_task< RetT(Args...)> packaged_task_type
Definition: Task.hh:87
RetT result_type
Definition: Task.hh:88
std::tuple< Args... > tuple_type
Definition: Task.hh:89
std::promise< RetT > promise_type
Definition: Task.hh:85
PackagedTask(bool _is_native, intmax_t _depth, FuncT func, Args... args)
Definition: Task.hh:101
PackagedTask(FuncT func, Args... args)
Definition: Task.hh:94
tuple_type m_args
Definition: Task.hh:124
virtual future_type get_future() final
Definition: Task.hh:118
packaged_task_type m_ptask
Definition: Task.hh:123
virtual RetT get() final
Definition: Task.hh:120
PackagedTask & operator=(const PackagedTask &)=delete
virtual ~PackagedTask()=default
PackagedTask & operator=(PackagedTask &&)=default
std::future< RetT > future_type
Definition: Task.hh:86
virtual void wait() final
Definition: Task.hh:119
virtual void operator()() final
Definition: Task.hh:117
PackagedTask< RetT, Args... > this_type
Definition: Task.hh:84
PackagedTask(PackagedTask &&)=default
The task class is supplied to thread_pool.
Definition: Task.hh:49
TaskFuture(const TaskFuture &)=delete
TaskFuture & operator=(const TaskFuture &)=delete
std::future< RetT > future_type
Definition: Task.hh:52
virtual RetT get()=0
TaskFuture(Args &&... args)
Definition: Task.hh:58
virtual ~TaskFuture()=default
TaskFuture(TaskFuture &&)=default
TaskFuture & operator=(TaskFuture &&)=default
virtual future_type get_future()=0
RetT result_type
Definition: Task.hh:53
std::promise< RetT > promise_type
Definition: Task.hh:51
virtual void wait()=0
Task & operator=(const Task &)=delete
std::promise< RetT > promise_type
Definition: Task.hh:188
Task(bool _is_native, intmax_t _depth, FuncT func)
Definition: Task.hh:201
std::packaged_task< RetT()> packaged_task_type
Definition: Task.hh:190
Task(const Task &)=delete
virtual ~Task()=default
Task(Task &&)=default
Task & operator=(Task &&)=default
virtual RetT get() final
Definition: Task.hh:219
Task< RetT > this_type
Definition: Task.hh:187
virtual future_type get_future() final
Definition: Task.hh:217
std::future< RetT > future_type
Definition: Task.hh:189
Task(FuncT func)
Definition: Task.hh:195
virtual void wait() final
Definition: Task.hh:218
virtual void operator()() final
Definition: Task.hh:216
The task class is supplied to thread_pool.
Definition: Task.hh:230
Task & operator=(Task &&)=default
Task & operator=(const Task &)=delete
Task(Task &&)=default
std::future< RetT > future_type
Definition: Task.hh:235
virtual RetT get() final
Definition: Task.hh:265
virtual ~Task()=default
Task(FuncT func)
Definition: Task.hh:241
std::packaged_task< RetT()> packaged_task_type
Definition: Task.hh:236
Task(bool _is_native, intmax_t _depth, FuncT func)
Definition: Task.hh:247
virtual void operator()() final
Definition: Task.hh:262
Task< void, void > this_type
Definition: Task.hh:233
virtual void wait() final
Definition: Task.hh:264
Task(const Task &)=delete
std::promise< RetT > promise_type
Definition: Task.hh:234
virtual future_type get_future() final
Definition: Task.hh:263
The task class is supplied to thread_pool.
Definition: Task.hh:132
Task(Task &&)=default
Task & operator=(const Task &)=delete
Task(FuncT func, Args... args)
Definition: Task.hh:143
std::tuple< Args... > tuple_type
Definition: Task.hh:139
Task & operator=(Task &&)=default
virtual ~Task()=default
std::promise< RetT > promise_type
Definition: Task.hh:135
tuple_type m_args
Definition: Task.hh:177
std::future< RetT > future_type
Definition: Task.hh:136
RetT result_type
Definition: Task.hh:138
virtual void wait() final
Definition: Task.hh:172
virtual void operator()() final
Definition: Task.hh:166
Task(bool _is_native, intmax_t _depth, FuncT func, Args... args)
Definition: Task.hh:150
Task(const Task &)=delete
std::packaged_task< RetT(Args...)> packaged_task_type
Definition: Task.hh:137
packaged_task_type m_ptask
Definition: Task.hh:176
virtual RetT get() final
Definition: Task.hh:173
Task< RetT, Args... > this_type
Definition: Task.hh:134
virtual future_type get_future() final
Definition: Task.hh:171
VTask is the abstract class stored in thread_pool.
Definition: VTask.hh:54
static void apply(FnT &&_func, TupleT &&_args)
Definition: Globals.hh:196
Definition: AutoLock.hh:254