28 template <
class Executor,
class Allocator = std::allocator<
char>>
38 using RS = decltype(selector);
39 using F = std::conditional_t<
43 using Out = decltype(out);
45 typename std::allocator_traits<Allocator>::template rebind_alloc<char>
47 auto shared_state = std::allocate_shared<std::tuple<
52 std::atomic<decltype(init(input))>,
53 std::atomic<std::size_t>,
54 std::atomic<std::size_t>
61 (decltype(func)&&)func,
65 e |
op::submit([e, sb, se, shared_state](
auto) {
66 auto stepDone = [](
auto shared_state) {
68 if (--std::get<5>(*shared_state) == 0) {
70 if (std::get<0>(*shared_state)) {
72 std::get<1>(*shared_state), std::get<0>(*shared_state));
77 auto result = std::get<2>(*shared_state)(
78 std::move(std::get<4>(*shared_state).load()));
82 std::get<1>(*shared_state), std::current_exception());
86 for (decltype(sb) idx{sb}; idx != se;
87 ++idx, ++std::get<5>(*shared_state)) {
88 e |
op::submit([shared_state, idx, stepDone](
auto ex) {
91 auto old = std::get<4>(*shared_state).load();
96 std::get<3> (*shared_state)(step, idx);
97 }
while (!std::get<4>(*shared_state)
98 .compare_exchange_strong(old, step));
101 if (std::get<6>(*shared_state)++ == 0) {
103 std::get<0>(*shared_state) = std::current_exception();
106 stepDone(shared_state);
109 stepDone(shared_state);
122 std::vector<int>
vec(10);
123 std::fill(vec.begin(), vec.end(), 4);
134 std::cout <<
"OK" << std::endl;
void accumulate(std::vector< std::size_t > &a, std::vector< std::size_t > const &d)
constexpr detail::Map< Move > move
auto naive_executor_bulk_target(Executor e, Allocator a=Allocator{})
PUSHMI_INLINE_VAR constexpr __adl::set_error_fn set_error
void init(int *argc, char ***argv, bool removeFlags)
static const char *const value
PUSHMI_INLINE_VAR constexpr __adl::set_value_fn set_value
PUSHMI_INLINE_VAR constexpr struct folly::pushmi::reduce_fn reduce