The Gaudi Framework  v32r2 (46d42edc)
ScalarTransformer.h
Go to the documentation of this file.
1 #ifndef SCALAR_TRANSFORMER_H
2 #define SCALAR_TRANSFORMER_H
3 
4 #include "GaudiAlg/Transformer.h"
5 
6 namespace Gaudi::Functional {
7 
8  // Scalar->Vector adapted N->1 algorithm
9  template <typename ScalarOp, typename TransformerSignature, typename Traits_ = Traits::useDefaults>
11  template <typename ScalarOp, typename Out, typename... In, typename Traits_>
12  class ScalarTransformer<ScalarOp, Out( const In&... ), Traits_> : public Transformer<Out( const In&... ), Traits_> {
13 
15  const ScalarOp& scalarOp() const { return static_cast<const ScalarOp&>( *this ); }
16 
17  public:
18  using Transformer<Out( const In&... ), Traits_>::Transformer;
19 
21  Out operator()( const In&... in ) const override final {
22  const auto inrange = details::zip::range( in... );
23  Out out;
24  out.reserve( inrange.size() );
25  auto& scalar = scalarOp();
26  for ( const auto&& tuple : inrange ) {
29  [&out]( auto&& arg ) { details::insert( out, std::forward<decltype( arg )>( arg ) ); },
30  std::apply( [&]( const auto&... i ) { return scalar( details::deref( i )... ); }, tuple ) );
31  }
32  details::applyPostProcessing( scalar, out );
33  return out;
34  }
35  };
36 
37  // Scalar->Vector adapted N->M algorithm
38  template <typename ScalarOp, typename TransformerSignature, typename Traits_ = Traits::useDefaults>
40  template <typename ScalarOp, typename... Out, typename... In, typename Traits_>
41  class MultiScalarTransformer<ScalarOp, std::tuple<Out...>( const In&... ), Traits_>
42  : public MultiTransformer<std::tuple<Out...>( const In&... ), Traits_> {
43 
45  const ScalarOp& scalarOp() const { return static_cast<const ScalarOp&>( *this ); }
46 
47  public:
48  using MultiTransformer<std::tuple<Out...>( const In&... ), Traits_>::MultiTransformer;
49 
51  std::tuple<Out...> operator()( const In&... in ) const override final {
52  const auto inrange = details::zip::range( in... );
53  std::tuple<Out...> out;
54  std::apply( [sz = inrange.size()]( auto&&... o ) { ( o.reserve( sz ), ... ); }, out );
55  auto& scalar = scalarOp();
56  for ( const auto&& indata : inrange ) {
57  std::apply(
58  [&scalar, &indata]( auto&... out ) {
63  [&out...]( auto&& outdata ) {
64  GF_SUPPRESS_SPURIOUS_CLANG_WARNING_BEGIN
65  std::apply(
66  [&out...]( auto&&... outdata1 ) {
67  ( details::insert( out, std::forward<decltype( outdata1 )>( outdata1 ) ), ... );
68  },
69  std::forward<decltype( outdata )>( outdata ) );
71  },
72  std::apply( [&scalar]( const auto&... args ) { return scalar( details::deref( args )... ); },
73  indata ) );
74  },
75  out );
76  }
77  details::applyPostProcessing( scalar, out );
78  return out;
79  }
80  };
81 } // namespace Gaudi::Functional
82 
83 #endif
STL namespace.
constexpr void applyPostProcessing(const Fun &, Container &, Args...)
details::MultiTransformer< Signature, Traits_, details::isLegacy< Traits_ > > MultiTransformer
Definition: Transformer.h:201
Out operator()(const In &... in) const override final
The main operator.
details::Transformer< Signature, Traits_, details::isLegacy< Traits_ > > Transformer
Definition: Transformer.h:198
constexpr struct ranges::Gaudi::Functional::details::insert_t insert
decltype(auto) range(Args &&... args)
Zips multiple containers together to form a single range.
#define GF_SUPPRESS_SPURIOUS_CLANG_WARNING_END
constexpr struct ranges::Gaudi::Functional::details::deref_t deref
constexpr struct ranges::Gaudi::Functional::details::invoke_optionally_t invoke_optionally
T forward(T... args)
std::tuple< Out... > operator()(const In &... in) const override final
The main operator.