18 template <
typename ScalarOp,
typename TransformerSignature,
typename Traits_ = Traits::useDefaults>
20 template <
typename ScalarOp,
typename Out,
typename... In,
typename Traits_>
21 class ScalarTransformer<ScalarOp, Out( const In&... ), Traits_> : public Transformer<Out( const In&... ), Traits_> {
24 const ScalarOp&
scalarOp()
const {
return static_cast<const ScalarOp&
>( *this ); }
27 using Transformer<Out(
const In&... ), Traits_>::Transformer;
33 out.reserve( inrange.size() );
35 for (
const auto&& tuple : inrange ) {
38 [&out](
auto&& arg ) {
details::insert( out, std::forward<
decltype( arg )>( arg ) ); },
39 std::apply( [&](
const auto&... i ) {
return scalar(
details::deref( i )... ); }, tuple ) );
47 template <
typename ScalarOp,
typename TransformerSignature,
typename Traits_ = Traits::useDefaults>
49 template <
typename ScalarOp,
typename... Out,
typename... In,
typename Traits_>
51 :
public MultiTransformer<std::tuple<Out...>( const In&... ), Traits_> {
54 const ScalarOp&
scalarOp()
const {
return static_cast<const ScalarOp&
>( *this ); }
57 using MultiTransformer<std::tuple<Out...>(
const In&... ), Traits_>::MultiTransformer;
60 std::tuple<Out...>
operator()(
const In&... in )
const override final {
62 std::tuple<Out...> out;
63 std::apply( [sz = inrange.size()](
auto&&... o ) { ( o.reserve( sz ), ... ); }, out );
65 for (
const auto&& indata : inrange ) {
67 [&scalar, &indata](
auto&... out ) {
72 [&out...](
auto&& outdata ) {
74 [&out...]( auto&&... outdata1 ) {
75 ( details::insert( out, std::forward<decltype( outdata1 )>( outdata1 ) ), ... );
77 std::forward<
decltype( outdata )>( outdata ) );
79 std::apply( [&scalar](
const auto&... args ) {
return scalar(
details::deref( args )... ); },
decltype(auto) range(Args &&... args)
Zips multiple containers together to form a single range.
constexpr void applyPostProcessing(const Fun &, Container &, Args...)
constexpr struct Gaudi::Functional::details::deref_t deref
constexpr struct Gaudi::Functional::details::insert_t insert
constexpr struct Gaudi::Functional::details::invoke_optionally_t invoke_optionally