57 template <
class Dispatcher,
class Callable,
class A1,
class A2, ...
class AN>
59 Callable &&c, A1 &&a1, A2 &&a2, ... AN &&aN);
63 template <
class Dispatcher,
class Callable,
class... Args>
65 : _waker(_MakeWaker(d,
std::bind(
std::forward<Callable>(c),
66 std::forward<Args>(args)...)))
80 template <
class Dispatcher,
class Fn>
82 explicit _Waker(Dispatcher &d, Fn &&fn)
83 : _dispatcher(d), _fn(
std::move(fn)) {}
85 void operator()(std::atomic_size_t &count)
const {
95 std::size_t old = count;
97 !count.compare_exchange_strong(old, 0));
100 Dispatcher &_dispatcher;
104 template <
class Dispatcher,
class Fn>
105 static std::function<void (std::atomic_size_t &)>
106 _MakeWaker(Dispatcher &d, Fn &&fn) {
107 return std::function<void (std::atomic_size_t &)>(
108 _Waker<Dispatcher,
typename std::decay<Fn>::type>(
109 d, std::forward<Fn>(fn)));
112 std::function<void (std::atomic_size_t &)> _waker;
113 std::atomic_size_t _count;
WorkSingularTask(Dispatcher &dispatcher, Callable &&c, A1 &&a1, A2 &&a2,... AN &&aN)
Create a singular task to be run in dispatcher.