- /** Wrap a (possibly non-copyable) single-use task into a `std::function` */
- template<class F, class... Args>
- class Task {
- public:
- Task(F&& code, Args&&... args) :
- code_(std::forward<F>(code)),
- args_(std::forward<Args>(args)...)
- {
- done_.clear();
- }
- void operator()()
- {
- if (done_.test_and_set())
- throw std::logic_error("Actor task already executed");
- simgrid::xbt::apply(std::move(code_), std::move(args_));
- }
- private:
- std::atomic_flag done_;
- F code_;
- std::tuple<Args...> args_;
- };