The Gaudi Framework  v30r3 (a5ef0a68)
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
7 {
8  namespace Functional
9  {
10 
11  // Scalar->Vector adapted N->1 algorithm
12  template <typename ScalarOp, typename TransformerSignature, typename Traits_ = Traits::useDefaults>
14  template <typename ScalarOp, typename Out, typename... In, typename Traits_>
15  class ScalarTransformer<ScalarOp, Out( const In&... ), Traits_> : public Transformer<Out( const In&... ), Traits_>
16  {
17 
19  const ScalarOp& scalarOp() const { return static_cast<const ScalarOp&>( *this ); }
20 
21  public:
22  using Transformer<Out( const In&... ), Traits_>::Transformer;
23 
25  Out operator()( const In&... in ) const override final
26  {
27  const auto inrange = details::zip::const_range( in... );
28  Out out;
29  out.reserve( inrange.size() );
30  auto& scalar = scalarOp();
31  for ( const auto&& tuple : inrange ) {
34  out, Gaudi::apply( [&]( const auto&... i ) { return scalar( details::deref( i )... ); }, tuple ) );
35  }
36  details::applyPostProcessing( scalar, out );
37  return out;
38  }
39  };
40 
41  // Scalar->Vector adapted N->M algorithm
42  template <typename ScalarOp, typename TransformerSignature, typename Traits_ = Traits::useDefaults>
44  template <typename ScalarOp, typename... Out, typename... In, typename Traits_>
45  class MultiScalarTransformer<ScalarOp, std::tuple<Out...>( const In&... ), Traits_>
46  : public MultiTransformer<std::tuple<Out...>( const In&... ), Traits_>
47  {
48 
50  const ScalarOp& scalarOp() const { return static_cast<const ScalarOp&>( *this ); }
51 
52  public:
53  using MultiTransformer<std::tuple<Out...>( const In&... ), Traits_>::MultiTransformer;
54 
56  std::tuple<Out...> operator()( const In&... in ) const final
57  {
58  const auto inrange = details::zip::const_range( in... );
59  std::tuple<Out...> out;
61  [sz = inrange.size()]( auto&&... o ) {
62 #if __cplusplus < 201703L
63  (void)std::initializer_list<int>{( o.reserve( sz ), 0 )...};
64 #else
65  ( o.reserve( sz ), ... );
66 #endif
67  },
68  out );
69  auto& scalar = scalarOp();
70  for ( const auto&& tuple : inrange ) {
72  [&scalar, &tuple]( auto&... out ) {
74  auto data = Gaudi::apply(
75  [&scalar]( const auto&... args ) { return scalar( details::deref( args )... ); }, tuple );
76  if ( data ) {
78  [&out...]( auto&&... data ) {
79 #if __cplusplus < 201703L
80  (void)std::initializer_list<int>{
81  ( details::insert( out, std::forward<decltype( data )>( data ) ), 0 )...};
82 #else
83  ( details::insert( out, std::forward<decltype( data )>( data ) ), ... );
84 #endif
85  },
86  std::move( *data ) );
87  }
88  },
89  out );
90  }
91  details::applyPostProcessing( scalar, out ); // awaiting a post-processor call
92  return out;
93  }
94  };
95  }
96 }
97 
98 #endif
constexpr struct Gaudi::Functional::details::insert_t insert
STL namespace.
class MergingTransformer< Out(const vector_of_const_< In > void
decltype(auto) constexpr apply(F &&f, Tuple &&t) noexcept(noexcept( detail::apply_impl(std::forward< F >(f), std::forward< Tuple >(t), std::make_index_sequence< std::tuple_size< std::remove_reference_t< Tuple >>::value >{})))
Definition: apply.h:31
constexpr struct Gaudi::Functional::details::deref_t deref
std::tuple< Out... > operator()(const In &...in) const final
The main operator.
constexpr void applyPostProcessing(const Fun &, Container &, Args...)
const ScalarOp & scalarOp() const
Access the scalar operator.
T move(T...args)
Out operator()(const In &...in) const override final
The main operator.
struct[[deprecated("use MergingTransformer instead")]] Traits_
decltype(auto) const_range(Args &&...args)
Zips multiple containers together to form a single const range.
T forward(T...args)
Helper functions to set/get the application return code.
Definition: __init__.py:1