17 template <
typename Fun,
typename Container>
19 if constexpr (
requires { fun.postprocess( c ); } ) { fun.postprocess( c ); }
24 template <
typename ScalarOp,
typename TransformerSignature,
typename Traits_ = Traits::useDefaults>
26 template <
typename ScalarOp,
typename Out,
typename... In,
typename Traits_>
27 class ScalarTransformer<ScalarOp, Out( const In&... ), Traits_> : public Transformer<Out( const In&... ), Traits_> {
30 const ScalarOp&
scalarOp()
const {
return static_cast<const ScalarOp&
>( *this ); }
33 using Transformer<Out(
const In&... ), Traits_>::Transformer;
39 out.reserve( inrange.size() );
41 for (
const auto& tuple : inrange ) {
44 [&out](
auto&& arg ) {
details::insert( out, std::forward<
decltype( arg )>( arg ) ); },
45 std::apply( [&](
const auto&... i ) {
return scalar(
details::deref( i )... ); }, tuple ) );
53 template <
typename ScalarOp,
typename TransformerSignature,
typename Traits_ = Traits::useDefaults>
55 template <
typename ScalarOp,
typename... Out,
typename... In,
typename Traits_>
57 :
public MultiTransformer<std::tuple<Out...>( const In&... ), Traits_> {
60 const ScalarOp&
scalarOp()
const {
return static_cast<const ScalarOp&
>( *this ); }
63 using MultiTransformer<std::tuple<Out...>(
const In&... ), Traits_>::MultiTransformer;
66 std::tuple<Out...>
operator()(
const In&... in )
const override final {
68 std::tuple<Out...> out;
69 std::apply( [sz = inrange.size()](
auto&&... o ) { ( o.reserve( sz ), ... ); }, out );
71 for (
const auto& indata : inrange ) {
73 [&scalar, &indata](
auto&... out ) {
78 [&out...](
auto&& outdata ) {
80 [&out...]( auto&&... outdata1 ) {
81 ( details::insert( out, std::forward<decltype( outdata1 )>( outdata1 ) ), ... );
83 std::forward<
decltype( outdata )>( outdata ) );
85 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.
void applyPostProcessing(const Fun &fun, Container &c)
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