Lely core libraries  2.2.5
task.hpp
Go to the documentation of this file.
1 
24 #ifndef LELY_EV_TASK_HPP_
25 #define LELY_EV_TASK_HPP_
26 
27 #include <lely/ev/task.h>
28 #include <lely/util/invoker.hpp>
29 
30 #include <functional>
31 #include <utility>
32 
33 namespace lely {
34 namespace ev {
35 
36 class Executor;
37 
38 namespace detail {
39 
40 template <class Invoker>
41 class TaskWrapper : public ev_task {
42  public:
43  template <class F, class... Args>
44  TaskWrapper(ev_exec_t* exec, F&& f, Args&&... args)
46  [](ev_task * task) noexcept {
47  auto self = static_cast<TaskWrapper*>(task);
48  self->invoker_();
49  delete self;
50  }),
51  invoker_(::std::forward<F>(f), ::std::forward<Args>(args)...) {}
52 
53  TaskWrapper(const TaskWrapper&) = delete;
54 
55  TaskWrapper& operator=(const TaskWrapper&) = delete;
56 
57  private:
58  Invoker invoker_;
59 };
60 
61 } // namespace detail
62 
67 template <class F, class... Args>
69 
75 template <class F, class... Args>
76 inline TaskWrapper<F, Args...>*
77 make_task_wrapper(ev_exec_t* exec, F&& f, Args&&... args) {
78  return new TaskWrapper<F, Args...>(exec, ::std::forward<F>(f),
79  ::std::forward<Args>(args)...);
80 }
81 
86 class Task : public ev_task {
87  public:
88  using Signature = void();
89 
94  template <class F>
95  Task(ev_exec_t* exec, F&& f)
97  [](ev_task * task) noexcept {
98  auto self = static_cast<Task*>(task);
99  if (self->func_) self->func_();
100  }),
101  func_(::std::forward<F>(f)) {}
102 
104  template <class F>
105  explicit Task(F&& f) : Task(nullptr, ::std::forward<F>(f)) {}
106 
107  Task(const Task&) = delete;
108 
109  Task& operator=(const Task&) = delete;
110 
112  Executor get_executor() const noexcept;
113 
114  private:
115  ::std::function<Signature> func_;
116 };
117 
118 } // namespace ev
119 } // namespace lely
120 
121 #endif // !LELY_EV_TASK_HPP_
lely::ev::detail::TaskWrapper
Definition: task.hpp:41
ev_exec_t
const struct ev_exec_vtbl *const ev_exec_t
An abstract task executor.
Definition: ev.h:29
task.h
lely::ev::make_task_wrapper
TaskWrapper< F, Args... > * make_task_wrapper(ev_exec_t *exec, F &&f, Args &&... args)
Creates a temporary task from a callable object with an associated executor (can be nullptr).
Definition: task.hpp:77
invoker.hpp
lely::ev::Task
A basic task.
Definition: task.hpp:86
lely::ev::Task::get_executor
Executor get_executor() const noexcept
Returns the executor to which the task is (to be) submitted.
Definition: exec.hpp:128
lely::ev::Executor
An abstract task executor. This class is a wrapper around #ev_exec_t*.
Definition: exec.hpp:38
ev_task
An executable task.
Definition: task.h:41
EV_TASK_INIT
#define EV_TASK_INIT(exec, func)
The static initializer for ev_task.
Definition: task.h:53
lely::ev::Task::Task
Task(F &&f)
Constructs a task from a callable object.
Definition: task.hpp:105
lely::ev::Task::Task
Task(ev_exec_t *exec, F &&f)
Constructs a task from a callable object with an associated executor (can be nullptr).
Definition: task.hpp:95
lely::util::detail::invoker
Definition: invoker.hpp:37
ev_task::exec
ev_exec_t * exec
A pointer to the executor to which the task is (to be) submitted.
Definition: task.h:43