The Gaudi Framework  master (37c0b60a)
MergingTransformer.h
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2024 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 #pragma once
12 
13 #include "details.h"
14 #include "utilities.h"
15 #include <Gaudi/Algorithm.h>
17 #include <functional>
18 #include <string>
19 #include <vector>
20 
21 namespace Gaudi::Functional {
22 
23  using details::vector_of_const_;
24 
25  namespace details {
26  template <typename F, size_t... Is>
27  auto for_impl( F&& f, std::index_sequence<Is...> ) {
28  if constexpr ( std::disjunction_v<std::is_void<std::invoke_result_t<F, std::integral_constant<int, Is>>>...> ) {
29  ( std::invoke( f, std::integral_constant<int, Is>{} ), ... );
30  } else {
31  return std::array{ std::invoke( f, std::integral_constant<int, Is>{} )... };
32  }
33  }
34 
35  template <auto N, typename F>
36  decltype( auto ) for_( F&& f ) {
37  return for_impl( std::forward<F>( f ), std::make_index_sequence<N>{} );
38  }
39 
40  template <typename Sig>
42  template <typename... Args>
43  struct is_void_fun<void( Args... )> : std::true_type {};
44  template <typename Sig>
45  inline constexpr bool is_void_fun_v = is_void_fun<Sig>::value;
46 
47  template <typename Signature, typename Traits_, bool isLegacy>
49 
51  template <typename Out, typename In, typename Traits_>
52  struct MergingTransformer<Out( const vector_of_const_<In>& ), Traits_, true>
54  private:
56 
57  public:
58  using KeyValue = typename base_class::KeyValue;
59  using KeyValues = typename base_class::KeyValues;
60 
62  : base_class( std::move( name ), locator )
63  , m_inputLocations{ this, inputs.first, details::to_DataObjID( inputs.second ),
64  [this]( Gaudi::Details::PropertyBase& ) {
65  this->m_inputs =
66  make_vector_of_handles<decltype( this->m_inputs )>( this, m_inputLocations );
67  if ( std::is_pointer_v<In> ) { // handle constructor does not (yet) allow to set
68  // optional flag... so do it
69  // explicitly here...
70  std::for_each( this->m_inputs.begin(), this->m_inputs.end(),
71  []( auto& h ) { h.setOptional( true ); } );
72  }
73  },
75  static_assert( std::is_void_v<Out> );
76  }
77 
79  : base_class( std::move( name ), locator, output )
80  , m_inputLocations{ this, inputs.first, details::to_DataObjID( inputs.second ),
81  [this]( Gaudi::Details::PropertyBase& ) {
82  this->m_inputs =
83  make_vector_of_handles<decltype( this->m_inputs )>( this, m_inputLocations );
84  if ( std::is_pointer_v<In> ) { // handle constructor does not (yet) allow to set
85  // optional flag... so do it
86  // explicitly here...
87  std::for_each( this->m_inputs.begin(), this->m_inputs.end(),
88  []( auto& h ) { h.setOptional( true ); } );
89  }
90  },
92  static_assert( !std::is_void_v<Out> );
93  }
94 
95  // accessor to input Locations
96  const std::string& inputLocation( unsigned int n ) const { return m_inputLocations.value()[n].key(); }
97  unsigned int inputLocationSize() const { return m_inputLocations.value().size(); }
98 
99  // derived classes can NOT implement execute
100  StatusCode execute() override final {
102  ins.reserve( m_inputs.size() );
103  std::transform( m_inputs.begin(), m_inputs.end(), std::back_inserter( ins ), details2::get_from_handle<In>{} );
104  try {
105  if constexpr ( std::is_void_v<Out> ) {
106  std::as_const ( *this )( std::as_const( ins ) );
107  } else {
108  put( std::get<0>( this->m_outputs ), std::as_const( *this )( std::as_const( ins ) ) );
109  }
110  return FilterDecision::PASSED;
111  } catch ( GaudiException& e ) {
112  if ( e.code().isFailure() ) this->error() << e.tag() << " : " << e.message() << endmsg;
113  return e.code();
114  }
115  }
116 
117  virtual Out operator()( const vector_of_const_<In>& inputs ) const = 0;
118 
119  private:
120  // if In is a pointer, it signals optional (as opposed to mandatory) input
121  template <typename T>
123  std::vector<InputHandle_t<In>> m_inputs; // and make the handles properties instead...
124  Gaudi::Property<std::vector<DataObjID>> m_inputLocations; // TODO/FIXME: remove this duplication...
125  // TODO/FIXME: replace vector of DataObjID property + call-back with a
126  // vector<handle> property ... as soon as declareProperty can deal with that.
127  };
128 
129  template <typename Out, typename... Ins, typename Traits_>
130  struct MergingTransformer<Out( const vector_of_const_<Ins>&... ), Traits_, false>
132 
134  using KeyValue = typename base_class::KeyValue;
135  using KeyValues = typename base_class::KeyValues;
136  using InKeys = details::RepeatValues_<KeyValues, sizeof...( Ins )>;
137 
138  private:
139  auto construct_properties( InKeys inputs ) {
140  return details::for_<sizeof...( Ins )>( [&]( auto I ) {
141  constexpr auto i = decltype( I )::value;
142  auto& ins = std::get<i>( inputs );
144  this, ins.first, details::to_DataObjID( ins.second ),
145  [this]( auto&& ) {
146  auto& handles = std::get<i>( this->m_inputs );
147  auto& ins = std::get<i>( this->m_inputLocations );
148  using Handles = typename std::decay_t<decltype( handles )>;
149  handles = make_vector_of_handles<Handles>( this, ins );
150  if ( std::is_pointer_v<typename Handles::value_type> ) { // handle constructor does not (yet) allow to
151  // set
152  // optional flag... so do it
153  // explicitly here...
154  std::for_each( handles.begin(), handles.end(), []( auto& h ) { h.setOptional( true ); } );
155  }
156  },
158  } );
159  }
160 
161  public:
163  : base_class( std::move( name ), locator ), m_inputLocations{ construct_properties( inputs ) } {
164  static_assert( std::is_void_v<Out> );
165  }
166 
168  : MergingTransformer{ std::move( name ), locator, InKeys{ inputs } } {
169  static_assert( sizeof...( Ins ) == 1 );
170  }
171 
173  : base_class( std::move( name ), locator, output ), m_inputLocations{ construct_properties( inputs ) } {
174  static_assert( !std::is_void_v<Out> );
175  }
176 
178  : MergingTransformer{ std::move( name ), locator, InKeys{ inputs }, output } {
179  static_assert( sizeof...( Ins ) == 1 );
180  }
181 
182  // accessor to input Locations
183  const std::string& inputLocation( unsigned int i, unsigned int j ) const {
184  return m_inputLocations.at( i ).value().at( j ).key();
185  }
186  const std::string& inputLocation( unsigned int i ) const {
187  static_assert( sizeof...( Ins ) == 1 );
188  return inputLocation( 0, i );
189  }
190  unsigned int inputLocationSize( int i = 0 ) const { return m_inputLocations.at( i ).value().size(); }
191 
192  // derived classes can NOT implement execute
193  StatusCode execute( const EventContext& ) const override final {
195  details::for_<sizeof...( Ins )>( [&]( auto I ) {
196  constexpr size_t i = decltype( I )::value;
197  auto& ins = std::get<i>( inss );
198  auto& handles = std::get<i>( m_inputs );
199  ins.reserve( handles.size() );
200  std::transform( handles.begin(), handles.end(), std::back_inserter( ins ),
201  details::details2::get_from_handle<typename std::decay_t<decltype( ins )>::value_type>{} );
202  } );
203  try {
204  if constexpr ( std::is_void_v<Out> ) {
205  std::apply( [&]( auto&&... ins ) { return std::as_const( *this )( std::as_const( ins )... ); }, inss );
206  } else {
207  put( std::get<0>( this->m_outputs ),
208  std::apply( [&]( auto&&... ins ) { return std::as_const( *this )( std::as_const( ins )... ); },
209  inss ) );
210  }
211  return FilterDecision::PASSED;
212  } catch ( GaudiException& e ) {
213  if ( e.code().isFailure() ) this->error() << e.tag() << " : " << e.message() << endmsg;
214  return e.code();
215  }
216  }
217 
218  virtual Out operator()( const vector_of_const_<Ins>&... inputs ) const = 0;
219 
220  private:
221  // if In is a pointer, it signals optional (as opposed to mandatory) input
222  template <typename T>
224  std::tuple<std::vector<InputHandle_t<Ins>>...> m_inputs; // and make the handles properties instead...
225  std::array<Gaudi::Property<std::vector<DataObjID>>, sizeof...( Ins )> m_inputLocations; // TODO/FIXME: remove
226  // this duplication...
227  // TODO/FIXME: replace vector of string property + call-back with a
228  // vector<handle> property ... as soon as declareProperty can deal with that.
229  };
230 
231  } // namespace details
232 
233  template <typename Signature, typename Traits_ = Traits::useDefaults>
235 
236  // more meaningful alias for cases where the return type in Signature is void
237  template <typename Signature, typename Traits_ = Traits::useDefaults,
238  typename = std::enable_if_t<details::is_void_fun_v<Signature>>>
240 
241  // M vectors of the same -> N
242  template <typename Signature, typename Traits_ = Traits::BaseClass_t<Gaudi::Algorithm>>
244 
245  template <typename... Outs, typename... Ins, typename Traits_>
246  struct MergingMultiTransformer<std::tuple<Outs...>( vector_of_const_<Ins> const&... ), Traits_>
247  : details::DataHandleMixin<std::tuple<Outs...>, std::tuple<>, Traits_> {
248 
249  private:
251 
252  public:
253  using KeyValue = typename base_class::KeyValue;
254  using KeyValues = typename base_class::KeyValues;
255  using InKeys = details::RepeatValues_<KeyValues, sizeof...( Ins )>;
256  using OutKeys = details::RepeatValues_<KeyValue, sizeof...( Outs )>;
257  static constexpr size_t n_args = sizeof...( Ins );
258 
259  MergingMultiTransformer( std::string const& name, ISvcLocator* pSvcLocator, InKeys inputs, OutKeys outputs )
260  : base_class{ name, pSvcLocator, std::move( outputs ) }
261  , m_inputLocations{ details::for_<n_args>( [&]( auto I ) {
262  constexpr auto i = decltype( I )::value;
263  auto& ins = std::get<i>( inputs );
265  this, ins.first, details::to_DataObjID( ins.second ),
266  [this]( auto&& ) {
267  auto& handles = std::get<i>( this->m_inputs );
268  auto& ins = std::get<i>( this->m_inputLocations );
269  using In = typename std::decay_t<decltype( handles )>::value_type;
270  handles = details::make_vector_of_handles<std::decay_t<decltype( handles )>>( this, ins );
271  if ( std::is_pointer_v<In> ) { // handle constructor does not (yet) allow to set
272  // optional flag... so do it
273  // explicitly here...
274  std::for_each( handles.begin(), handles.end(), []( auto& h ) { h.setOptional( true ); } );
275  }
276  },
278  } ) } {}
279 
280  MergingMultiTransformer( std::string const& name, ISvcLocator* pSvcLocator, KeyValues inputs, OutKeys outputs )
281  : MergingMultiTransformer{ name, pSvcLocator, InKeys{ std::move( inputs ) }, std::move( outputs ) } {
282  static_assert( sizeof...( Ins ) == 1 );
283  }
284 
285  // accessor to input Locations
286  std::string const& inputLocation( unsigned int i, unsigned int j ) const {
287  return m_inputLocations.at( i ).value().at( j ).key();
288  }
289  std::string const& inputLocation( unsigned int j ) const {
290  static_assert( n_args == 1 );
291  return inputLocation( 0, j );
292  }
293  unsigned int inputLocationSize( int i = 0 ) const { return m_inputLocations.at( i ).value().size(); }
294 
295  // derived classes can NOT implement execute
296  StatusCode execute( EventContext const& ) const override final {
298  details::for_<sizeof...( Ins )>( [&]( auto I ) {
299  constexpr size_t i = decltype( I )::value;
300  auto& ins = std::get<i>( inss );
301  auto& handles = std::get<i>( m_inputs );
302  ins.reserve( handles.size() );
303  std::transform( handles.begin(), handles.end(), std::back_inserter( ins ),
304  details::details2::get_from_handle<typename std::decay_t<decltype( ins )>::value_type>{} );
305  } );
306  try {
307  std::apply(
308  [&]( auto&... outhandle ) {
310  std::apply(
311  [&outhandle...]( auto&&... data ) {
312  ( details::put( outhandle, std::forward<decltype( data )>( data ) ), ... );
313  },
314  std::apply( [&]( auto&&... ins ) { return std::as_const( *this )( std::as_const( ins )... ); },
315  inss ) );
317  },
318  this->m_outputs );
319  return FilterDecision::PASSED;
320  } catch ( GaudiException& e ) {
321  if ( e.code().isFailure() ) this->error() << e.tag() << " : " << e.message() << endmsg;
322  return e.code();
323  }
324  }
325 
326  virtual std::tuple<Outs...> operator()( const vector_of_const_<Ins>&... inputs ) const = 0;
327 
328  private:
329  // if In is a pointer, it signals optional (as opposed to mandatory) input
330  template <typename T>
332  std::tuple<std::vector<InputHandle_t<Ins>>...> m_inputs; // and make the handles properties instead...
333  std::array<Gaudi::Property<std::vector<DataObjID>>, sizeof...( Ins )> m_inputLocations; // TODO/FIXME: remove this
334  // duplication...
335  // TODO/FIXME: replace vector of string property + call-back with a
336  // vector<handle> property ... as soon as declareProperty can deal with that.
337  };
338 
339  // Many of the same -> N with filter functionality
340  template <typename Signature, typename Traits_ = Traits::BaseClass_t<Gaudi::Algorithm>>
342 
343  template <typename... Outs, typename In, typename Traits_>
344  struct MergingMultiTransformerFilter<std::tuple<Outs...>( vector_of_const_<In> const& ), Traits_>
345  : details::DataHandleMixin<std::tuple<Outs...>, std::tuple<>, Traits_> {
346 
347  private:
349 
350  public:
351  using KeyValue = typename base_class::KeyValue;
352  using KeyValues = typename base_class::KeyValues;
353  using OutKeys = details::RepeatValues_<KeyValue, sizeof...( Outs )>;
354 
356  OutKeys const& outputs );
357 
358  // accessor to input Locations
359  std::string const& inputLocation( unsigned int n ) const { return m_inputLocations.value()[n].key(); }
360  unsigned int inputLocationSize() const { return m_inputLocations.value().size(); }
361 
362  // derived classes can NOT implement execute
363  StatusCode execute( EventContext const& ) const override final {
365  ins.reserve( m_inputs.size() );
366  std::transform( m_inputs.begin(), m_inputs.end(), std::back_inserter( ins ),
368  try {
369  return std::apply(
370  [&]( auto&... outhandle ) {
372  return std::apply(
373  [&outhandle...]( bool passed, auto&&... data ) {
374  ( details::put( outhandle, std::forward<decltype( data )>( data ) ), ... );
375  return passed;
376  },
377  ( *this )( std::as_const( ins ) ) );
379  },
380  this->m_outputs )
383  } catch ( GaudiException& e ) {
384  if ( e.code().isFailure() ) this->error() << e.tag() << " : " << e.message() << endmsg;
385  return e.code();
386  }
387  }
388 
389  virtual std::tuple<bool, Outs...> operator()( const vector_of_const_<In>& inputs ) const = 0;
390 
391  private:
392  // if In is a pointer, it signals optional (as opposed to mandatory) input
393  template <typename T>
395  std::vector<InputHandle_t<In>> m_inputs; // and make the handles properties instead...
396  Gaudi::Property<std::vector<DataObjID>> m_inputLocations; // TODO/FIXME: remove this duplication...
397  // TODO/FIXME: replace vector of string property + call-back with a
398  // vector<handle> property ... as soon as declareProperty can deal with that.
399  };
400 
401  template <typename... Outs, typename In, typename Traits_>
404  ISvcLocator* pSvcLocator,
405  KeyValues const& inputs,
406  OutKeys const& outputs )
407  : base_class( name, pSvcLocator, outputs )
408  , m_inputLocations{
409  this, inputs.first, details::to_DataObjID( inputs.second ),
410  [this]( Gaudi::Details::PropertyBase& ) {
411  this->m_inputs = details::make_vector_of_handles<decltype( this->m_inputs )>( this, m_inputLocations );
412  if ( std::is_pointer_v<In> ) { // handle constructor does not (yet) allow to set
413  // optional flag... so do it
414  // explicitly here...
415  std::for_each( this->m_inputs.begin(), this->m_inputs.end(), []( auto& h ) { h.setOptional( true ); } );
416  }
417  },
419 
420 } // namespace Gaudi::Functional
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< In > &), Traits_, true >::MergingTransformer
MergingTransformer(std::string name, ISvcLocator *locator, const KeyValues &inputs)
Definition: MergingTransformer.h:61
Gaudi::Functional::MergingMultiTransformer< std::tuple< Outs... >(vector_of_const_< Ins > const &...), Traits_ >::InputHandle_t
details::InputHandle_t< Traits_, typename std::remove_pointer< T >::type > InputHandle_t
Definition: MergingTransformer.h:331
Gaudi::Details::PropertyBase
PropertyBase base class allowing PropertyBase* collections to be "homogeneous".
Definition: PropertyBase.h:35
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< Ins > &...), Traits_, false >::MergingTransformer
MergingTransformer(std::string name, ISvcLocator *locator, const KeyValues &inputs, const KeyValue &output)
Definition: MergingTransformer.h:177
Gaudi::Functional::MergingMultiTransformerFilter< std::tuple< Outs... >(vector_of_const_< In > const &), Traits_ >::MergingMultiTransformerFilter
MergingMultiTransformerFilter(std::string const &name, ISvcLocator *locator, KeyValues const &inputs, OutKeys const &outputs)
std::for_each
T for_each(T... args)
Gaudi::Functional::MergingMultiTransformerFilter< std::tuple< Outs... >(vector_of_const_< In > const &), Traits_ >::OutKeys
details::RepeatValues_< KeyValue, sizeof...(Outs)> OutKeys
Definition: MergingTransformer.h:353
std::integral_constant
Gaudi::Functional::MergingMultiTransformer< std::tuple< Outs... >(vector_of_const_< Ins > const &...), Traits_ >::KeyValue
typename base_class::KeyValue KeyValue
Definition: MergingTransformer.h:253
Gaudi::Functional::MergingMultiTransformer< std::tuple< Outs... >(vector_of_const_< Ins > const &...), Traits_ >::InKeys
details::RepeatValues_< KeyValues, sizeof...(Ins)> InKeys
Definition: MergingTransformer.h:255
std::string
STL class.
Gaudi::Functional::MergingMultiTransformerFilter< std::tuple< Outs... >(vector_of_const_< In > const &), Traits_ >::m_inputs
std::vector< InputHandle_t< In > > m_inputs
Definition: MergingTransformer.h:395
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< Ins > &...), Traits_, false >::MergingTransformer
MergingTransformer(std::string name, ISvcLocator *locator, InKeys inputs, const KeyValue &output)
Definition: MergingTransformer.h:172
std::move
T move(T... args)
Gaudi::Functional::details::InputHandle_t
Gaudi::cpp17::detected_or_t< detail2::DefaultInputHandle< T >, detail2::InputHandle_t, Tr, T > InputHandle_t
Definition: details.h:425
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< Ins > &...), Traits_, false >::MergingTransformer
MergingTransformer(std::string name, ISvcLocator *locator, const KeyValues &inputs)
Definition: MergingTransformer.h:167
std::is_void
Gaudi::Functional::MergingMultiTransformer< std::tuple< Outs... >(vector_of_const_< Ins > const &...), Traits_ >::execute
StatusCode execute(EventContext const &) const override final
Definition: MergingTransformer.h:296
std::vector
STL class.
ISvcLocator
Definition: ISvcLocator.h:46
std::back_inserter
T back_inserter(T... args)
Gaudi::Functional::MergingMultiTransformer
Definition: MergingTransformer.h:243
GaudiException
Definition: GaudiException.h:31
Gaudi::Functional::MergingMultiTransformer< std::tuple< Outs... >(vector_of_const_< Ins > const &...), Traits_ >::m_inputs
std::tuple< std::vector< InputHandle_t< Ins > >... > m_inputs
Definition: MergingTransformer.h:332
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< Ins > &...), Traits_, false >::inputLocation
const std::string & inputLocation(unsigned int i) const
Definition: MergingTransformer.h:186
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< Ins > &...), Traits_, false >::construct_properties
auto construct_properties(InKeys inputs)
Definition: MergingTransformer.h:139
Gaudi::Functional::MergingMultiTransformerFilter< std::tuple< Outs... >(vector_of_const_< In > const &), Traits_ >::KeyValues
typename base_class::KeyValues KeyValues
Definition: MergingTransformer.h:352
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< Ins > &...), Traits_, false >::MergingTransformer
MergingTransformer(std::string name, ISvcLocator *locator, InKeys inputs)
Definition: MergingTransformer.h:162
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< Ins > &...), Traits_, false >::inputLocation
const std::string & inputLocation(unsigned int i, unsigned int j) const
Definition: MergingTransformer.h:183
Gaudi::Functional::details::vector_of_const_::reserve
void reserve(size_type size)
Definition: details.h:344
Gaudi::Functional::MergingMultiTransformerFilter< std::tuple< Outs... >(vector_of_const_< In > const &), Traits_ >::KeyValue
typename base_class::KeyValue KeyValue
Definition: MergingTransformer.h:351
Gaudi::Functional::FilterDecision::FAILED
@ FAILED
std::tuple
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< Ins > &...), Traits_, false >::inputLocationSize
unsigned int inputLocationSize(int i=0) const
Definition: MergingTransformer.h:190
Gaudi::Functional::details::vector_of_const_
Definition: details.h:296
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< In > &), Traits_, true >::KeyValues
typename base_class::KeyValues KeyValues
Definition: MergingTransformer.h:59
gaudirun.output
output
Definition: gaudirun.py:521
GF_SUPPRESS_SPURIOUS_CLANG_WARNING_BEGIN
#define GF_SUPPRESS_SPURIOUS_CLANG_WARNING_BEGIN
Definition: details.h:39
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< In > &), Traits_, true >::inputLocation
const std::string & inputLocation(unsigned int n) const
Definition: MergingTransformer.h:96
Gaudi::Functional::details::to_DataObjID
std::vector< DataObjID > to_DataObjID(const std::vector< std::string > &in)
Definition: details.h:114
Gaudi::Functional::MergingMultiTransformer< std::tuple< Outs... >(vector_of_const_< Ins > const &...), Traits_ >::inputLocationSize
unsigned int inputLocationSize(int i=0) const
Definition: MergingTransformer.h:293
Gaudi::Functional::MergingMultiTransformer< std::tuple< Outs... >(vector_of_const_< Ins > const &...), Traits_ >::inputLocation
std::string const & inputLocation(unsigned int j) const
Definition: MergingTransformer.h:289
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< Ins > &...), Traits_, false >::execute
StatusCode execute(const EventContext &) const override final
Definition: MergingTransformer.h:193
GaudiException::message
virtual const std::string & message() const
error message to be printed
Definition: GaudiException.h:68
Gaudi::Functional::details::make_vector_of_handles
Handles make_vector_of_handles(IDataHandleHolder *owner, const std::vector< DataObjID > &init)
Definition: details.h:435
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< In > &), Traits_, true >::execute
StatusCode execute() override final
Definition: MergingTransformer.h:100
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< Ins > &...), Traits_, false >::KeyValue
typename base_class::KeyValue KeyValue
Definition: MergingTransformer.h:134
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< Ins > &...), Traits_, false >::InKeys
details::RepeatValues_< KeyValues, sizeof...(Ins)> InKeys
Definition: MergingTransformer.h:136
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< Ins > &...), Traits_, false >::KeyValues
typename base_class::KeyValues KeyValues
Definition: MergingTransformer.h:135
StatusCode
Definition: StatusCode.h:65
Gaudi::tagged_bool_ns::tagged_bool
Definition: TaggedBool.h:16
details
Definition: AnyDataWrapper.h:19
Gaudi::Functional::details::MergingTransformer
Definition: MergingTransformer.h:48
std::string::at
T at(T... args)
Gaudi::Functional::details::is_void_fun
Definition: MergingTransformer.h:41
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< Ins > &...), Traits_, false >::m_inputs
std::tuple< std::vector< InputHandle_t< Ins > >... > m_inputs
Definition: MergingTransformer.h:224
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< In > &), Traits_, true >::InputHandle_t
InputHandle_t< Traits_, std::remove_pointer_t< T > > InputHandle_t
Definition: MergingTransformer.h:122
ProduceConsume.j
j
Definition: ProduceConsume.py:104
Gaudi::Functional::MergingMultiTransformerFilter< std::tuple< Outs... >(vector_of_const_< In > const &), Traits_ >::inputLocationSize
unsigned int inputLocationSize() const
Definition: MergingTransformer.h:360
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< In > &), Traits_, true >::m_inputLocations
Gaudi::Property< std::vector< DataObjID > > m_inputLocations
Definition: MergingTransformer.h:124
Gaudi::Functional::MergingMultiTransformer< std::tuple< Outs... >(vector_of_const_< Ins > const &...), Traits_ >::inputLocation
std::string const & inputLocation(unsigned int i, unsigned int j) const
Definition: MergingTransformer.h:286
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< In > &), Traits_, true >::inputLocationSize
unsigned int inputLocationSize() const
Definition: MergingTransformer.h:97
AlgSequencer.h
h
Definition: AlgSequencer.py:31
std::array
STL class.
Gaudi::Functional::details::for_impl
auto for_impl(F &&f, std::index_sequence< Is... >)
Definition: MergingTransformer.h:27
Gaudi::Functional::MergingMultiTransformerFilter< std::tuple< Outs... >(vector_of_const_< In > const &), Traits_ >::inputLocation
std::string const & inputLocation(unsigned int n) const
Definition: MergingTransformer.h:359
Gaudi::Functional::FilterDecision::PASSED
@ PASSED
Algorithm.h
Gaudi::Functional
Definition: Consumer.h:19
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202
GaudiException::tag
virtual const std::string & tag() const
name tag for the exception, or exception type
Definition: GaudiException.h:77
GF_SUPPRESS_SPURIOUS_CLANG_WARNING_END
#define GF_SUPPRESS_SPURIOUS_CLANG_WARNING_END
Definition: details.h:40
Gaudi::Functional::MergingMultiTransformer< std::tuple< Outs... >(vector_of_const_< Ins > const &...), Traits_ >::MergingMultiTransformer
MergingMultiTransformer(std::string const &name, ISvcLocator *pSvcLocator, KeyValues inputs, OutKeys outputs)
Definition: MergingTransformer.h:280
utilities.h
std::transform
T transform(T... args)
Gaudi::Functional::MergingMultiTransformer< std::tuple< Outs... >(vector_of_const_< Ins > const &...), Traits_ >::operator()
virtual std::tuple< Outs... > operator()(const vector_of_const_< Ins > &... inputs) const =0
cpluginsvc.n
n
Definition: cpluginsvc.py:234
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< Ins > &...), Traits_, false >::InputHandle_t
InputHandle_t< Traits_, std::remove_pointer_t< T > > InputHandle_t
Definition: MergingTransformer.h:223
Gaudi::Functional::details::for_
decltype(auto) for_(F &&f)
Definition: MergingTransformer.h:36
GaudiException::code
virtual const StatusCode & code() const
StatusCode for Exception.
Definition: GaudiException.h:86
StatusCode::isFailure
bool isFailure() const
Definition: StatusCode.h:129
ConditionsStallTest.name
name
Definition: ConditionsStallTest.py:77
Gaudi::Functional::MergingMultiTransformerFilter
Definition: MergingTransformer.h:341
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< In > &), Traits_, true >::KeyValue
typename base_class::KeyValue KeyValue
Definition: MergingTransformer.h:58
Gaudi::Functional::details::details2::get_from_handle
Definition: details.h:261
std
STL namespace.
EventContext
Definition: EventContext.h:34
Gaudi::Functional::details::RepeatValues_
decltype(get_values_helper< Value >(std::make_index_sequence< N >())) RepeatValues_
Definition: details.h:162
Gaudi::Functional::Traits::useDefaults
use_<> useDefaults
Definition: utilities.h:75
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< In > &), Traits_, true >::m_inputs
std::vector< InputHandle_t< In > > m_inputs
Definition: MergingTransformer.h:123
Gaudi::Functional::MergingMultiTransformerFilter< std::tuple< Outs... >(vector_of_const_< In > const &), Traits_ >::operator()
virtual std::tuple< bool, Outs... > operator()(const vector_of_const_< In > &inputs) const =0
Gaudi::Functional::MergingMultiTransformer< std::tuple< Outs... >(vector_of_const_< Ins > const &...), Traits_ >::KeyValues
typename base_class::KeyValues KeyValues
Definition: MergingTransformer.h:254
Gaudi::Functional::MergingMultiTransformer< std::tuple< Outs... >(vector_of_const_< Ins > const &...), Traits_ >::MergingMultiTransformer
MergingMultiTransformer(std::string const &name, ISvcLocator *pSvcLocator, InKeys inputs, OutKeys outputs)
Definition: MergingTransformer.h:259
Gaudi::Functional::details::DataHandleMixin
Definition: details.h:506
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< In > &), Traits_, true >::operator()
virtual Out operator()(const vector_of_const_< In > &inputs) const =0
Gaudi::Functional::MergingMultiTransformerFilter< std::tuple< Outs... >(vector_of_const_< In > const &), Traits_ >::m_inputLocations
Gaudi::Property< std::vector< DataObjID > > m_inputLocations
Definition: MergingTransformer.h:396
details.h
Gaudi::Functional::details::is_void_fun_v
constexpr bool is_void_fun_v
Definition: MergingTransformer.h:45
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< Ins > &...), Traits_, false >::operator()
virtual Out operator()(const vector_of_const_< Ins > &... inputs) const =0
Gaudi::Functional::MergingMultiTransformerFilter< std::tuple< Outs... >(vector_of_const_< In > const &), Traits_ >::execute
StatusCode execute(EventContext const &) const override final
Definition: MergingTransformer.h:363
Gaudi::Functional::MergingMultiTransformer< std::tuple< Outs... >(vector_of_const_< Ins > const &...), Traits_ >::OutKeys
details::RepeatValues_< KeyValue, sizeof...(Outs)> OutKeys
Definition: MergingTransformer.h:256
FunctionalFilterDecision.h
Gaudi::Property
Implementation of property with value of concrete type.
Definition: Property.h:37
Gaudi::Functional::MergingMultiTransformerFilter< std::tuple< Outs... >(vector_of_const_< In > const &), Traits_ >::InputHandle_t
details::InputHandle_t< Traits_, typename std::remove_pointer< T >::type > InputHandle_t
Definition: MergingTransformer.h:394
Gaudi::Functional::details::MergingTransformer< Out(const vector_of_const_< In > &), Traits_, true >::MergingTransformer
MergingTransformer(std::string name, ISvcLocator *locator, const KeyValues &inputs, const KeyValue &output)
Definition: MergingTransformer.h:78
Gaudi::Functional::details::put
auto put(const DataObjectHandle< Out1 > &out_handle, Out2 &&out)
Definition: details.h:168