7 #ifndef PXR_BASE_WORK_SINGULAR_TASK_H
8 #define PXR_BASE_WORK_SINGULAR_TASK_H
16 #include <type_traits>
56 template <
class Callable,
class A1,
class A2, ...
class AN>
58 Callable &&
c, A1 &&a1, A2 &&a2, ... AN &&aN);
62 template <
class Callable,
class... Args>
64 : _waker(_MakeWaker(d, std::bind(std::forward<Callable>(
c),
65 std::forward<Args>(
args)...)))
79 template <
class Dispatcher,
class Fn>
81 explicit _Waker(Dispatcher &d, Fn &&fn)
82 : _dispatcher(d), _fn(std::move(fn)) {}
84 void operator()(std::atomic_size_t &
count)
const {
94 std::size_t old =
count;
96 !count.compare_exchange_strong(old, 0));
99 Dispatcher &_dispatcher;
103 template <
class Dispatcher,
class Fn>
104 static std::function<void (std::atomic_size_t &)>
105 _MakeWaker(Dispatcher &d, Fn &&fn) {
106 return std::function<void (std::atomic_size_t &)>(
108 d, std::forward<Fn>(fn)));
111 std::function<void (std::atomic_size_t &)> _waker;
112 std::atomic_size_t _count;
117 #endif // PXR_BASE_WORK_SINGULAR_TASK_H
WorkSingularTask(WorkDispatcher &d, Callable &&c, Args &&...args)
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
#define PXR_NAMESPACE_CLOSE_SCOPE
**If you just want to fire and args
WorkSingularTask & operator=(WorkSingularTask const &)=delete
WorkSingularTask(WorkSingularTask const &)=delete