Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  v36r7 (7f57a304)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
SplittingMergingTransformer.h
Go to the documentation of this file.
1 /*****************************************************************************\
2 * (c) Copyright 2022 CERN for the benefit of the LHCb Collaboration *
3 * *
4 * This software is distributed under the terms of the GNU General Public *
5 * Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". *
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 
12 #pragma once
13 
17 #include <functional>
18 #include <optional>
19 #include <string>
20 #include <vector>
21 
22 namespace Gaudi::Functional {
23  template <typename Container>
25  template <typename Container>
28 
29  namespace details {
30 
31  template <typename Signature, typename Traits_, bool isLegacy>
33 
34  template <typename Out, typename In, typename Traits_>
35  class SplittingMergingTransformer<vector_of_<Out>( const vector_of_const_<In>& ), Traits_, false>
36  : public BaseClass_t<Traits_> {
38  static_assert( std::is_base_of_v<Algorithm, base_class>, "BaseClass must inherit from Algorithm" );
39 
40  public:
42 
44  const KeyValues& outputs )
45  : base_class( std::move( name ), locator )
46  , m_inputLocations{ this, inputs.first, details::to_DataObjID( inputs.second ),
48  this->m_inputs =
49  make_vector_of_handles<decltype( this->m_inputs )>( this, m_inputLocations );
50  if ( std::is_pointer_v<In> ) { // handle constructor does not (yet) allow to set
51  // optional flag... so do it
52  // explicitly here...
53  std::for_each( this->m_inputs.begin(), this->m_inputs.end(),
54  []( auto& h ) { h.setOptional( true ); } );
55  }
56  },
58  , m_outputLocations(
59  this, outputs.first, details::to_DataObjID( outputs.second ),
61  this->m_outputs =
62  details::make_vector_of_handles<decltype( this->m_outputs )>( this, m_outputLocations );
63  if constexpr ( details::is_optional_v<Out> ) { // handle constructor does not (yet) allow to
64  // set optional flag... so
65  // do it explicitly here...
66  std::for_each( this->m_outputs.begin(), this->m_outputs.end(),
67  []( auto& h ) { h.setOptional( true ); } );
68  }
69  },
71 
72  // accessor to output Locations
73  const std::string& outputLocation( unsigned int n ) const { return m_outputLocations.value()[n].key(); }
74  unsigned int outputLocationSize() const { return m_outputLocations.value().size(); }
75 
76  // accessor to input Locations
77  const std::string& inputLocation( unsigned int n ) const { return m_inputLocations.value()[n].key(); }
78  unsigned int inputLocationSize() const { return m_inputLocations.value().size(); }
79 
80  // derived classes can NOT implement execute
81  StatusCode execute( const EventContext& ) const override final {
82  try {
84  ins.reserve( m_inputs.size() );
85  std::transform( m_inputs.begin(), m_inputs.end(), std::back_inserter( ins ),
87  // TODO:FIXME: how does operator() know the number and order of expected outputs?
88  auto out = ( *this )( std::as_const( ins ) );
89  if ( out.size() != m_outputs.size() ) {
90  throw GaudiException( "Error during transform: expected " + std::to_string( m_outputs.size() ) +
91  " containers, got " + std::to_string( out.size() ) + " instead",
92  this->name(), StatusCode::FAILURE );
93  }
94  for ( unsigned i = 0; i != out.size(); ++i ) details::put( m_outputs[i], std::move( out[i] ) );
96  } catch ( GaudiException& e ) {
97  ( e.code() ? this->warning() : this->error() ) << e.tag() << " : " << e.message() << endmsg;
98  return e.code();
99  }
100  }
101 
102  // TODO/FIXME: how does the callee know in which order to produce the outputs?
103  // (note: 'missing' items can be specified by making Out an std::optional<Out>,
104  // and only those entries which contain an Out are stored)
105  virtual vector_of_<Out> operator()( const vector_of_const_<In>& ) const = 0;
106 
107  private:
108  // if In is a pointer, it signals optional (as opposed to mandatory) input
109  template <typename T>
111  std::vector<InputHandle_t<In>> m_inputs; // and make the handles properties instead...
112  Gaudi::Property<std::vector<DataObjID>> m_inputLocations; // TODO/FIXME: remove this duplication...
113  // TODO/FIXME: replace vector of DataObjID property + call-back with a
114  // vector<handle> property ... as soon as declareProperty can deal with that.
115  template <typename T>
118  Gaudi::Property<std::vector<DataObjID>> m_outputLocations; // TODO/FIXME for now: use a call-back to update the
119  // actual handles!
120  };
121 
122  } // namespace details
123 
124  template <typename Signature, typename Traits_ = Traits::useDefaults>
127 
128 } // namespace Gaudi::Functional
Gaudi::Details::PropertyBase
PropertyBase base class allowing PropertyBase* collections to be "homogeneous".
Definition: PropertyBase.h:35
Gaudi::Functional::details::SplittingMergingTransformer< vector_of_< Out >(const vector_of_const_< In > &), Traits_, false >::outputLocation
const std::string & outputLocation(unsigned int n) const
Definition: SplittingMergingTransformer.h:73
Gaudi::Functional::details::SplittingMergingTransformer< vector_of_< Out >(const vector_of_const_< In > &), Traits_, false >::m_outputLocations
Gaudi::Property< std::vector< DataObjID > > m_outputLocations
Definition: SplittingMergingTransformer.h:118
std::for_each
T for_each(T... args)
Gaudi::Functional::details::SplittingMergingTransformer< vector_of_< Out >(const vector_of_const_< In > &), Traits_, false >::base_class
BaseClass_t< Traits_ > base_class
Definition: SplittingMergingTransformer.h:37
std::string
STL class.
std::move
T move(T... args)
std::pair
std::vector
STL class.
ISvcLocator
Definition: ISvcLocator.h:46
std::back_inserter
T back_inserter(T... args)
Gaudi::Functional::details::SplittingMergingTransformer< vector_of_< Out >(const vector_of_const_< In > &), Traits_, false >::InputHandle_t
InputHandle_t< Traits_, std::remove_pointer_t< T > > InputHandle_t
Definition: SplittingMergingTransformer.h:110
GaudiException
Definition: GaudiException.h:31
Gaudi::Functional::details::SplittingMergingTransformer< vector_of_< Out >(const vector_of_const_< In > &), Traits_, false >::outputLocationSize
unsigned int outputLocationSize() const
Definition: SplittingMergingTransformer.h:74
Gaudi::Functional::details::vector_of_const_::reserve
void reserve(size_type size)
Definition: FunctionalDetails.h:342
Gaudi::Functional::details::vector_of_const_
Definition: FunctionalDetails.h:294
Gaudi::Functional::details::SplittingMergingTransformer< vector_of_< Out >(const vector_of_const_< In > &), Traits_, false >::SplittingMergingTransformer
SplittingMergingTransformer(std::string name, ISvcLocator *locator, const KeyValues &inputs, const KeyValues &outputs)
Definition: SplittingMergingTransformer.h:43
Gaudi::Functional::details::to_DataObjID
std::vector< DataObjID > to_DataObjID(const std::vector< std::string > &in)
Definition: FunctionalDetails.h:119
Gaudi::Functional::vector_of_
details::template vector_of_const_< Container > vector_of_
Definition: ListTransformer.h:19
Gaudi::Details::Property::ImmediatelyInvokeHandler
Gaudi::tagged_bool< class ImmediatelyInvokeHandler_tag > ImmediatelyInvokeHandler
Definition: Property.h:23
GaudiException::message
virtual const std::string & message() const
error message to be printed
Definition: GaudiException.h:68
Gaudi::Functional::details::SplittingMergingTransformer< vector_of_< Out >(const vector_of_const_< In > &), Traits_, false >::m_inputs
std::vector< InputHandle_t< In > > m_inputs
Definition: SplittingMergingTransformer.h:111
Gaudi::Functional::details::SplittingMergingTransformer< vector_of_< Out >(const vector_of_const_< In > &), Traits_, false >::execute
StatusCode execute(const EventContext &) const override final
Definition: SplittingMergingTransformer.h:81
Gaudi::Functional::details::make_vector_of_handles
Handles make_vector_of_handles(IDataHandleHolder *owner, const std::vector< DataObjID > &init)
Definition: FunctionalDetails.h:433
Gaudi::Functional::details::SplittingMergingTransformer< vector_of_< Out >(const vector_of_const_< In > &), Traits_, false >::OutputHandle
details::OutputHandle_t< Traits_, details::remove_optional_t< T > > OutputHandle
Definition: SplittingMergingTransformer.h:116
Gaudi::Functional::details::SplittingMergingTransformer< vector_of_< Out >(const vector_of_const_< In > &), Traits_, false >::m_inputLocations
Gaudi::Property< std::vector< DataObjID > > m_inputLocations
Definition: SplittingMergingTransformer.h:112
TimingHistograms.name
name
Definition: TimingHistograms.py:25
StatusCode
Definition: StatusCode.h:65
details
Definition: AnyDataWrapper.h:18
AlgSequencer.h
h
Definition: AlgSequencer.py:32
Gaudi::Functional::details::SplittingMergingTransformer< vector_of_< Out >(const vector_of_const_< In > &), Traits_, false >::operator()
virtual vector_of_< Out > operator()(const vector_of_const_< In > &) const =0
std::to_string
T to_string(T... args)
Gaudi::Functional::FilterDecision::PASSED
@ PASSED
Gaudi::Functional
Definition: Consumer.h:19
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:203
GaudiException::tag
virtual const std::string & tag() const
name tag for the exception, or exception type
Definition: GaudiException.h:77
Gaudi::Functional::details::SplittingMergingTransformer
Definition: SplittingMergingTransformer.h:32
std::transform
T transform(T... args)
Gaudi::Functional::details::SplittingMergingTransformer< vector_of_< Out >(const vector_of_const_< In > &), Traits_, false >::inputLocationSize
unsigned int inputLocationSize() const
Definition: SplittingMergingTransformer.h:78
GaudiPluginService.cpluginsvc.n
n
Definition: cpluginsvc.py:235
FunctionalUtilities.h
GaudiException::code
virtual const StatusCode & code() const
StatusCode for Exception.
Definition: GaudiException.h:86
Gaudi::Functional::details::details2::get_from_handle
Definition: FunctionalDetails.h:263
std
STL namespace.
EventContext
Definition: EventContext.h:34
Gaudi::Functional::details::BaseClass_t
Gaudi::cpp17::detected_or_t< Base, detail2::BaseClass_t, Tr > BaseClass_t
Definition: FunctionalDetails.h:414
FunctionalDetails.h
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:101
Gaudi::Functional::details::SplittingMergingTransformer< vector_of_< Out >(const vector_of_const_< In > &), Traits_, false >::m_outputs
std::vector< OutputHandle< Out > > m_outputs
Definition: SplittingMergingTransformer.h:117
FunctionalFilterDecision.h
Gaudi::Functional::details::OutputHandle_t
Gaudi::cpp17::detected_or_t< DataObjectWriteHandle< T >, detail2::OutputHandle_t, Tr, T > OutputHandle_t
Definition: FunctionalDetails.h:421
Gaudi::Property
Implementation of property with value of concrete type.
Definition: Property.h:39
Gaudi::Functional::details::SplittingMergingTransformer< vector_of_< Out >(const vector_of_const_< In > &), Traits_, false >::inputLocation
const std::string & inputLocation(unsigned int n) const
Definition: SplittingMergingTransformer.h:77
Gaudi::Functional::details::put
auto put(const DataObjectHandle< Out1 > &out_handle, Out2 &&out)
Definition: FunctionalDetails.h:173
PrepareBase.out
out
Definition: PrepareBase.py:20