7 #include <execution/Executor.h> 
    8 #include <preprocessor/utils.h> 
   19                 using type = TupleType;
 
   20                 FlowsResult( TupleType&& tt ) : tup( std::move( tt ) ){};
 
   27                 template <
int n, 
class ResultTuple, 
class Flow,
 
   28                           class ExecutionAgent, 
class TArg>
 
   30                                   std::exception_ptr& except,
 
   31                                   ResultTuple& output, Flow&& f )
 
   35                     if constexpr ( std::is_nothrow_invocable<
 
   39                         std::get<n>( output ) = f( fut );
 
   45                             std::get<n>( output ) = f( fut );
 
   50                                 except = std::current_exception();
 
   54                 template <
int n, 
class ResultTuple, 
class ExecutionAgent,
 
   55                           class TArg, 
class Flow, 
class... Flows>
 
   56                 void _invokeFlow( ExFuture<ExecutionAgent, TArg> fut,
 
   57                                   std::exception_ptr& except,
 
   58                                   ResultTuple& output, Flow&& f, Flows&&... fs )
 
   60                     _invokeFlow<n>( fut, except, output,
 
   61                                     std::forward<Flow>( f ) );
 
   62                     _invokeFlow<n + 1>( fut, except, output,
 
   63                                         std::forward<Flows>( fs )... );
 
   65                 template <
class ExecutionAgent, 
class T, 
size_t... Is>
 
   66                 auto _forwardOnAll( Executor<ExecutionAgent> ex, T&& tup,
 
   67                                     std::index_sequence<Is...> )
 
   82             template <
class TArg, 
class ExecutorAgent, 
class... Flows>
 
   83             FlowsResult<typename ::mel::execution::_private::GetReturn<
 
   84                 ExFuture<ExecutorAgent, TArg>, Flows...>::type>
 
   87                 typedef typename ::mel::execution::_private::GetReturn<
 
   93                 _private::_invokeFlow<0>( source, except, output,
 
   94                                           std::move( flows )... );
 
  101             template <
class ExecutionAgent, 
class TupleFlow>
 
  107                 constexpr 
size_t ts = std::tuple_size<
 
  108                     typename std::remove_reference_t<TupleFlow>::type>::value;
 
  109                 return _private::_forwardOnAll(
 
  110                     ex, f.tup, std::make_index_sequence<ts>{} );
 
  120                     template <
class TupleType>
 
  123                         return on_all( mEx, std::move( fr ) );
 
  125                     template <
class TupleType>
 
  134                     template <
class... Fs>
 
  136                         : mFuncs( std::forward<Fs>( fs )... )
 
  139                     std::tuple<Flows...> mFuncs;
 
  140                     template <
class TArg, 
class ExecutorAgent>
 
  145                                            std::get<Flows>( mFuncs ) )... );
 
  151             template <
class... Flows>
 
  155                     std::forward<Flows>( flows )... );
 
  157             template <
class ExecutionAgent>
 
  160                 return _private::ApplyOnAll<ExecutionAgent>( ex );
 
  165             template <
class TupleType, 
class U>
 
  170             template <
class TupleType, 
class U>
 
  171             auto operator|( FlowsResult<TupleType>&& input, U&& u )
 
  173                 return u( std::move( input ) );
 
Extension of mel::core::Future to apply to executors.
Definition: ExFuture.h:21
 
FlowsResult< typename ::mel::execution::_private::GetReturn< ExFuture< ExecutorAgent, TArg >, Flows... >::type > launch(ExFuture< ExecutorAgent, TArg > source, Flows... flows)
Launch given set of flows.
Definition: Launch.h:85
 
auto operator|(const FlowsResult< TupleType > &input, U &&u)
overload operator | for chaining a FlowsResult
Definition: Launch.h:166
 
auto on_all(Executor< ExecutionAgent > ex, TupleFlow &&f)
Takes a tuple with the results of execution of some flows and does a execution::on_all.
Definition: Launch.h:102
 
auto on_all(Executor< ExecutorAgent > ex, FTypes... futs)
return ExFuture which will be executed, in the context of the given executor ex, when all the given E...
Definition: Executor.h:1161
 
Definition: Callback_Impl.h:11
 
!brief tuple wrapper for holding result of flows execution
Definition: Launch.h:18