Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  v36r11 (bdb84f5f)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
ScalarTransformer.h
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 #ifndef SCALAR_TRANSFORMER_H
12 #define SCALAR_TRANSFORMER_H
13 
14 #include "GaudiAlg/Transformer.h"
15 
16 namespace Gaudi::Functional {
17 
18  // Scalar->Vector adapted N->1 algorithm
19  template <typename ScalarOp, typename TransformerSignature, typename Traits_ = Traits::useDefaults>
21  template <typename ScalarOp, typename Out, typename... In, typename Traits_>
22  class ScalarTransformer<ScalarOp, Out( const In&... ), Traits_> : public Transformer<Out( const In&... ), Traits_> {
23 
25  const ScalarOp& scalarOp() const { return static_cast<const ScalarOp&>( *this ); }
26 
27  public:
28  using Transformer<Out( const In&... ), Traits_>::Transformer;
29 
31  Out operator()( const In&... in ) const override final {
32  const auto inrange = details::zip::range( in... );
33  Out out;
34  out.reserve( inrange.size() );
35  auto& scalar = scalarOp();
36  for ( const auto&& tuple : inrange ) {
39  [&out]( auto&& arg ) { details::insert( out, std::forward<decltype( arg )>( arg ) ); },
40  std::apply( [&]( const auto&... i ) { return scalar( details::deref( i )... ); }, tuple ) );
41  }
43  return out;
44  }
45  };
46 
47  // Scalar->Vector adapted N->M algorithm
48  template <typename ScalarOp, typename TransformerSignature, typename Traits_ = Traits::useDefaults>
50  template <typename ScalarOp, typename... Out, typename... In, typename Traits_>
51  class MultiScalarTransformer<ScalarOp, std::tuple<Out...>( const In&... ), Traits_>
52  : public MultiTransformer<std::tuple<Out...>( const In&... ), Traits_> {
53 
55  const ScalarOp& scalarOp() const { return static_cast<const ScalarOp&>( *this ); }
56 
57  public:
58  using MultiTransformer<std::tuple<Out...>( const In&... ), Traits_>::MultiTransformer;
59 
61  std::tuple<Out...> operator()( const In&... in ) const override final {
62  const auto inrange = details::zip::range( in... );
63  std::tuple<Out...> out;
64  std::apply( [sz = inrange.size()]( auto&&... o ) { ( o.reserve( sz ), ... ); }, out );
65  auto& scalar = scalarOp();
66  for ( const auto&& indata : inrange ) {
67  std::apply(
68  [&scalar, &indata]( auto&... out ) {
73  [&out...]( auto&& outdata ) {
74  GF_SUPPRESS_SPURIOUS_CLANG_WARNING_BEGIN
75  std::apply(
76  [&out...]( auto&&... outdata1 ) {
77  ( details::insert( out, std::forward<decltype( outdata1 )>( outdata1 ) ), ... );
78  },
79  std::forward<decltype( outdata )>( outdata ) );
81  },
82  std::apply( [&scalar]( const auto&... args ) { return scalar( details::deref( args )... ); },
83  indata ) );
84  },
85  out );
86  }
88  return out;
89  }
90  };
91 } // namespace Gaudi::Functional
92 
93 #endif
Gaudi::Functional::ScalarTransformer< ScalarOp, Out(const In &...), Traits_ >::operator()
Out operator()(const In &... in) const override final
The main operator.
Definition: ScalarTransformer.h:31
Gaudi::Functional::details::invoke_optionally
constexpr struct Gaudi::Functional::details::invoke_optionally_t invoke_optionally
Gaudi::Functional::details::applyPostProcessing
constexpr void applyPostProcessing(const Fun &, Container &, Args...)
Definition: FunctionalDetails.h:699
std::tuple
Gaudi::Functional::ScalarTransformer< ScalarOp, Out(const In &...), Traits_ >::scalarOp
const ScalarOp & scalarOp() const
Access the scalar operator.
Definition: ScalarTransformer.h:25
std::forward
T forward(T... args)
Gaudi::Functional::details::deref
constexpr struct Gaudi::Functional::details::deref_t deref
Gaudi::Functional::ScalarTransformer
Definition: ScalarTransformer.h:20
Transformer.h
Gaudi::Functional
Definition: Consumer.h:19
Gaudi::Functional::MultiScalarTransformer
Definition: ScalarTransformer.h:49
Gaudi ::Functional::MultiTransformer
details::MultiTransformer< Signature, Traits_, details::isLegacy< Traits_ > > MultiTransformer
Definition: Transformer.h:241
Gaudi::Functional::MultiScalarTransformer< ScalarOp, std::tuple< Out... >(const In &...), Traits_ >::scalarOp
const ScalarOp & scalarOp() const
Access the scalar operator.
Definition: ScalarTransformer.h:55
gaudirun.args
args
Definition: gaudirun.py:336
std
STL namespace.
Gaudi::Functional::MultiScalarTransformer< ScalarOp, std::tuple< Out... >(const In &...), Traits_ >::operator()
std::tuple< Out... > operator()(const In &... in) const override final
The main operator.
Definition: ScalarTransformer.h:61
Gaudi ::Functional::Transformer
details::Transformer< Signature, Traits_, details::isLegacy< Traits_ > > Transformer
Definition: Transformer.h:238
GF_SUPPRESS_SPURIOUS_CLANG_WARNING_END
#define GF_SUPPRESS_SPURIOUS_CLANG_WARNING_END
Definition: FunctionalDetails.h:45
Gaudi::Functional::details::insert
constexpr struct Gaudi::Functional::details::insert_t insert
Gaudi::Functional::details::zip::range
decltype(auto) range(Args &&... args)
Zips multiple containers together to form a single range.
Definition: FunctionalDetails.h:102
PrepareBase.out
out
Definition: PrepareBase.py:20