All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
MergingTransformer.h
Go to the documentation of this file.
1 #ifndef MERGING_TRANSFORMER_H
2 #define MERGING_TRANSFORMER_H
3 
4 #include <vector>
5 #include <string>
6 #include <functional>
7 
10 
11 namespace Gaudi { namespace Functional {
12 
13  template <typename Signature, typename Traits_=Traits::useDefaults> class MergingTransformer;
14 
16 
18  template <typename Out, typename In, typename Traits_>
19  class MergingTransformer<Out(const vector_of_const_<In>&),Traits_>
21  {
23  public:
26 
28  const KeyValues& inputs, const KeyValue& output);
29 
30  // derived classes can NOT implement execute
31  StatusCode execute() override final;
32 
33  virtual Out operator()(const vector_of_const_<In>& inputs) const = 0;
34 
35  private:
36  // if In is a pointer, it signals optional (as opposed to mandatory) input
37  template <typename T> using InputHandle_t = details::InputHandle_t<Traits_,typename std::remove_pointer<T>::type>;
38  std::vector<std::string> m_inputLocations; // TODO/FIXME: remove this duplication...
39  std::vector<InputHandle_t<In>> m_inputs; // and make the handles properties instead...
40  };
41 
42  template <typename Out, typename In, typename Traits_>
43  MergingTransformer<Out(const vector_of_const_<In>&),Traits_>
44  ::MergingTransformer( const std::string& name, ISvcLocator* pSvcLocator,
45  const KeyValues& inputs, const KeyValue& output )
46  : base_class( name , pSvcLocator, output )
47  , m_inputLocations( inputs.second )
48  {
49  // TODO/FIXME: replace vector of string property + call-back with a
50  // vector<handle> property ... as soon as declareProperty can deal with that.
51  auto p = this->declareProperty( inputs.first, m_inputLocations );
52  p->declareUpdateHandler( [=](Gaudi::Details::PropertyBase&) {
53  this->m_inputs = details::make_vector_of_handles<decltype(this->m_inputs)>
55  if (std::is_pointer<In>::value) { // handle constructor does not (yet) allow to set optional flag... so do it explicitly here...
56  std::for_each( this->m_inputs.begin(), this->m_inputs.end(), [](auto& h) { h.setOptional(true); } );
57  }
58  } );
59  p->useUpdateHandler(); // invoke call-back now, to be sure the input handles are synced with the property...
60  }
61 
62  template <typename Out, typename In, typename Traits_>
65  {
66  vector_of_const_<In> ins; ins.reserve(m_inputs.size());
67  std::transform(m_inputs.begin(),m_inputs.end(),
68  std::back_inserter(ins),
70  try {
71  using details::as_const;
72  details::put( std::get<0>(this->m_outputs), as_const(*this)( as_const(ins) ) );
73  } catch ( GaudiException& e ) {
74  (e.code() ? this->warning() : this->error() ) << e.message() << endmsg;
75  return e.code();
76  }
77  return StatusCode::SUCCESS;
78  }
79 
80 }}
81 
82 #endif
virtual const std::string & message() const
error message to be printed
constexpr std::add_const< T >::type & as_const(T &t) noexcept
Define general base for Gaudi exception.
The ISvcLocator is the interface implemented by the Service Factory in the Application Manager to loc...
Definition: ISvcLocator.h:25
Handles make_vector_of_handles(IDataHandleHolder *owner, const std::vector< std::string > &init, Gaudi::DataHandle::Mode mode)
StatusCode execute() override final
struct GAUDI_API vector
Parametrisation class for vector-like implementation.
STL namespace.
class MergingTransformer< Out(const vector_of_const_< In > void
virtual const StatusCode & code() const
StatusCode for Exception.
constexpr double second
STL class.
class MergingTransformer< Out(const vector_of_const_< In > Traits_
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
Gaudi::Details::PropertyBase * declareProperty(const std::string &name, TYPE &value, const std::string &doc="none")
Declare a property (templated)
PropertyBase base class allowing PropertyBase* collections to be "homogeneous".
Definition: Property.h:32
std::vector< std::string > m_inputLocations
details::InputHandle_t< Traits_, typename std::remove_pointer< T >::type > InputHandle_t
std::vector< InputHandle_t< In > > m_inputs
T back_inserter(T...args)
MergingTransformer(const std::string &name, ISvcLocator *locator, const KeyValues &inputs, const KeyValue &output)
T transform(T...args)
T for_each(T...args)
Helper functions to set/get the application return code.
Definition: __init__.py:1
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
Out1 * put(DataObjectHandle< Out1 > &out_handle, Out2 &&out)