18 std::function<void(std::future<T>)> fun;
19 std::atomic_flag done = ATOMIC_FLAG_INIT;
23 Callback(std::function<
void(std::future<T>)> fun) : fun(fun) { }
26 Callback(Callback && callback)
noexcept(std::is_nothrow_move_constructible_v<
decltype(fun)>)
27 : fun(std::move(callback.fun))
29 auto prev = callback.done.test_and_set();
30 if (prev) done.test_and_set();
33 void operator()(T &&
t)
noexcept
35 auto prev = done.test_and_set();
37 std::promise<T> promise;
38 promise.set_value(std::move(
t));
39 fun(promise.get_future());
42 void rethrow(
const std::exception_ptr & exc = std::current_exception())
noexcept
44 auto prev = done.test_and_set();
46 std::promise<T> promise;
47 promise.set_exception(exc);
48 fun(promise.get_future());