42 template <
class T,
class Executor>
44 std::experimental::standard_promise<T>,
45 std::experimental::standard_future<T, std::decay_t<Executor>>>
47 std::experimental::standard_promise<T> promise;
49 return {promise, promise.get_future(
std::move(ex))};
52 template <
class Executor,
class Function>
53 std::experimental::standard_future<
54 std::result_of_t<std::decay_t<Function>()>,
55 std::decay_t<Executor>>
57 using T = std::result_of_t<std::decay_t<Function>()>;
58 auto pc = make_promise_contract<T>(e);
59 auto p = std::get<0>(
pc);
60 auto r = std::get<1>(
pc);
61 e.execute([p,
f]()
mutable { p.set_value(
f()); });
68 template <
class Executor,
class Function>
78 std::experimental::static_thread_pool sp{
79 std::max(1u, std::thread::hardware_concurrency())};
90 std::cout <<
"OK" << std::endl;
auto twoway_execute(Executor &&e, Function &&f)
std::pair< std::experimental::standard_promise< T >, std::experimental::standard_future< T, std::decay_t< Executor > > > make_promise_contract(const Executor &e)
constexpr detail::Map< Move > move
PUSHMI_INLINE_VAR constexpr detail::transform_fn transform
std::experimental::standard_future< std::result_of_t< std::decay_t< Function >)>, std::decay_t< Executor > > twoway_execute(Executor &&e, Function &&f)