Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  master (d98a2936)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
details.h
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2025 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 <Gaudi/Algorithm.h>
14 #include <GaudiKernel/Algorithm.h>
17 #include <GaudiKernel/IBinder.h>
19 #include <cassert>
20 #include <sstream>
21 #include <type_traits>
22 
23 #if defined( __cpp_lib_ranges_zip ) && defined( __cpp_lib_ranges_as_const )
24 # define GAUDI_FUNCTIONAL_USES_STD_RANGES 1
25 # include <ranges>
26 #else
27 # include <range/v3/version.hpp>
28 # include <range/v3/view/const.hpp>
29 # include <range/v3/view/zip.hpp>
30 #endif
31 
32 // temporary hack to help in transition to updated constructor
33 // allows to write code which is forward and backwards compatible
34 #define GAUDI_FUNCTIONAL_CONSTRUCTOR_USES_TUPLE
35 
37 
38  // CRJ : Stuff for zipping
39  namespace zip {
40 
42  template <typename OS, typename Arg>
43  void printSizes( OS& out, Arg&& arg ) {
44  out << "SizeOf'" << System::typeinfoName( typeid( Arg ) ) << "'=" << std::forward<Arg>( arg ).size();
45  }
46 
48  template <typename OS, typename Arg, typename... Args>
49  void printSizes( OS& out, Arg&& arg, Args&&... args ) {
50  printSizes( out, arg );
51  out << ", ";
52  printSizes( out, args... );
53  }
54 
56  template <typename A>
57  inline bool check_sizes( const A& ) noexcept {
58  return true;
59  }
60 
62  template <typename A, typename B>
63  inline bool check_sizes( const A& a, const B& b ) noexcept {
64  return a.size() == b.size();
65  }
66 
68  template <typename A, typename B, typename... C>
69  inline bool check_sizes( const A& a, const B& b, const C&... c ) noexcept {
70  return ( check_sizes( a, b ) && check_sizes( b, c... ) );
71  }
72 
74  template <typename... Args>
75  inline decltype( auto ) verifySizes( Args&... args ) {
76  if ( !check_sizes( args... ) ) {
77  std::ostringstream mess;
78  mess << "Zipped containers have different sizes : ";
79  printSizes( mess, args... );
80  throw GaudiException( mess.str(), "Gaudi::Functional::details::zip::verifySizes", StatusCode::FAILURE );
81  }
82  }
83 
85  template <typename... Args>
86  inline decltype( auto ) range( Args&&... args ) {
87 #ifndef NDEBUG
88  verifySizes( args... );
89 #endif
90 #if defined( GAUDI_FUNCTIONAL_USES_STD_RANGES )
91  return std::ranges::zip_view( std::forward<Args>( args )... );
92 #else
93  return ranges::views::zip( std::forward<Args>( args )... );
94 #endif
95  }
96 
98  template <typename... Args>
99  inline decltype( auto ) const_range( Args&&... args ) {
100 #ifndef NDEBUG
101  verifySizes( args... );
102 #endif
103 #if defined( GAUDI_FUNCTIONAL_USES_STD_RANGES )
104  return std::ranges::as_const_view( std::ranges::zip_view( std::forward<Args>( args )... ) );
105 #else
106  return ranges::views::const_( ranges::views::zip( std::forward<Args>( args )... ) );
107 #endif
108  }
109  } // namespace zip
110 
111  inline std::vector<DataObjID> to_DataObjID( const std::vector<std::string>& in ) {
112  std::vector<DataObjID> out;
113  out.reserve( in.size() );
114  std::transform( in.begin(), in.end(), std::back_inserter( out ),
115  []( const std::string& i ) { return DataObjID{ i }; } );
116  return out;
117  }
118 
120  template <typename T>
121  concept is_optional = requires( T const& t ) {
122  t.has_value();
123  t.value();
124  typename T::value_type;
125  };
126 
127  namespace details2 {
128 
129  template <typename T>
130  struct value_type_of {
131  using type = T;
132  };
133 
134  template <is_optional T>
135  struct value_type_of<T> {
136  using type = T::value_type;
137  };
138 
139  } // namespace details2
140 
141  template <typename T>
143 
144  constexpr struct invoke_optionally_t {
145  template <typename F, typename Arg>
146  requires( !is_optional<Arg> )
147  decltype( auto ) operator()( F&& f, Arg&& arg ) const {
148  return std::invoke( std::forward<F>( f ), std::forward<Arg>( arg ) );
149  }
150  template <typename F, is_optional Arg>
151  void operator()( F&& f, Arg&& arg ) const {
152  if ( arg ) std::invoke( std::forward<F>( f ), *std::forward<Arg>( arg ) );
153  }
156 
157  template <typename Value, std::size_t... I>
158  auto get_values_helper( std::index_sequence<I...> ) {
159  return std::make_tuple( ( (void)I, Value{} )... );
160  }
161 
162  template <typename Value, auto N>
163  using RepeatValues_ = decltype( get_values_helper<Value>( std::make_index_sequence<N>() ) );
164 
166  template <std::derived_from<DataObject> Out1, std::convertible_to<Out1> Out2>
167  auto put( const DataObjectHandle<Out1>& out_handle, Out2&& out ) {
168  return out_handle.put( std::make_unique<Out1>( std::forward<Out2>( out ) ) );
169  }
170 
171  template <typename Out1, std::convertible_to<Out1> Out2>
172  auto put( const DataObjectHandle<AnyDataWrapper<Out1>>& out_handle, Out2&& out ) {
173  return out_handle.put( std::forward<Out2>( out ) );
174  }
175 
176  // optional put
177  template <typename OutHandle, typename OptOut>
178  requires( is_optional<OptOut> )
179  void put( const OutHandle& out_handle, OptOut&& out ) {
180  if ( out ) put( out_handle, *std::forward<OptOut>( out ) );
181  }
182 
184  // adapt to differences between eg. std::vector (which has push_back) and KeyedContainer (which has insert)
185  // adapt to getting a T, and a container wanting T* by doing new T{ std::move(out) }
186  // adapt to getting a optional<T>
187 
188  constexpr struct insert_t {
189  // for Container<T*>, return T
190  template <typename Container>
191  using c_remove_ptr_t = std::remove_pointer_t<typename Container::value_type>;
192 
193  template <typename Container, typename Value>
194  auto operator()( Container& c, Value&& v ) const -> decltype( c.push_back( v ) ) {
195  return c.push_back( std::forward<Value>( v ) );
196  }
197 
198  template <typename Container, typename Value>
199  auto operator()( Container& c, Value&& v ) const -> decltype( c.insert( v ) ) {
200  return c.insert( std::forward<Value>( v ) );
201  }
202 
203  // Container<T*> with T&& as argument
204  template <typename Container, typename Value>
205  requires( std::is_pointer_v<typename Container::value_type> &&
206  std::is_convertible_v<Value, c_remove_ptr_t<Container>> )
207  auto operator()( Container& c, Value&& v ) const {
208  return operator()( c, new c_remove_ptr_t<Container>{ std::forward<Value>( v ) } );
209  }
210 
211  } insert{};
212 
214 
215  constexpr struct deref_t {
216  template <typename In>
217  requires( !std::is_pointer_v<In> )
218  const In& operator()( const In& in ) const {
219  return in;
220  }
221 
222  template <typename In>
223  requires( !std::is_pointer_v<std::decay_t<In>> )
224  In operator()( In&& in ) const {
225  return std::forward<In>( in );
226  }
227 
228  template <typename In>
229  const In& operator()( const In* in ) const {
230  assert( in != nullptr );
231  return *in;
232  }
233  } deref{};
234 
236  // if Container is a pointer, then we're optional items
237  namespace details2 {
238  template <typename T>
239  constexpr static bool is_gaudi_range_v = false;
240 
241  template <typename T>
242  constexpr static bool is_gaudi_range_v<Gaudi::Range_<T>> = true;
243 
244  template <typename T>
245  constexpr static bool is_gaudi_range_v<Gaudi::NamedRange_<T>> = true;
246 
247  template <typename T>
248  constexpr static bool is_gaudi_range_v<std::optional<Gaudi::NamedRange_<T>>> = true;
249 
250  template <typename In>
252  template <template <typename> class Handle, std::convertible_to<In> I>
253  auto operator()( const Handle<I>& h ) -> const In& {
254  return *h.get();
255  }
256  template <template <typename> class Handle, typename I>
257  auto operator()( const Handle<Gaudi::Range_<I>>& h ) -> const In {
258  return h.get();
259  }
260  template <template <typename> class Handle, typename I>
261  auto operator()( const Handle<Gaudi::NamedRange_<I>>& h ) -> const In {
262  return h.get();
263  }
264  template <template <typename> class Handle, typename I>
265  auto operator()( const Handle<std::optional<Gaudi::NamedRange_<I>>>& h ) -> const In {
266  return h.get();
267  }
268  template <template <typename> class Handle, typename I>
269  requires( std::is_convertible_v<I*, In> )
270  auto operator()( const Handle<I>& h ) -> const In {
271  return h.getIfExists();
272  } // In is-a pointer
273  };
274 
275  template <typename Iterator>
277  using traits = std::iterator_traits<Iterator>;
279 
280  public:
281  using iterator_category [[maybe_unused]] = typename traits::iterator_category;
282  using difference_type [[maybe_unused]] = typename traits::difference_type;
283  using reference = decltype( **m_iter );
284  using value_type [[maybe_unused]] = std::remove_reference_t<reference>;
285  using pointer [[maybe_unused]] = std::add_pointer_t<value_type>;
286 
287  indirect_iterator() = default;
288  constexpr explicit indirect_iterator( Iterator i ) : m_iter( std::move( i ) ) {}
289 
290  constexpr reference operator*() const { return **m_iter; }
291 
292  constexpr bool operator==( const indirect_iterator& rhs ) const { return m_iter == rhs.m_iter; }
293 
295  ++m_iter;
296  return *this;
297  }
298  constexpr indirect_iterator operator++( int ) {
299  auto i = *this;
300  ++*this;
301  return i;
302  }
303 
304  // bidirectional iterator operations (if possible)
305  constexpr indirect_iterator& operator--()
306  requires std::bidirectional_iterator<Iterator>
307  {
308  --m_iter;
309  return *this;
310  }
311  constexpr indirect_iterator operator--( int )
312  requires std::bidirectional_iterator<Iterator>
313  {
314  auto i = *this;
315  --*this;
316  return i;
317  }
318 
319  // random access iterator operations (if possible)
320  constexpr indirect_iterator& operator+=( difference_type n )
321  requires std::random_access_iterator<Iterator>
322  {
323  m_iter += n;
324  return *this;
325  }
326  constexpr indirect_iterator operator+( difference_type n ) const
327  requires std::random_access_iterator<Iterator>
328  {
329  auto i = *this;
330  return i += n;
331  }
332  constexpr indirect_iterator& operator-=( difference_type n )
333  requires std::random_access_iterator<Iterator>
334  {
335  m_iter -= n;
336  return *this;
337  }
338  constexpr indirect_iterator operator-( difference_type n ) const
339  requires std::random_access_iterator<Iterator>
340  {
341  auto i = *this;
342  return i -= n;
343  }
344  constexpr difference_type operator-( const indirect_iterator& other ) const
345  requires std::random_access_iterator<Iterator>
346  {
347  return m_iter - other.m_iter;
348  }
349  constexpr reference operator[]( difference_type n ) const
350  requires std::random_access_iterator<Iterator>
351  {
352  return **( m_iter + n );
353  }
354  };
355 
356  } // namespace details2
357 
358  template <typename Container>
360  static constexpr bool is_pointer = std::is_pointer_v<Container>;
361  static constexpr bool is_range = details2::is_gaudi_range_v<Container>;
362  // TODO: refuse pointer to a range... range must always be by value
363  using val_t = std::add_const_t<std::remove_pointer_t<Container>>;
364  using ptr_t = std::add_pointer_t<val_t>;
365  using ContainerVector = std::vector<std::conditional_t<is_range, std::remove_const_t<val_t>, ptr_t>>;
367 
368  constexpr static decltype( auto ) wrap( ContainerVector::const_reference t ) {
369  if constexpr ( is_pointer || is_range ) {
370  return t;
371  } else {
372  return *t;
373  }
374  }
375  constexpr static auto wrap( ContainerVector::const_iterator i ) {
376  if constexpr ( is_pointer || is_range ) {
377  return i;
378  } else {
379  return details2::indirect_iterator{ i };
380  }
381  }
382 
383  public:
384  using value_type = std::conditional_t<is_pointer, ptr_t, val_t>;
385  using size_type = typename ContainerVector::size_type;
386 
387  vector_of_const_() = default;
388  void reserve( size_type size ) { m_containers.reserve( size ); }
389  template <typename T>
390  void push_back( T&& container ) {
391  if constexpr ( is_pointer || is_range ) {
392  m_containers.push_back( container );
393  } else {
394  // note: does not copy its argument, so we're not really a container...
395  m_containers.push_back( &container );
396  }
397  }
398  auto begin() const { return wrap( m_containers.begin() ); }
399  auto end() const { return wrap( m_containers.end() ); }
400  decltype( auto ) front() const { return wrap( m_containers.front() ); }
401  decltype( auto ) back() const { return wrap( m_containers.back() ); }
402  decltype( auto ) operator[]( size_type i ) const { return wrap( m_containers[i] ); }
403  decltype( auto ) at( size_type i ) const { return wrap( m_containers.at( i ) ); }
404  size_type size() const { return m_containers.size(); }
405  };
406 
408  namespace detail2 { // utilities for detected_or_t{,_} usage
409 
410  // keep only for backwards compatibility... for now.
411  template <typename Tr>
412  using BaseClass_t = typename Tr::BaseClass;
413 
414  template <typename Tr, typename Default>
415  struct BaseClass {
416  using type = Default;
417  };
418  template <typename Tr, typename Default>
419  requires requires { typename Tr::BaseClass; }
420  struct BaseClass<Tr, Default> {
421  using type = Tr::BaseClass;
422  };
423 
424  template <typename T, typename Tr, template <typename...> typename Default>
425  struct OutputHandle {
426  using type = Default<T>;
427  };
428  template <typename T, typename Tr, template <typename...> typename Default>
429  requires requires { typename Tr::template OutputHandle<T>; }
430  struct OutputHandle<T, Tr, Default> {
431  using type = Tr::template OutputHandle<T>;
432  };
433 
434  template <typename T, typename Tr, template <typename...> typename Default>
435  struct InputHandle {
436  using type = Default<T>;
437  };
438  template <typename T, typename Tr, template <typename...> typename Default>
439  requires requires { typename Tr::template InputHandle<T>; }
440  struct InputHandle<T, Tr, Default> {
441  using type = Tr::template InputHandle<T>;
442  };
443 
444  template <typename T>
446  std::conditional_t<std::derived_from<std::decay_t<T>, IAlgTool>,
448  } // namespace detail2
449 
450  // check whether Tr::BaseClass is a valid type,
451  // if so, define BaseClass_t<Tr> as being Tr::BaseClass
452  // else define as being Gaudi::Algorithm
453  template <typename Tr, typename Default = Gaudi::Algorithm>
455 
456  // check whether Traits::{Input,Output}Handle<T> is a valid type,
457  // if so, define {Input,Output}Handle_t<Traits,T> as being Traits::{Input,Output}Handle<T>
458  // else define as being DataObject{Read,,Write}Handle<T>
459  template <typename Tr, typename T>
461 
462  template <typename Tr, typename T>
464 
465  template <typename Traits>
466  inline constexpr bool isLegacy =
467  std::is_base_of_v<Gaudi::details::LegacyAlgorithmAdapter, details::BaseClass_t<Traits>>;
468 
470 #define GAUDI_FUNCTIONAL_MAKE_VECTOR_OF_HANDLES_USES_DATAOBJID
471 
472  template <typename Handles>
473  Handles make_vector_of_handles( IDataHandleHolder* owner, const std::vector<DataObjID>& init ) {
474  Handles handles;
475  handles.reserve( init.size() );
476  std::transform( init.begin(), init.end(), std::back_inserter( handles ),
477  [&]( const auto& loc ) -> typename Handles::value_type {
478  return { loc, owner };
479  } );
480  return handles;
481  }
482 
483  template <typename Handle, typename Algo>
484  auto get( const Handle& handle, const Algo&,
485  const EventContext& ) -> decltype( details::deref( handle.get() ) ) // make it SFINAE friendly...
486  {
487  return details::deref( handle.get() );
488  }
489 
490  template <typename IFace, typename Algo>
491  auto get( const ToolHandle<Gaudi::Interface::Bind::IBinder<IFace>>& handle, const Algo&, const EventContext& ctx ) {
492  return handle.bind( ctx );
493  }
494 
495  template <typename Handle>
496  auto getKey( const Handle& h ) -> decltype( h.objKey() ) {
497  return h.objKey();
498  }
499 
501  // given a pack, return a corresponding tuple
502  template <typename... In>
504  using type = std::tuple<In...>;
505 
506  static_assert( !std::disjunction_v<std::is_same<EventContext, In>...>,
507  "EventContext can only appear as first argument" );
508 
509  template <typename Algorithm, typename Handles>
510  static auto apply( const Algorithm& algo, Handles& handles ) {
511  return std::apply(
512  [&]( const auto&... handle ) { return algo( get( handle, algo, Gaudi::Hive::currentContext() )... ); },
513  handles );
514  }
515  template <typename Algorithm, typename Handles>
516  static auto apply( const Algorithm& algo, const EventContext& ctx, Handles& handles ) {
517  return std::apply( [&]( const auto&... handle ) { return algo( get( handle, algo, ctx )... ); }, handles );
518  }
519  };
520 
521  // except when it starts with EventContext, then drop it
522  template <typename... In>
524  using type = std::tuple<In...>;
525 
526  static_assert( !std::disjunction_v<std::is_same<EventContext, In>...>,
527  "EventContext can only appear as first argument" );
528 
529  template <typename Algorithm, typename Handles>
530  static auto apply( const Algorithm& algo, const EventContext& ctx, Handles& handles ) {
531  return std::apply( [&]( const auto&... handle ) { return algo( ctx, get( handle, algo, ctx )... ); }, handles );
532  }
533 
534  template <typename Algorithm, typename Handles>
535  static auto apply( const Algorithm& algo, Handles& handles ) {
536  return apply( algo, Gaudi::Hive::currentContext(), handles );
537  }
538  };
539 
540  template <typename... In>
542 
543  template <typename OutputSpec, typename InputSpec, typename Traits_>
545 
546  template <typename Out, typename In, typename Tr>
547  void updateHandleLocation( DataHandleMixin<Out, In, Tr>& parent, const std::string& prop,
548  const std::string& newLoc ) {
549  auto sc = parent.setProperty( prop, newLoc );
550  if ( sc.isFailure() ) throw GaudiException( "Could not set Property", prop + " -> " + newLoc, sc );
551  }
552 
553  template <typename Out, typename In, typename Tr>
554  void updateHandleLocations( DataHandleMixin<Out, In, Tr>& parent, const std::string& prop,
555  const std::vector<std::string>& newLocs ) {
556  std::ostringstream ss;
557  GaudiUtils::details::ostream_joiner( ss << '[', newLocs, ", ", []( std::ostream& os, const auto& i ) -> auto& {
558  return os << "'" << i << "'";
559  } ) << ']';
560  auto sc = parent.setProperty( prop, ss.str() );
561  if ( sc.isFailure() ) throw GaudiException( "Could not set Property", prop + " -> " + ss.str(), sc );
562  }
563 
564  template <typename... Out, typename... In, typename Traits_>
565  class DataHandleMixin<std::tuple<Out...>, std::tuple<In...>, Traits_> : public BaseClass_t<Traits_> {
566  static_assert( std::is_base_of_v<Algorithm, BaseClass_t<Traits_>>, "BaseClass must inherit from Algorithm" );
567 
568  template <typename IArgs, typename OArgs, std::size_t... I, std::size_t... J>
569  DataHandleMixin( std::string name, ISvcLocator* pSvcLocator, const IArgs& inputs, std::index_sequence<I...>,
570  const OArgs& outputs, std::index_sequence<J...> )
571  : BaseClass_t<Traits_>( std::move( name ), pSvcLocator )
572  , m_inputs( std::tuple_cat( std::forward_as_tuple( this ), std::get<I>( inputs ) )... )
573  , m_outputs( std::tuple_cat( std::forward_as_tuple( this ), std::get<J>( outputs ) )... ) {
574  // make sure this algorithm is seen as reentrant by Gaudi
575  this->setProperty( "Cardinality", 0 ).ignore();
576  }
577 
578  public:
579  constexpr static std::size_t N_in = sizeof...( In );
580  constexpr static std::size_t N_out = sizeof...( Out );
581 
582  using KeyValue = std::pair<std::string, std::string>;
583  using KeyValues = std::pair<std::string, std::vector<std::string>>;
584 
585  // generic constructor: N -> M
586  DataHandleMixin( std::string name, ISvcLocator* pSvcLocator, RepeatValues_<KeyValue, N_in> const& inputs,
587  RepeatValues_<KeyValue, N_out> const& outputs )
588  : DataHandleMixin( std::move( name ), pSvcLocator, inputs, std::index_sequence_for<In...>{}, outputs,
589  std::index_sequence_for<Out...>{} ) {}
590 
591  // special cases: forward to the generic case...
592  // 1 -> 1
593  DataHandleMixin( std::string name, ISvcLocator* locator, const KeyValue& input, const KeyValue& output )
594  : DataHandleMixin( std::move( name ), locator, std::forward_as_tuple( input ),
595  std::forward_as_tuple( output ) ) {}
596  // 1 -> N
597  DataHandleMixin( std::string name, ISvcLocator* locator, const KeyValue& input,
598  RepeatValues_<KeyValue, N_out> const& outputs )
599  : DataHandleMixin( std::move( name ), locator, std::forward_as_tuple( input ), outputs ) {}
600  // N -> 1
601  DataHandleMixin( std::string name, ISvcLocator* locator, RepeatValues_<KeyValue, N_in> const& inputs,
602  const KeyValue& output )
603  : DataHandleMixin( std::move( name ), locator, inputs, std::forward_as_tuple( output ) ) {}
604 
605  template <std::size_t N = 0>
606  decltype( auto ) inputLocation() const {
607  return getKey( std::get<N>( m_inputs ) );
608  }
609  template <typename T>
610  decltype( auto ) inputLocation() const {
611  return getKey( std::get<details::InputHandle_t<Traits_, std::decay_t<T>>>( m_inputs ) );
612  }
613  constexpr unsigned int inputLocationSize() const { return N_in; }
614 
615  template <std::size_t N = 0>
616  decltype( auto ) outputLocation() const {
617  return getKey( std::get<N>( m_outputs ) );
618  }
619  template <typename T>
620  decltype( auto ) outputLocation() const {
621  return getKey( std::get<details::OutputHandle_t<Traits_, std::decay_t<T>>>( m_outputs ) );
622  }
623  constexpr unsigned int outputLocationSize() const { return N_out; }
624 
625  protected:
626  bool isReEntrant() const override { return true; }
627 
628  std::tuple<details::InputHandle_t<Traits_, In>...> m_inputs;
629  std::tuple<details::OutputHandle_t<Traits_, Out>...> m_outputs;
630  };
631 
632  template <typename Traits_>
633  class DataHandleMixin<std::tuple<>, std::tuple<>, Traits_> : public BaseClass_t<Traits_> {
634  static_assert( std::is_base_of_v<Algorithm, BaseClass_t<Traits_>>, "BaseClass must inherit from Algorithm" );
635 
636  public:
637  using KeyValue = std::pair<std::string, std::string>;
638  using KeyValues = std::pair<std::string, std::vector<std::string>>;
639  DataHandleMixin( std::string name, ISvcLocator* pSvcLocator, std::tuple<> = {}, std::tuple<> = {} )
640  : BaseClass_t<Traits_>( std::move( name ), pSvcLocator ) {
641  // make sure this algorithm is seen as reentrant by Gaudi
642  this->setProperty( "Cardinality", 0 ).ignore();
643  }
644 
645  protected:
646  bool isReEntrant() const override { return true; }
647 
648  std::tuple<> m_inputs;
649  };
650 
651  template <typename... In, typename Traits_>
652  class DataHandleMixin<std::tuple<>, std::tuple<In...>, Traits_> : public BaseClass_t<Traits_> {
653  static_assert( std::is_base_of_v<Algorithm, BaseClass_t<Traits_>>, "BaseClass must inherit from Algorithm" );
654 
655  template <typename IArgs, std::size_t... I>
656  DataHandleMixin( std::string name, ISvcLocator* pSvcLocator, const IArgs& inputs, std::index_sequence<I...> )
657  : BaseClass_t<Traits_>( std::move( name ), pSvcLocator )
658  , m_inputs( std::tuple_cat( std::forward_as_tuple( this ), std::get<I>( inputs ) )... ) {
659  // make sure this algorithm is seen as reentrant by Gaudi
660  this->setProperty( "Cardinality", 0 ).ignore();
661  }
662 
663  public:
664  using KeyValue = std::pair<std::string, std::string>;
665  using KeyValues = std::pair<std::string, std::vector<std::string>>;
666  constexpr static std::size_t N_in = sizeof...( In );
667 
668  // generic constructor: N -> 0
669  DataHandleMixin( std::string name, ISvcLocator* pSvcLocator, RepeatValues_<KeyValue, N_in> const& inputs )
670  : DataHandleMixin( std::move( name ), pSvcLocator, inputs, std::index_sequence_for<In...>{} ) {}
671 
672  // special cases: forward to the generic case...
673  // 1 -> 0
674  DataHandleMixin( std::string name, ISvcLocator* locator, const KeyValue& input )
675  : DataHandleMixin( std::move( name ), locator, std::forward_as_tuple( input ) ) {}
676 
677  template <std::size_t N = 0>
678  decltype( auto ) inputLocation() const {
679  return getKey( std::get<N>( m_inputs ) );
680  }
681  template <typename T>
682  decltype( auto ) inputLocation() const {
683  return getKey( std::get<details::InputHandle_t<Traits_, std::decay_t<T>>>( m_inputs ) );
684  }
685  constexpr unsigned int inputLocationSize() const { return N_in; }
686 
687  protected:
688  bool isReEntrant() const override { return true; }
689 
690  std::tuple<details::InputHandle_t<Traits_, In>...> m_inputs;
691  };
692 
693  template <typename Traits_>
694  class DataHandleMixin<std::tuple<void>, std::tuple<>, Traits_>
695  : public DataHandleMixin<std::tuple<>, std::tuple<>, Traits_> {
696  public:
697  using DataHandleMixin<std::tuple<>, std::tuple<>, Traits_>::DataHandleMixin;
698  };
699 
700  template <typename... Out, typename Traits_>
701  class DataHandleMixin<std::tuple<Out...>, std::tuple<>, Traits_> : public BaseClass_t<Traits_> {
702  static_assert( std::is_base_of_v<Algorithm, BaseClass_t<Traits_>>, "BaseClass must inherit from Algorithm" );
703 
704  template <typename OArgs, std::size_t... J>
705  DataHandleMixin( std::string name, ISvcLocator* pSvcLocator, const OArgs& outputs, std::index_sequence<J...> )
706  : BaseClass_t<Traits_>( std::move( name ), pSvcLocator )
707  , m_outputs( std::tuple_cat( std::forward_as_tuple( this ), std::get<J>( outputs ) )... ) {
708  // make sure this algorithm is seen as reentrant by Gaudi
709  this->setProperty( "Cardinality", 0 ).ignore();
710  }
711 
712  public:
713  constexpr static std::size_t N_out = sizeof...( Out );
714  using KeyValue = std::pair<std::string, std::string>;
715  using KeyValues = std::pair<std::string, std::vector<std::string>>;
716 
717  // generic constructor: 0 -> N
718  DataHandleMixin( std::string name, ISvcLocator* pSvcLocator, RepeatValues_<KeyValue, N_out> const& outputs )
719  : DataHandleMixin( std::move( name ), pSvcLocator, outputs, std::index_sequence_for<Out...>{} ) {}
720 
721  // 0 -> 1
722  DataHandleMixin( std::string name, ISvcLocator* locator, const KeyValue& output )
723  : DataHandleMixin( std::move( name ), locator, std::forward_as_tuple( output ) ) {}
724 
725  template <std::size_t N = 0>
726  decltype( auto ) outputLocation() const {
727  return getKey( std::get<N>( m_outputs ) );
728  }
729  constexpr unsigned int outputLocationSize() const { return N_out; }
730 
731  protected:
732  bool isReEntrant() const override { return true; }
733 
734  std::tuple<details::OutputHandle_t<Traits_, Out>...> m_outputs;
735  };
736 
738  template <typename Fun, typename Container, typename... Args>
739  constexpr void applyPostProcessing( const Fun&, Container&, Args... ) {
740  static_assert( sizeof...( Args ) == 0, "Args should not be used!" );
741  }
742 
743  template <typename Fun, typename Container>
744  auto applyPostProcessing( const Fun& fun, Container& c ) -> decltype( fun.postprocess( c ), void() ) {
745  fun.postprocess( c );
746  }
747 
748 } // namespace Gaudi::Functional::details
IDataHandleHolder
Definition: IDataHandleHolder.h:23
Gaudi::Functional::details::detail2::BaseClass_t
typename Tr::BaseClass BaseClass_t
Definition: details.h:412
Gaudi::Functional::details::filter_evtcontext_t< EventContext, In... >::type
std::tuple< In... > type
Definition: details.h:524
Gaudi::Functional::details::detail2::OutputHandle< T, Tr, Default >::type
Tr::template OutputHandle< T > type
Definition: details.h:431
Gaudi::Functional::details::remove_optional_t
typename details2::value_type_of< T >::type remove_optional_t
Definition: details.h:142
Gaudi::Functional::details::details2::value_type_of::type
T type
Definition: details.h:131
Gaudi::Functional::details::DataHandleMixin< std::tuple<>, std::tuple< In... >, Traits_ >::KeyValues
std::pair< std::string, std::vector< std::string > > KeyValues
Definition: details.h:665
Gaudi::Functional::details::invoke_optionally_t
Definition: details.h:144
Gaudi::Functional::details::vector_of_const_::val_t
std::add_const_t< std::remove_pointer_t< Container > > val_t
Definition: details.h:363
Gaudi::Functional::details::deref_t::operator()
const In & operator()(const In *in) const
Definition: details.h:229
Gaudi::Functional::details::detail2::OutputHandle
Definition: details.h:425
Gaudi::Functional::details::zip::check_sizes
bool check_sizes(const A &) noexcept
Resolve case there is only one container in the range.
Definition: details.h:57
DataObjectWriteHandle
Definition: DataObjectHandle.h:464
Gaudi::Functional::details::details2::indirect_iterator
Definition: details.h:276
Gaudi::Functional::details::details2::indirect_iterator::operator*
constexpr reference operator*() const
Definition: details.h:290
IAlgTool
Definition: IAlgTool.h:29
details::size
constexpr auto size(const T &, Args &&...) noexcept
Definition: AnyDataWrapper.h:23
setProperty
bool PyHelper() setProperty(IInterface *p, char *name, char *value)
Definition: Bootstrap.cpp:211
Gaudi::Functional::details::DataHandleMixin< std::tuple<>, std::tuple< In... >, Traits_ >::m_inputs
std::tuple< details::InputHandle_t< Traits_, In >... > m_inputs
Definition: details.h:690
Gaudi::Functional::details::invoke_optionally_t::requires
requires(!is_optional< Arg >) decltype(auto) operator()(F &&f
Gaudi::Functional::details::DataHandleMixin< std::tuple< Out... >, std::tuple< In... >, Traits_ >::DataHandleMixin
DataHandleMixin(std::string name, ISvcLocator *locator, const KeyValue &input, const KeyValue &output)
Definition: details.h:593
Gaudi::Functional::details::detail2::DefaultInputHandle
std::conditional_t< std::derived_from< std::decay_t< T >, IAlgTool >, ToolHandle< Gaudi::Interface::Bind::IBinder< std::decay_t< T > >>, DataObjectReadHandle< T > > DefaultInputHandle
Definition: details.h:447
Gaudi::Functional::details::get
auto get(const ToolHandle< Gaudi::Interface::Bind::IBinder< IFace >> &handle, const Algo &, const EventContext &ctx)
Definition: details.h:491
Gaudi::Functional::details
Definition: Consumer.h:21
Gaudi::NamedRange_
Definition: NamedRange.h:42
Gaudi::Functional::details::invoke_optionally_t::operator()
void operator()(F &&f, Arg &&arg) const
Definition: details.h:151
Gaudi::Hive::currentContext
GAUDI_API const EventContext & currentContext()
Definition: ThreadLocalContext.cpp:30
Gaudi::Functional::details::vector_of_const_::wrap
constexpr static auto wrap(ContainerVector::const_iterator i)
Definition: details.h:375
Gaudi::Functional::details::DataHandleMixin< std::tuple< Out... >, std::tuple< In... >, Traits_ >::isReEntrant
bool isReEntrant() const override
Definition: details.h:626
Gaudi::Functional::details::DataHandleMixin< std::tuple< Out... >, std::tuple<>, Traits_ >::DataHandleMixin
DataHandleMixin(std::string name, ISvcLocator *locator, const KeyValue &output)
Definition: details.h:722
Gaudi::Functional::details::details2::get_from_handle::operator()
auto operator()(const Handle< I > &h) -> const In &
Definition: details.h:253
GaudiPartProp.decorators.std
std
Definition: decorators.py:32
Gaudi::Functional::details::DataHandleMixin< std::tuple< Out... >, std::tuple<>, Traits_ >::DataHandleMixin
DataHandleMixin(std::string name, ISvcLocator *pSvcLocator, RepeatValues_< KeyValue, N_out > const &outputs)
Definition: details.h:718
Gaudi::Functional::details::details2::get_from_handle::operator()
auto operator()(const Handle< std::optional< Gaudi::NamedRange_< I >>> &h) -> const In
Definition: details.h:265
Gaudi::Functional::details::invoke_optionally
constexpr struct Gaudi::Functional::details::invoke_optionally_t invoke_optionally
Gaudi::Functional::details::DataHandleMixin< std::tuple< Out... >, std::tuple<>, Traits_ >::isReEntrant
bool isReEntrant() const override
Definition: details.h:732
GaudiException.h
Gaudi::Functional::details::insert_t::operator()
auto operator()(Container &c, Value &&v) const -> decltype(c.push_back(v))
Definition: details.h:194
Gaudi::Functional::details::isLegacy
constexpr bool isLegacy
Definition: details.h:466
Gaudi::Functional::details::DataHandleMixin< std::tuple<>, std::tuple< In... >, Traits_ >::DataHandleMixin
DataHandleMixin(std::string name, ISvcLocator *pSvcLocator, const IArgs &inputs, std::index_sequence< I... >)
Definition: details.h:656
Gaudi::Functional::details::deref_t::requires
requires(!std::is_pointer_v< In >) const In &operator()(const In &in) const
Definition: details.h:217
Gaudi::Functional::details::deref_t
Definition: details.h:215
ISvcLocator
Definition: ISvcLocator.h:42
GaudiException
Definition: GaudiException.h:29
Gaudi::Functional::details::detail2::InputHandle< T, Tr, Default >::type
Tr::template InputHandle< T > type
Definition: details.h:441
Gaudi::Functional::details::vector_of_const_::m_containers
ContainerVector m_containers
Definition: details.h:366
Algorithm.h
Gaudi::Functional::details::DataHandleMixin< std::tuple< Out... >, std::tuple< In... >, Traits_ >::KeyValue
std::pair< std::string, std::string > KeyValue
Definition: details.h:582
Gaudi::Functional::details::details2::indirect_iterator::indirect_iterator
indirect_iterator()=default
Gaudi::Functional::details::DataHandleMixin< std::tuple< Out... >, std::tuple< In... >, Traits_ >::m_inputs
std::tuple< details::InputHandle_t< Traits_, In >... > m_inputs
Definition: details.h:628
Gaudi::Functional::details::vector_of_const_::reserve
void reserve(size_type size)
Definition: details.h:388
Gaudi::Functional::details::DataHandleMixin< std::tuple< Out... >, std::tuple<>, Traits_ >::outputLocationSize
constexpr unsigned int outputLocationSize() const
Definition: details.h:729
Gaudi::Functional::details::DataHandleMixin< std::tuple<>, std::tuple<>, Traits_ >::isReEntrant
bool isReEntrant() const override
Definition: details.h:646
Gaudi::Functional::details::vector_of_const_::size_type
typename ContainerVector::size_type size_type
Definition: details.h:385
Gaudi::Functional::details::zip::const_range
decltype(auto) const_range(Args &&... args)
Zips multiple containers together to form a single const range.
Definition: details.h:99
Gaudi::Functional::details::DataHandleMixin< std::tuple< Out... >, std::tuple< In... >, Traits_ >::DataHandleMixin
DataHandleMixin(std::string name, ISvcLocator *locator, RepeatValues_< KeyValue, N_in > const &inputs, const KeyValue &output)
Definition: details.h:601
gaudirun.c
c
Definition: gaudirun.py:525
System::typeinfoName
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition: System.cpp:260
Gaudi::Functional::details::vector_of_const_
Definition: details.h:359
gaudirun.output
output
Definition: gaudirun.py:521
Gaudi::Functional::details::DataHandleMixin< std::tuple< Out... >, std::tuple< In... >, Traits_ >::DataHandleMixin
DataHandleMixin(std::string name, ISvcLocator *pSvcLocator, const IArgs &inputs, std::index_sequence< I... >, const OArgs &outputs, std::index_sequence< J... >)
Definition: details.h:569
MultiMergers.Value
Value
Definition: MultiMergers.py:15
Gaudi::Functional::details::get_values_helper
auto get_values_helper(std::index_sequence< I... >)
Definition: details.h:158
Gaudi::Functional::details::to_DataObjID
std::vector< DataObjID > to_DataObjID(const std::vector< std::string > &in)
Definition: details.h:111
DataObjectHandle
DataObjectHandle.h GaudiKernel/DataObjectHandle.h.
Definition: AlgTool.h:36
Gaudi::Functional::details::DataHandleMixin< std::tuple<>, std::tuple< In... >, Traits_ >::KeyValue
std::pair< std::string, std::string > KeyValue
Definition: details.h:664
Gaudi::Functional::details::filter_evtcontext_t< EventContext, In... >::apply
static auto apply(const Algorithm &algo, Handles &handles)
Definition: details.h:535
Gaudi::Functional::details::make_vector_of_handles
Handles make_vector_of_handles(IDataHandleHolder *owner, const std::vector< DataObjID > &init)
Definition: details.h:473
Gaudi::Functional::details::insert_t
Definition: details.h:188
Gaudi::Functional::details::insert_t::c_remove_ptr_t
std::remove_pointer_t< typename Container::value_type > c_remove_ptr_t
Definition: details.h:191
Gaudi::Functional::details::requires
requires(is_optional< OptOut >) void put(const OutHandle &out_handle
bug_34121.t
t
Definition: bug_34121.py:31
Gaudi::Functional::details::details2::indirect_iterator::indirect_iterator
constexpr indirect_iterator(Iterator i)
Definition: details.h:288
Gaudi::Functional::details::details2::indirect_iterator::iterator_category
typename traits::iterator_category iterator_category
Definition: details.h:281
ToolHandle
Definition: ToolHandle.h:130
Gaudi::Functional::details::deref_t::requires
requires(!std::is_pointer_v< std::decay_t< In >>) In operator()(In &&in) const
Definition: details.h:223
Gaudi::Functional::details::DataHandleMixin< std::tuple< Out... >, std::tuple< In... >, Traits_ >::DataHandleMixin
DataHandleMixin(std::string name, ISvcLocator *pSvcLocator, RepeatValues_< KeyValue, N_in > const &inputs, RepeatValues_< KeyValue, N_out > const &outputs)
Definition: details.h:586
Gaudi::Functional::details::details2::get_from_handle::requires
requires(std::is_convertible_v< I *, In >) auto operator()(const Handle< I > &h) -> const In
Definition: details.h:269
Gaudi::Functional::details::BaseClass_t
detail2::BaseClass< Tr, Default >::type BaseClass_t
Definition: details.h:454
Gaudi::Functional::details::put
auto put(const DataObjectHandle< AnyDataWrapper< Out1 >> &out_handle, Out2 &&out)
Definition: details.h:172
Gaudi::Functional::details::DataHandleMixin< std::tuple< Out... >, std::tuple< In... >, Traits_ >::inputLocationSize
constexpr unsigned int inputLocationSize() const
Definition: details.h:613
GaudiPython.Pythonizations.ctx
ctx
Definition: Pythonizations.py:578
Gaudi::Functional::details::vector_of_const_::ContainerVector
std::vector< std::conditional_t< is_range, std::remove_const_t< val_t >, ptr_t > > ContainerVector
Definition: details.h:365
Gaudi::Functional::details::filter_evtcontext_t< EventContext, In... >::apply
static auto apply(const Algorithm &algo, const EventContext &ctx, Handles &handles)
Definition: details.h:530
Gaudi::Functional::details::details2::indirect_iterator::m_iter
Iterator m_iter
Definition: details.h:278
Gaudi::Functional::details::insert_t::requires
requires(std::is_pointer_v< typename Container::value_type > &&std::is_convertible_v< Value, c_remove_ptr_t< Container >>) auto operator()(Container &c
Gaudi::Functional::details::details2::indirect_iterator::reference
decltype(**m_iter) reference
Definition: details.h:283
Gaudi::Functional::details::detail2::BaseClass
Definition: details.h:415
Gaudi::Functional::details::DataHandleMixin< std::tuple< Out... >, std::tuple<>, Traits_ >::DataHandleMixin
DataHandleMixin(std::string name, ISvcLocator *pSvcLocator, const OArgs &outputs, std::index_sequence< J... >)
Definition: details.h:705
Gaudi::Functional::details::vector_of_const_::value_type
std::conditional_t< is_pointer, ptr_t, val_t > value_type
Definition: details.h:384
Gaudi::Functional::details::details2::indirect_iterator::difference_type
typename traits::difference_type difference_type
Definition: details.h:282
Gaudi::Algorithm
Base class from which all concrete algorithm classes should be derived.
Definition: Algorithm.h:87
DataObjectReadHandle
Definition: DataObjectHandle.h:442
AlgSequencer.h
h
Definition: AlgSequencer.py:31
Gaudi::Functional::details::applyPostProcessing
auto applyPostProcessing(const Fun &fun, Container &c) -> decltype(fun.postprocess(c), void())
Definition: details.h:744
Gaudi::Functional::details::is_optional
concept is_optional
Definition: details.h:121
Gaudi::Functional::details::DataHandleMixin< std::tuple<>, std::tuple< In... >, Traits_ >::inputLocationSize
constexpr unsigned int inputLocationSize() const
Definition: details.h:685
Gaudi::Functional::details::DataHandleMixin< std::tuple<>, std::tuple<>, Traits_ >::KeyValues
std::pair< std::string, std::vector< std::string > > KeyValues
Definition: details.h:638
Gaudi::Functional::details::filter_evtcontext_t::apply
static auto apply(const Algorithm &algo, Handles &handles)
Definition: details.h:510
Gaudi::Functional::details::details2::get_from_handle::operator()
auto operator()(const Handle< Gaudi::NamedRange_< I >> &h) -> const In
Definition: details.h:261
Gaudi::Functional::details::deref
constexpr struct Gaudi::Functional::details::deref_t deref
Algorithm.h
Gaudi::Functional::details::DataHandleMixin< std::tuple< Out... >, std::tuple<>, Traits_ >::m_outputs
std::tuple< details::OutputHandle_t< Traits_, Out >... > m_outputs
Definition: details.h:734
Gaudi::Functional::details::vector_of_const_::begin
auto begin() const
Definition: details.h:398
Gaudi::Functional::details::detail2::OutputHandle::type
Default< T > type
Definition: details.h:426
AnyDataWrapper
Definition: AnyDataWrapper.h:55
Gaudi::Functional::details::details2::indirect_iterator::operator==
constexpr bool operator==(const indirect_iterator &rhs) const
Definition: details.h:292
Gaudi::Functional::details::vector_of_const_::push_back
void push_back(T &&container)
Definition: details.h:390
Gaudi::Functional::details::details2::get_from_handle::operator()
auto operator()(const Handle< Gaudi::Range_< I >> &h) -> const In
Definition: details.h:257
Gaudi::Functional::details::updateHandleLocation
void updateHandleLocation(DataHandleMixin< Out, In, Tr > &parent, const std::string &prop, const std::string &newLoc)
Definition: details.h:547
Gaudi::Functional::details::zip::printSizes
void printSizes(OS &out, Arg &&arg)
Print the parameter.
Definition: details.h:43
Gaudi::Functional::details::DataHandleMixin< std::tuple< Out... >, std::tuple< In... >, Traits_ >::m_outputs
std::tuple< details::OutputHandle_t< Traits_, Out >... > m_outputs
Definition: details.h:629
cpluginsvc.n
n
Definition: cpluginsvc.py:234
IBinder.h
Gaudi::Functional::details::detail2::InputHandle
Definition: details.h:435
Gaudi::Functional::details::filter_evtcontext_t
Definition: details.h:503
Gaudi::Range_
Definition: Range.h:81
Gaudi::Functional::details::DataHandleMixin< std::tuple<>, std::tuple< In... >, Traits_ >::isReEntrant
bool isReEntrant() const override
Definition: details.h:688
Gaudi::Functional::details::DataHandleMixin< std::tuple<>, std::tuple<>, Traits_ >::m_inputs
std::tuple m_inputs
Definition: details.h:648
gaudirun.type
type
Definition: gaudirun.py:160
ThreadLocalContext.h
DataObjectHandle::put
T * put(std::unique_ptr< T > object) const
Register object in transient store.
Definition: DataObjectHandle.h:175
ConditionsStallTest.name
name
Definition: ConditionsStallTest.py:77
Gaudi::Functional::details::zip::verifySizes
decltype(auto) verifySizes(Args &... args)
Verify the data container sizes have the same sizes.
Definition: details.h:75
Gaudi::Functional::details::filter_evtcontext_t::apply
static auto apply(const Algorithm &algo, const EventContext &ctx, Handles &handles)
Definition: details.h:516
Gaudi::Functional::details::details2::get_from_handle
Definition: details.h:251
gaudirun.args
args
Definition: gaudirun.py:336
EventContext
Definition: EventContext.h:34
Gaudi::Functional::details::RepeatValues_
decltype(get_values_helper< Value >(std::make_index_sequence< N >())) RepeatValues_
Definition: details.h:163
Gaudi::Functional::details::DataHandleMixin< std::tuple< Out... >, std::tuple< In... >, Traits_ >::outputLocationSize
constexpr unsigned int outputLocationSize() const
Definition: details.h:623
Gaudi::Functional::details::details2::indirect_iterator::value_type
std::remove_reference_t< reference > value_type
Definition: details.h:284
Gaudi::Functional::Traits::BaseClass_t
Definition: utilities.h:37
Gaudi::Functional::details::details2::indirect_iterator::traits
std::iterator_traits< Iterator > traits
Definition: details.h:277
Gaudi::Functional::details::DataHandleMixin< std::tuple< Out... >, std::tuple<>, Traits_ >::KeyValue
std::pair< std::string, std::string > KeyValue
Definition: details.h:714
fixtures.reference
Generator[dict, None, None] reference(request, Optional[Path] reference_path)
Definition: fixtures.py:211
Gaudi::Functional::details::updateHandleLocations
void updateHandleLocations(DataHandleMixin< Out, In, Tr > &parent, const std::string &prop, const std::vector< std::string > &newLocs)
Definition: details.h:554
Gaudi::Functional::details::insert_t::operator()
auto operator()(Container &c, Value &&v) const -> decltype(c.insert(v))
Definition: details.h:199
Gaudi::Functional::details::detail2::BaseClass::type
Default type
Definition: details.h:416
Properties.v
v
Definition: Properties.py:122
Gaudi::Functional::details::DataHandleMixin
Definition: details.h:544
Gaudi::Functional::details::details2::indirect_iterator::operator++
constexpr indirect_iterator & operator++()
Definition: details.h:294
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:100
Gaudi::Functional::details::details2::indirect_iterator::pointer
std::add_pointer_t< value_type > pointer
Definition: details.h:285
Gaudi::Functional::details::DataHandleMixin< std::tuple<>, std::tuple<>, Traits_ >::KeyValue
std::pair< std::string, std::string > KeyValue
Definition: details.h:637
Gaudi::Functional::details::DataHandleMixin< std::tuple<>, std::tuple<>, Traits_ >::DataHandleMixin
DataHandleMixin(std::string name, ISvcLocator *pSvcLocator, std::tuple<>={}, std::tuple<>={})
Definition: details.h:639
Gaudi::Functional::details::details2::value_type_of< T >::type
T::value_type type
Definition: details.h:136
Gaudi::Functional::details::insert
constexpr struct Gaudi::Functional::details::insert_t insert
Gaudi::Functional::details::detail2::InputHandle::type
Default< T > type
Definition: details.h:436
Gaudi::Functional::details::InputHandle_t
typename detail2::InputHandle< T, Tr, detail2::DefaultInputHandle >::type InputHandle_t
Definition: details.h:463
Gaudi::Interface::Bind::IBinder
Definition: IBinder.h:47
DataObjectHandle.h
Gaudi::operator+
decltype(auto) operator+(const T &v, const Property< TP, V, H > &p)
implemantation of (value + property)
Definition: Property.h:432
Gaudi::Functional::details::DataHandleMixin< std::tuple< Out... >, std::tuple<>, Traits_ >::KeyValues
std::pair< std::string, std::vector< std::string > > KeyValues
Definition: details.h:715
Gaudi::Functional::details::details2::value_type_of
Definition: details.h:130
Gaudi::Functional::details::filter_evtcontext_t::type
std::tuple< In... > type
Definition: details.h:504
Gaudi::Functional::details::DataHandleMixin< std::tuple< Out... >, std::tuple< In... >, Traits_ >::KeyValues
std::pair< std::string, std::vector< std::string > > KeyValues
Definition: details.h:583
Gaudi::Utils::Histos::Formats::Default
@ Default
Definition: HistoTableFormat.h:95
Gaudi::Functional::details::vector_of_const_::end
auto end() const
Definition: details.h:399
Gaudi::Functional::details::filter_evtcontext
typename filter_evtcontext_t< In... >::type filter_evtcontext
Definition: details.h:541
Gaudi::Functional::details::DataHandleMixin< std::tuple<>, std::tuple< In... >, Traits_ >::DataHandleMixin
DataHandleMixin(std::string name, ISvcLocator *pSvcLocator, RepeatValues_< KeyValue, N_in > const &inputs)
Definition: details.h:669
Gaudi::Functional::details::detail2::BaseClass< Tr, Default >::type
Tr::BaseClass type
Definition: details.h:421
Gaudi::Functional::details::vector_of_const_::vector_of_const_
vector_of_const_()=default
Gaudi::Functional::details::vector_of_const_::ptr_t
std::add_pointer_t< val_t > ptr_t
Definition: details.h:364
operator-
GAUDI_API Stat operator-(const Stat &stat, const double value)
external operator for subtraction of Stat and a number
Definition: Stat.cpp:75
Gaudi::Functional::details::DataHandleMixin< std::tuple< Out... >, std::tuple< In... >, Traits_ >::DataHandleMixin
DataHandleMixin(std::string name, ISvcLocator *locator, const KeyValue &input, RepeatValues_< KeyValue, N_out > const &outputs)
Definition: details.h:597
Gaudi::Functional::details::details2::indirect_iterator::operator++
constexpr indirect_iterator operator++(int)
Definition: details.h:298
Gaudi::Functional::details::zip::range
decltype(auto) range(Args &&... args)
Zips multiple containers together to form a single range.
Definition: details.h:86
GaudiUtils::details::ostream_joiner
Stream & ostream_joiner(Stream &os, Iterator first, Iterator last, Separator sep, OutputElement output=OutputElement{})
Definition: SerializeSTL.h:86
Gaudi::Functional::details::DataHandleMixin< std::tuple<>, std::tuple< In... >, Traits_ >::DataHandleMixin
DataHandleMixin(std::string name, ISvcLocator *locator, const KeyValue &input)
Definition: details.h:674
Gaudi::Functional::details::OutputHandle_t
typename detail2::OutputHandle< T, Tr, DataObjectWriteHandle >::type OutputHandle_t
Definition: details.h:460
Iterator
boost::spirit::classic::position_iterator2< ForwardIterator > Iterator
Definition: Iterator.h:18
Gaudi::Functional::details::out
OptOut && out
Definition: details.h:179
Gaudi::Functional::details::getKey
auto getKey(const Handle &h) -> decltype(h.objKey())
Definition: details.h:496
Gaudi::Functional::details::vector_of_const_::size
size_type size() const
Definition: details.h:404