The Gaudi Framework  master (37c0b60a)
KeyedObjectManager.cpp
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 // Include files
14 #include <GaudiKernel/HashMap.h>
15 #include <GaudiKernel/Kernel.h>
17 #include <algorithm>
18 #include <map>
19 
20 namespace Containers {
21  struct hashmap {
25  bool insert( void* obj, long key ) {
26  auto p = m.insert( map_type::value_type( key, obj ) );
27  return p.second;
28  }
29  hashmap() = default;
30  hashmap( hashmap&& ) = default;
31  };
32  struct map {
36  bool insert( void* obj, long key ) {
37  auto p = m.insert( map_type::value_type( key, obj ) );
38  return p.second;
39  }
40  map() = default;
41  map( map&& ) = default;
42  };
43  struct array {
49  struct decrement {
50  long m_min;
51  decrement( long m ) : m_min( m ) {}
52  bool operator()( long& j ) const {
53  if ( j > m_min ) --j;
54  return true;
55  }
56  };
57  array() = default;
58  array( array&& ) = default;
59  };
60  struct vector {
64  vector() = default;
65  vector( vector&& ) = default;
66  };
67 
68  template <class CONT>
69  class find {
70  const void* m_obj;
71  typedef typename CONT::value_type v_type;
72 
73  public:
74  find( const void* o ) : m_obj( o ) {}
75  bool operator()( const void* cmp ) const { return cmp == m_obj; }
76  bool operator()( const v_type& cmp ) const { return ( *this )( cmp.second ); }
77  };
78 } // namespace Containers
80  throw GaudiException( "Cannot assign key to keyed object! Object already has a key.", "KeyedObject",
82 }
84  throw GaudiException( "Cannot insert element to Keyed Container!", "KeyedContainer", StatusCode::FAILURE );
85 }
86 
88  throw GaudiException( "Keyed Container structures are inconsistent - severe problem!", "KeyedContainer",
90 }
91 
93  throw GaudiException( "Keyed Container cannot satisfy request - severe problem!", "KeyedContainer",
95 }
96 
97 template <class T>
99  if ( sizeof( typename T::map_type ) > sizeof( m_setup.buffer ) ) {
100  throw GaudiException( "Basic STL contaier sizes are incompatible", "KeyedContainer", StatusCode::FAILURE );
101  }
102  m_setup.s = ::new ( m_setup.buffer + sizeof( m_setup.s ) ) T();
103  m_keyCtxt = -1;
104 }
105 
106 template <class T>
108  : m_seq( nullptr ), m_direct( other.m_direct ), m_keyCtxt( other.m_keyCtxt ) {
109  m_setup.s = ::new ( m_setup.buffer + sizeof( m_setup.s ) ) T( std::move( *other.m_setup.s ) );
110 
111  other.m_keyCtxt = -1;
112  other.m_seq = nullptr;
113  other.m_direct = 0;
114 }
115 
116 // the usage of namespace here is only to avoid a clang11/12 compiler warning
117 // due to a miswording in the specification of C++ and fixed in C++20, see
118 // https://stackoverflow.com/questions/68751682/is-a-class-templates-name-in-scope-for-a-qualified-out-of-line-destructors-def
119 namespace Containers {
120  template <class T>
122  m_setup.s->~T();
123  }
124 } // namespace Containers
125 
127 template <class T>
128 void Containers::KeyedObjectManager<T>::setup( void* seq, void** rndm ) {
129  m_seq = (seq_type*)seq;
130  *rndm = &m_setup.s->v;
131 }
132 
133 template <class T>
135  m_direct = 1;
136  auto& s = *m_setup.s;
137  long i = 0;
138  for ( auto p : s.v ) s.insert( p, i++ );
139  s.v.clear();
140 }
141 
142 template <class T>
144  long* key ) {
145  *key = ++m_keyCtxt;
146  return insert( pBase, pObject, obj, *key );
147 }
148 
149 template <class T>
151  long key ) {
153  if ( key > m_keyCtxt ) { m_keyCtxt = key; }
154  if ( 1 == m_direct ) {
155  if ( m_setup.s->insert( obj, key ) ) {
156  if ( !pObject->parent() ) { pObject->setParent( pBase ); }
157  m_seq->push_back( obj );
158  return OBJ_INSERTED;
159  }
160  } else if ( key == long( m_setup.s->v.size() ) ) {
161  m_setup.s->v.push_back( obj );
162  if ( !pObject->parent() ) { pObject->setParent( pBase ); }
163  m_seq->push_back( obj );
164  return OBJ_INSERTED;
165  } else {
166  // Document is dirty now...
167  // need to copy all pointers from the vector to the map
168  onDirty();
169  return insert( pBase, pObject, obj, key );
170  }
172  return OBJ_CANNOT_INSERT;
173 }
174 
175 template <class T>
177  long key ) {
179  if ( key > m_keyCtxt ) { m_keyCtxt = key; }
180  if ( 1 == m_direct ) {
181  if ( m_setup.s->insert( obj, key ) ) {
182  if ( !pObject->parent() ) { pObject->setParent( pBase ); }
183  return OBJ_INSERTED;
184  }
185  } else if ( key == long( m_setup.s->v.size() ) ) {
186  m_setup.s->v.push_back( obj );
187  if ( !pObject->parent() ) { pObject->setParent( pBase ); }
188  return OBJ_INSERTED;
189  } else {
190  // Document is dirty now...
191  // need to copy all pointers from the vector to the map
192  onDirty();
193  return insertDirect( pBase, pObject, obj, key );
194  }
196  return OBJ_CANNOT_INSERT;
197 }
198 
199 // Remove object from container
200 template <class T>
201 void* Containers::KeyedObjectManager<T>::erase( long key, const void* obj ) {
202  typedef typename T::map_type MTYP;
203  typedef find<MTYP> FND;
204  if ( 1 == m_direct ) {
205  auto& m = m_setup.s->m;
206  auto i = ( obj ? std::find_if( m.begin(), m.end(), FND( obj ) ) : m_setup.s->m.find( key ) );
207  if ( i != m_setup.s->m.end() ) {
208  void* o = i->second;
209  auto j = std::find( m_seq->begin(), m_seq->end(), o );
210  if ( j != m_seq->end() ) {
211  m_seq->erase( j );
212  m_setup.s->m.erase( i );
213  return o;
214  }
215  }
217  }
218  onDirty();
219  return erase( key, obj );
220 }
221 
222 template <class T>
224  if ( 0 == m_direct ) onDirty();
225  auto i = m_setup.s->m.find( key );
226  if ( i != m_setup.s->m.end() ) return ( *i ).second;
227  return nullptr;
228 }
229 
230 template <class T>
232  switch ( m_direct ) {
233  case 1:
234  break;
235  case 0:
236  m_setup.s->v.reserve( len );
237  break;
238  default:
239  break;
240  }
241  m_seq->reserve( len );
242 }
243 
244 template <class T>
246  clearDirect();
247  m_seq->clear();
248 }
249 
250 template <class T>
252  switch ( m_direct ) {
253  case 1:
254  m_setup.s->m.clear();
255  break;
256  case 0:
257  m_setup.s->v.clear();
258  break;
259  default:
260  break;
261  }
262  m_direct = 0;
263  m_keyCtxt = -1;
264 }
265 
266 // Remove object by sequential iterators
267 template <class T>
268 long Containers::KeyedObjectManager<T>::erase( seq_type::iterator beg, seq_type::iterator end ) {
269  typedef typename T::map_type MTYP;
270  typedef find<MTYP> FND;
271  if ( 0 == m_direct ) {
272  onDirty();
273  return erase( beg, end );
274  }
275  if ( beg == m_seq->begin() && end == m_seq->end() ) {
276  clear();
277  } else {
278  for ( auto j = beg; j != end; ++j ) {
279  // auto& m = m_setup.s->m;
280  auto i = std::find_if( m_setup.s->m.begin(), m_setup.s->m.end(), FND( *j ) );
281  if ( i != m_setup.s->m.end() ) {
282  m_setup.s->m.erase( i );
283  continue;
284  }
286  }
287  m_seq->erase( beg, end );
288  }
289  return OBJ_ERASED;
290 }
291 
292 namespace Containers {
293 
294  /* First specialize static methods and then instantiate templated class to appear as symbols in the library
295  This order in needed for gcc 4.0 (MacOSX) */
296 
297  template <>
299  return CLID_ObjectVector + 0x00030000;
300  }
301  template <>
303  return CLID_ObjectVector + 0x00040000;
304  }
305 
308 } // namespace Containers
309 
310 /*
311  *
312  *
313  * Inline code for indirection array implementation
314  *
315  */
317 
318 namespace Containers {
319 
320  //__forceinline
321  template <>
322  void* KeyedObjectManager<__A>::object( long value ) const {
323 #ifdef CHECK_KEYED_CONTAINER
324  unsigned long siz = m_setup.s->m_idx.size();
325  if ( value >= 0 && size_t( value ) < siz ) {
326  long ent = *( m_setup.s->m_idx.begin() + value );
327  if ( ent >= 0 ) { return *( m_setup.s->v.begin() + ent ); }
328  }
329  return nullptr;
330 #else
331  return *( m_setup.s->v.begin() + ( *( m_setup.s->m_idx.begin() + value ) ) );
332 #endif
333  }
334 
335  template <>
337  m_direct = 1;
338  m_setup.s->m_idx.reserve( m_setup.s->v.size() + 1 );
339  for ( size_t i = 0, stop = m_setup.s->v.size(); i < stop; ++i ) {
340  if ( !m_setup.s->v[i] ) { containerIsInconsistent(); }
341  m_setup.s->m_idx.push_back( i );
342  }
343  }
344 
345  // Insert new object into container
346  template <>
348  // auto key creation only possible for direct access!
349  if ( 0 == m_direct ) {
350  m_seq->push_back( o );
351  m_setup.s->v.push_back( o );
352  if ( !c->parent() ) c->setParent( b );
353  *k = ++m_keyCtxt;
354  return OBJ_INSERTED;
355  }
357  return OBJ_CANNOT_INSERT;
358  }
359 
360  // Insert new object into container
361  template <>
363  if ( 0 == m_direct ) {
364  if ( k == m_keyCtxt + 1 ) { return insert( b, c, o, &k ); }
365  onDirty();
366  return insert( b, c, o, k );
367  }
369  if ( k > m_keyCtxt ) m_keyCtxt = k;
371  if ( k + 1 > long( m_setup.s->m_idx.size() ) ) { m_setup.s->m_idx.resize( k + 1, -1 ); }
372  auto idx = m_setup.s->m_idx.begin() + k;
373  if ( *idx == -1 ) {
374  *idx = m_setup.s->v.size();
375  m_setup.s->v.push_back( o );
376  m_seq->push_back( o );
377  if ( !c->parent() ) c->setParent( b );
378  return OBJ_INSERTED;
379  }
381  return OBJ_CANNOT_INSERT;
382  }
383 
384  // Insert new object into container
385  template <>
387  if ( 0 == m_direct ) {
388  if ( k == m_keyCtxt + 1 ) {
389  m_setup.s->v.push_back( o );
390  if ( !c->parent() ) c->setParent( b );
391  ++m_keyCtxt;
392  return OBJ_INSERTED;
393  }
394  onDirty();
395  return insertDirect( b, c, o, k );
396  }
398  if ( k > m_keyCtxt ) m_keyCtxt = k;
400  if ( k + 1 > long( m_setup.s->m_idx.size() ) ) { m_setup.s->m_idx.resize( k + 1, -1 ); }
401  auto idx = m_setup.s->m_idx.begin() + k;
402  if ( *idx == -1 ) {
403  *idx = m_setup.s->v.size();
404  m_setup.s->v.push_back( o );
405  if ( !c->parent() ) c->setParent( b );
406  return OBJ_INSERTED;
407  }
409  return OBJ_CANNOT_INSERT;
410  }
411 
412  // Clear content of the vector
413  template <>
415  m_setup.s->v.clear();
416  m_setup.s->m_idx.clear();
417  m_direct = 0;
418  m_keyCtxt = -1;
419  }
420 
421  // Remove object from container (very inefficient if key is invalid)
422  template <>
423  void* KeyedObjectManager<__A>::erase( long key, const void* obj ) {
424  if ( 0 == m_direct ) {
425  onDirty();
426  return erase( key, obj );
427  }
428  if ( obj ) {
429  auto& idx = m_setup.s->m_idx;
430  for ( auto& elem : idx ) {
431  auto j = m_setup.s->v.begin() + ( elem );
432  auto k = std::find( m_seq->begin(), m_seq->end(), *j );
433  if ( *j == obj ) {
434  void* o = *j;
435  m_seq->erase( k );
436  m_setup.s->v.erase( j );
437  std::for_each( m_setup.s->m_idx.begin(), m_setup.s->m_idx.end(), array::decrement( elem ) );
438  elem = -1;
439  return o;
440  }
441  }
442  } else if ( key >= 0 && key < long( m_setup.s->m_idx.size() ) ) {
443  auto idx = m_setup.s->m_idx.begin() + key;
444  if ( *idx != -1 ) {
445  auto i = m_setup.s->v.begin() + ( *idx );
446  if ( i == m_setup.s->v.end() ) { containerIsInconsistent(); }
447  void* o = *i;
448  auto j = std::find( m_seq->begin(), m_seq->end(), o );
449  if ( j == m_seq->end() ) { containerIsInconsistent(); }
450  m_seq->erase( j );
451  m_setup.s->v.erase( i );
452  std::for_each( m_setup.s->m_idx.begin(), m_setup.s->m_idx.end(), array::decrement( *idx ) );
453  *idx = -1;
454  return o;
455  }
456  }
458  return nullptr;
459  }
460 
461  // Remove object by sequential iterators
462  template <>
463  long KeyedObjectManager<__A>::erase( seq_type::iterator beg, seq_type::iterator end ) {
464  if ( beg == m_seq->begin() && end == m_seq->end() ) {
465  clear();
466  return OBJ_ERASED;
467  } else if ( 0 == m_direct ) {
468  onDirty();
469  return erase( beg, end );
470  } else {
471  long cnt = 0, nobj = end - beg;
472  auto& idx = m_setup.s->m_idx;
473  for ( auto& elem : idx ) {
474  auto j = m_setup.s->v.begin() + ( elem );
475  auto k = std::find( beg, end, *j );
476  if ( k != end ) {
477  m_setup.s->v.erase( j );
478  std::for_each( m_setup.s->m_idx.begin(), m_setup.s->m_idx.end(), array::decrement( elem ) );
479  elem = -1;
480  cnt++;
481  if ( cnt == nobj ) break;
482  }
483  }
484  m_seq->erase( beg, end );
485  if ( cnt != nobj ) { containerIsInconsistent(); }
486  return OBJ_ERASED;
487  }
488  // cannot reach this point
489  }
490 
491  template <>
493  return CLID_ObjectVector + 0x00050000;
494  }
495 } // namespace Containers
497 /*
498  *
499  *
500  * Implementation for objects with vector like access
501  *
502  *
503  **/
505 
506 namespace Containers {
507  // Access single entry by long(integer) key
508  template <>
509  void* KeyedObjectManager<__V>::object( long /* value */ ) const {
511  return nullptr;
512  }
513 
514  template <>
517  }
518 
519  // Insert new object into container
520  template <>
522  m_seq->push_back( o );
523  m_setup.s->v.push_back( o );
524  if ( !c->parent() ) c->setParent( b );
525  *k = ( m_setup.s->v.size() - 1 );
526  return OBJ_INSERTED;
527  }
528 
529  // Insert new object into container
530  template <>
532  if ( k == long( m_setup.s->v.size() ) ) { return insert( b, c, o, &k ); }
534  return OBJ_CANNOT_INSERT;
535  }
536 
537  // Insert new object into container
538  template <>
540  if ( k == long( m_setup.s->v.size() ) ) {
541  m_setup.s->v.push_back( o );
542  if ( !c->parent() ) c->setParent( b );
543  return OBJ_INSERTED;
544  }
546  return OBJ_CANNOT_INSERT;
547  }
548 
549  // Clear content of the vector
550  template <>
552  m_setup.s->v.clear();
553  m_direct = 0;
554  m_keyCtxt = -1;
555  }
556 
557  // Remove object from container (very inefficient if key is invalid)
558  template <>
559  void* KeyedObjectManager<__V>::erase( long /* key */, const void* /* obj */ ) {
561  return nullptr;
562  }
563 
564  // Remove object by sequential iterators
565  template <>
566  long KeyedObjectManager<__V>::erase( seq_type::iterator beg, seq_type::iterator end ) {
567  if ( beg == m_seq->begin() && end == m_seq->end() ) {
568  clear();
569  return OBJ_ERASED;
570  }
572  return OBJ_ERASED;
573  }
574 
575  template <>
577  return CLID_ObjectVector + 0x00060000;
578  }
579 } // namespace Containers
Containers::array::decrement::m_min
long m_min
Definition: KeyedObjectManager.cpp:50
Containers::OBJ_ERASED
@ OBJ_ERASED
Object was removed, but not deleted
Definition: KeyedTraits.h:35
Containers::cannotInsertToContainer
GAUDI_API void cannotInsertToContainer()
Function to be called to indicate that an object cannot be inserted to the container.
Definition: KeyedObjectManager.cpp:83
Containers::KeyedObjectManager
KeyedObjectManager Class to manage keyed objects.
Definition: KeyedObjectManager.h:55
Containers::hashmap::v
std::vector< void * > v
Definition: KeyedObjectManager.cpp:24
std::for_each
T for_each(T... args)
Containers::hashmap::m
map_type m
Definition: KeyedObjectManager.cpp:23
Containers::OBJ_INSERTED
@ OBJ_INSERTED
Object was inserted into the container.
Definition: KeyedTraits.h:36
Containers::find::operator()
bool operator()(const void *cmp) const
Definition: KeyedObjectManager.cpp:75
KeyedObjectManager.h
Containers::KeyedObjectManager::insertDirect
long insertDirect(ObjectContainerBase *b, ContainedObject *c, void *o, long k)
Insert element into direct access map.
Definition: KeyedObjectManager.cpp:176
Containers::find::operator()
bool operator()(const v_type &cmp) const
Definition: KeyedObjectManager.cpp:76
std::move
T move(T... args)
std::pair
GaudiException.h
Containers::KeyedObjectManager::KeyedObjectManager
KeyedObjectManager()
Standard Constructor.
Definition: KeyedObjectManager.cpp:98
Containers::KeyedObjectManager::onDirty
void onDirty() const
Callback when the container becomes dirty.
Definition: KeyedObjectManager.cpp:134
gaudirun.s
string s
Definition: gaudirun.py:346
Containers::array::m_idx
std::vector< long > m_idx
Indirection array.
Definition: KeyedObjectManager.cpp:46
std::vector< void * >
std::find_if
T find_if(T... args)
Containers::find::find
find(const void *o)
Definition: KeyedObjectManager.cpp:74
GaudiException
Definition: GaudiException.h:31
Containers::KeyedObjectManager::insert
long insert(ObjectContainerBase *b, ContainedObject *c, void *o, long *k)
Insert new object into container.
Definition: KeyedObjectManager.cpp:143
Containers::KeyedObjectManager::clearDirect
void clearDirect()
Clear all direct access fields.
Definition: KeyedObjectManager.cpp:251
Containers
Containers namespace.
Definition: KeyedObjectManager.h:28
gaudirun.c
c
Definition: gaudirun.py:525
Containers::map::map
map()=default
Containers::array::array
array(array &&)=default
Containers::find
Definition: KeyedObjectManager.cpp:69
Containers::KeyedObjectManager::~KeyedObjectManager
virtual ~KeyedObjectManager()
Standard Destructor.
Definition: KeyedObjectManager.cpp:121
Containers::invalidContainerOperation
GAUDI_API void invalidContainerOperation()
Function to be called to indicate that an operation should be performed on the container or it's cont...
Definition: KeyedObjectManager.cpp:92
Containers::KeyedObjectManager::m_keyCtxt
long m_keyCtxt
Definition: KeyedObjectManager.h:62
HashMap.h
Containers::OBJ_CANNOT_INSERT
@ OBJ_CANNOT_INSERT
Cannot insert object into container.
Definition: KeyedTraits.h:37
Containers::map::map
map(map &&)=default
Containers::find::m_obj
const void * m_obj
Definition: KeyedObjectManager.cpp:70
Containers::map::insert
bool insert(void *obj, long key)
Definition: KeyedObjectManager.cpp:36
__A
Containers::array __A
Definition: KeyedObjectManager.cpp:316
Containers::KeyedObjectManager::object
void * object(long key) const
Retrieve object identified by a key from the container.
Definition: KeyedObjectManager.cpp:223
Containers::hashmap::hashmap
hashmap()=default
Containers::array
Definition: KeyedObjectManager.cpp:43
Containers::hashmap::insert
bool insert(void *obj, long key)
Definition: KeyedObjectManager.cpp:25
Containers::KeyedObjectManager::m_setup
union Containers::KeyedObjectManager::@4 m_setup
Containers::array::decrement::decrement
decrement(long m)
Definition: KeyedObjectManager.cpp:51
Containers::vector::map_type
std::vector< void * > map_type
Definition: KeyedObjectManager.cpp:61
Gaudi::Units::m
constexpr double m
Definition: SystemOfUnits.h:108
ProduceConsume.j
j
Definition: ProduceConsume.py:104
Containers::hashmap::map_type
GaudiUtils::HashMap< long, void * > map_type
Definition: KeyedObjectManager.cpp:22
Containers::find::v_type
CONT::value_type v_type
Definition: KeyedObjectManager.cpp:71
__V
Containers::vector __V
Definition: KeyedObjectManager.cpp:504
GaudiPython.Bindings.nullptr
nullptr
Definition: Bindings.py:87
CLID
unsigned int CLID
Class ID definition.
Definition: ClassID.h:18
std::map< long, void * >
Containers::KeyedObjectManager::erase
void * erase(long key, const void *obj)
Remove object from container (very inefficient if key is invalid)
Definition: KeyedObjectManager.cpp:201
ContainedObject::parent
const ObjectContainerBase * parent() const
Access to parent object.
Definition: ContainedObject.h:63
Containers::map::v
std::vector< void * > v
Definition: KeyedObjectManager.cpp:35
Containers::KeyedObjectManager::reserve
void reserve(long size)
Reserve buffer space.
Definition: KeyedObjectManager.cpp:231
Containers::array::v
std::vector< void * > v
Direct access array.
Definition: KeyedObjectManager.cpp:48
Containers::array::map_type
std::vector< long > map_type
Definition: KeyedObjectManager.cpp:44
Containers::map::map_type
std::map< long, void * > map_type
Definition: KeyedObjectManager.cpp:33
ContainedObject::setParent
void setParent(ObjectContainerBase *value)
Update parent member.
Definition: ContainedObject.h:65
Containers::hashmap::hashmap
hashmap(hashmap &&)=default
ObjectContainerBase
Definition: ObjectContainerBase.h:29
Containers::hashmap
Definition: KeyedObjectManager.cpp:21
Containers::map::m
map_type m
Definition: KeyedObjectManager.cpp:34
std::map::insert
T insert(T... args)
Kernel.h
Containers::array::array
array()=default
Containers::KeyedObjectManager::setup
void setup(void *seq, void **rndm)
Setup of the Map and the parent object.
Definition: KeyedObjectManager.cpp:128
Containers::map
Definition: KeyedObjectManager.cpp:32
GaudiUtils::Map::insert
std::pair< iterator, bool > insert(ValueType &&val)
Definition: Map.h:178
Containers::vector
Definition: KeyedObjectManager.cpp:60
Containers::cannotAssignObjectKey
GAUDI_API void cannotAssignObjectKey()
Function to be called when an object key cannot be assigned.
Definition: KeyedObjectManager.cpp:79
Containers::vector::vector
vector()=default
Containers::vector::v
std::vector< void * > v
Direct access array.
Definition: KeyedObjectManager.cpp:63
Containers::vector::vector
vector(vector &&)=default
Containers::array::decrement::operator()
bool operator()(long &j) const
Definition: KeyedObjectManager.cpp:52
GaudiUtils::HashMap< long, void * >
IOTest.end
end
Definition: IOTest.py:125
Containers::array::decrement
Definition: KeyedObjectManager.cpp:49
ManySmallAlgs.seq
seq
Definition: ManySmallAlgs.py:102
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:101
Gaudi::Functional::details::insert
constexpr struct Gaudi::Functional::details::insert_t insert
ProduceConsume.key
key
Definition: ProduceConsume.py:84
ContainedObject.h
Containers::KeyedObjectManager::classID
static CLID classID()
Access CLID for this type of container.
Containers::containerIsInconsistent
GAUDI_API void containerIsInconsistent()
Function to be called to indicate that the container is found to be inconsistent.
Definition: KeyedObjectManager.cpp:87
ContainedObject
Definition: ContainedObject.h:41
Containers::KeyedObjectManager::clear
void clear()
Clear content of the vector.
Definition: KeyedObjectManager.cpp:245