The Gaudi Framework  v36r9p1 (5c15b2bb)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
KeyedObjectManager.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2021 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
15 #include "GaudiKernel/HashMap.h"
16 #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 template <class T>
118  m_setup.s->~T();
119 }
120 
122 template <class T>
123 void Containers::KeyedObjectManager<T>::setup( void* seq, void** rndm ) {
124  m_seq = (seq_type*)seq;
125  *rndm = &m_setup.s->v;
126 }
127 
128 template <class T>
130  m_direct = 1;
131  auto& s = *m_setup.s;
132  long i = 0;
133  for ( auto p : s.v ) s.insert( p, i++ );
134  s.v.clear();
135 }
136 
137 template <class T>
139  long* key ) {
140  *key = ++m_keyCtxt;
141  return insert( pBase, pObject, obj, *key );
142 }
143 
144 template <class T>
146  long key ) {
148  if ( key > m_keyCtxt ) { m_keyCtxt = key; }
149  if ( 1 == m_direct ) {
150  if ( m_setup.s->insert( obj, key ) ) {
151  if ( !pObject->parent() ) { pObject->setParent( pBase ); }
152  m_seq->push_back( obj );
153  return OBJ_INSERTED;
154  }
155  } else if ( key == long( m_setup.s->v.size() ) ) {
156  m_setup.s->v.push_back( obj );
157  if ( !pObject->parent() ) { pObject->setParent( pBase ); }
158  m_seq->push_back( obj );
159  return OBJ_INSERTED;
160  } else {
161  // Document is dirty now...
162  // need to copy all pointers from the vector to the map
163  onDirty();
164  return insert( pBase, pObject, obj, key );
165  }
167  return OBJ_CANNOT_INSERT;
168 }
169 
170 template <class T>
172  long key ) {
174  if ( key > m_keyCtxt ) { m_keyCtxt = key; }
175  if ( 1 == m_direct ) {
176  if ( m_setup.s->insert( obj, key ) ) {
177  if ( !pObject->parent() ) { pObject->setParent( pBase ); }
178  return OBJ_INSERTED;
179  }
180  } else if ( key == long( m_setup.s->v.size() ) ) {
181  m_setup.s->v.push_back( obj );
182  if ( !pObject->parent() ) { pObject->setParent( pBase ); }
183  return OBJ_INSERTED;
184  } else {
185  // Document is dirty now...
186  // need to copy all pointers from the vector to the map
187  onDirty();
188  return insertDirect( pBase, pObject, obj, key );
189  }
191  return OBJ_CANNOT_INSERT;
192 }
193 
194 // Remove object from container
195 template <class T>
196 void* Containers::KeyedObjectManager<T>::erase( long key, const void* obj ) {
197  typedef typename T::map_type MTYP;
198  typedef find<MTYP> FND;
199  if ( 1 == m_direct ) {
200  auto& m = m_setup.s->m;
201  auto i = ( obj ? std::find_if( m.begin(), m.end(), FND( obj ) ) : m_setup.s->m.find( key ) );
202  if ( i != m_setup.s->m.end() ) {
203  void* o = i->second;
204  auto j = std::find( m_seq->begin(), m_seq->end(), o );
205  if ( j != m_seq->end() ) {
206  m_seq->erase( j );
207  m_setup.s->m.erase( i );
208  return o;
209  }
210  }
212  }
213  onDirty();
214  return erase( key, obj );
215 }
216 
217 template <class T>
219  if ( 0 == m_direct ) onDirty();
220  auto i = m_setup.s->m.find( key );
221  if ( i != m_setup.s->m.end() ) return ( *i ).second;
222  return nullptr;
223 }
224 
225 template <class T>
227  switch ( m_direct ) {
228  case 1:
229  break;
230  case 0:
231  m_setup.s->v.reserve( len );
232  break;
233  default:
234  break;
235  }
236  m_seq->reserve( len );
237 }
238 
239 template <class T>
241  clearDirect();
242  m_seq->clear();
243 }
244 
245 template <class T>
247  switch ( m_direct ) {
248  case 1:
249  m_setup.s->m.clear();
250  break;
251  case 0:
252  m_setup.s->v.clear();
253  break;
254  default:
255  break;
256  }
257  m_direct = 0;
258  m_keyCtxt = -1;
259 }
260 
261 // Remove object by sequential iterators
262 template <class T>
263 long Containers::KeyedObjectManager<T>::erase( seq_type::iterator beg, seq_type::iterator end ) {
264  typedef typename T::map_type MTYP;
265  typedef find<MTYP> FND;
266  if ( 0 == m_direct ) {
267  onDirty();
268  return erase( beg, end );
269  }
270  if ( beg == m_seq->begin() && end == m_seq->end() ) {
271  clear();
272  } else {
273  for ( auto j = beg; j != end; ++j ) {
274  // auto& m = m_setup.s->m;
275  auto i = std::find_if( m_setup.s->m.begin(), m_setup.s->m.end(), FND( *j ) );
276  if ( i != m_setup.s->m.end() ) {
277  m_setup.s->m.erase( i );
278  continue;
279  }
281  }
282  m_seq->erase( beg, end );
283  }
284  return OBJ_ERASED;
285 }
286 
287 namespace Containers {
288 
289  /* First specialize static methods and then instantiate templated class to appear as symbols in the library
290  This order in needed for gcc 4.0 (MacOSX) */
291 
292  template <>
294  return CLID_ObjectVector + 0x00030000;
295  }
296  template <>
298  return CLID_ObjectVector + 0x00040000;
299  }
300 
303 } // namespace Containers
304 
305 /*
306  *
307  *
308  * Inline code for indirection array implementation
309  *
310  */
312 
313 namespace Containers {
314 
315  //__forceinline
316  template <>
317  void* KeyedObjectManager<__A>::object( long value ) const {
318 #ifdef CHECK_KEYED_CONTAINER
319  unsigned long siz = m_setup.s->m_idx.size();
320  if ( value >= 0 && size_t( value ) < siz ) {
321  long ent = *( m_setup.s->m_idx.begin() + value );
322  if ( ent >= 0 ) { return *( m_setup.s->v.begin() + ent ); }
323  }
324  return nullptr;
325 #else
326  return *( m_setup.s->v.begin() + ( *( m_setup.s->m_idx.begin() + value ) ) );
327 #endif
328  }
329 
330  template <>
332  m_direct = 1;
333  m_setup.s->m_idx.reserve( m_setup.s->v.size() + 1 );
334  for ( size_t i = 0, stop = m_setup.s->v.size(); i < stop; ++i ) {
335  if ( !m_setup.s->v[i] ) { containerIsInconsistent(); }
336  m_setup.s->m_idx.push_back( i );
337  }
338  }
339 
340  // Insert new object into container
341  template <>
343  // auto key creation only possible for direct access!
344  if ( 0 == m_direct ) {
345  m_seq->push_back( o );
346  m_setup.s->v.push_back( o );
347  if ( !c->parent() ) c->setParent( b );
348  *k = ++m_keyCtxt;
349  return OBJ_INSERTED;
350  }
352  return OBJ_CANNOT_INSERT;
353  }
354 
355  // Insert new object into container
356  template <>
358  if ( 0 == m_direct ) {
359  if ( k == m_keyCtxt + 1 ) { return insert( b, c, o, &k ); }
360  onDirty();
361  return insert( b, c, o, k );
362  }
364  if ( k > m_keyCtxt ) m_keyCtxt = k;
366  if ( k + 1 > long( m_setup.s->m_idx.size() ) ) { m_setup.s->m_idx.resize( k + 1, -1 ); }
367  auto idx = m_setup.s->m_idx.begin() + k;
368  if ( *idx == -1 ) {
369  *idx = m_setup.s->v.size();
370  m_setup.s->v.push_back( o );
371  m_seq->push_back( o );
372  if ( !c->parent() ) c->setParent( b );
373  return OBJ_INSERTED;
374  }
376  return OBJ_CANNOT_INSERT;
377  }
378 
379  // Insert new object into container
380  template <>
382  if ( 0 == m_direct ) {
383  if ( k == m_keyCtxt + 1 ) {
384  m_setup.s->v.push_back( o );
385  if ( !c->parent() ) c->setParent( b );
386  ++m_keyCtxt;
387  return OBJ_INSERTED;
388  }
389  onDirty();
390  return insertDirect( b, c, o, k );
391  }
393  if ( k > m_keyCtxt ) m_keyCtxt = k;
395  if ( k + 1 > long( m_setup.s->m_idx.size() ) ) { m_setup.s->m_idx.resize( k + 1, -1 ); }
396  auto idx = m_setup.s->m_idx.begin() + k;
397  if ( *idx == -1 ) {
398  *idx = m_setup.s->v.size();
399  m_setup.s->v.push_back( o );
400  if ( !c->parent() ) c->setParent( b );
401  return OBJ_INSERTED;
402  }
404  return OBJ_CANNOT_INSERT;
405  }
406 
407  // Clear content of the vector
408  template <>
410  m_setup.s->v.clear();
411  m_setup.s->m_idx.clear();
412  m_direct = 0;
413  m_keyCtxt = -1;
414  }
415 
416  // Remove object from container (very inefficient if key is invalid)
417  template <>
418  void* KeyedObjectManager<__A>::erase( long key, const void* obj ) {
419  if ( 0 == m_direct ) {
420  onDirty();
421  return erase( key, obj );
422  }
423  if ( obj ) {
424  auto& idx = m_setup.s->m_idx;
425  for ( auto& elem : idx ) {
426  auto j = m_setup.s->v.begin() + ( elem );
427  auto k = std::find( m_seq->begin(), m_seq->end(), *j );
428  if ( *j == obj ) {
429  void* o = *j;
430  m_seq->erase( k );
431  m_setup.s->v.erase( j );
432  std::for_each( m_setup.s->m_idx.begin(), m_setup.s->m_idx.end(), array::decrement( elem ) );
433  elem = -1;
434  return o;
435  }
436  }
437  } else if ( key >= 0 && key < long( m_setup.s->m_idx.size() ) ) {
438  auto idx = m_setup.s->m_idx.begin() + key;
439  if ( *idx != -1 ) {
440  auto i = m_setup.s->v.begin() + ( *idx );
441  if ( i == m_setup.s->v.end() ) { containerIsInconsistent(); }
442  void* o = *i;
443  auto j = std::find( m_seq->begin(), m_seq->end(), o );
444  if ( j == m_seq->end() ) { containerIsInconsistent(); }
445  m_seq->erase( j );
446  m_setup.s->v.erase( i );
447  std::for_each( m_setup.s->m_idx.begin(), m_setup.s->m_idx.end(), array::decrement( *idx ) );
448  *idx = -1;
449  return o;
450  }
451  }
453  return nullptr;
454  }
455 
456  // Remove object by sequential iterators
457  template <>
458  long KeyedObjectManager<__A>::erase( seq_type::iterator beg, seq_type::iterator end ) {
459  if ( beg == m_seq->begin() && end == m_seq->end() ) {
460  clear();
461  return OBJ_ERASED;
462  } else if ( 0 == m_direct ) {
463  onDirty();
464  return erase( beg, end );
465  } else {
466  long cnt = 0, nobj = end - beg;
467  auto& idx = m_setup.s->m_idx;
468  for ( auto& elem : idx ) {
469  auto j = m_setup.s->v.begin() + ( elem );
470  auto k = std::find( beg, end, *j );
471  if ( k != end ) {
472  m_setup.s->v.erase( j );
473  std::for_each( m_setup.s->m_idx.begin(), m_setup.s->m_idx.end(), array::decrement( elem ) );
474  elem = -1;
475  cnt++;
476  if ( cnt == nobj ) break;
477  }
478  }
479  m_seq->erase( beg, end );
480  if ( cnt != nobj ) { containerIsInconsistent(); }
481  return OBJ_ERASED;
482  }
483  // cannot reach this point
484  }
485 
486  template <>
488  return CLID_ObjectVector + 0x00050000;
489  }
490 } // namespace Containers
492 /*
493  *
494  *
495  * Implementation for objects with vector like access
496  *
497  *
498  **/
500 
501 namespace Containers {
502  // Access single entry by long(integer) key
503  template <>
504  void* KeyedObjectManager<__V>::object( long /* value */ ) const {
506  return nullptr;
507  }
508 
509  template <>
512  }
513 
514  // Insert new object into container
515  template <>
517  m_seq->push_back( o );
518  m_setup.s->v.push_back( o );
519  if ( !c->parent() ) c->setParent( b );
520  *k = ( m_setup.s->v.size() - 1 );
521  return OBJ_INSERTED;
522  }
523 
524  // Insert new object into container
525  template <>
527  if ( k == long( m_setup.s->v.size() ) ) { return insert( b, c, o, &k ); }
529  return OBJ_CANNOT_INSERT;
530  }
531 
532  // Insert new object into container
533  template <>
535  if ( k == long( m_setup.s->v.size() ) ) {
536  m_setup.s->v.push_back( o );
537  if ( !c->parent() ) c->setParent( b );
538  return OBJ_INSERTED;
539  }
541  return OBJ_CANNOT_INSERT;
542  }
543 
544  // Clear content of the vector
545  template <>
547  m_setup.s->v.clear();
548  m_direct = 0;
549  m_keyCtxt = -1;
550  }
551 
552  // Remove object from container (very inefficient if key is invalid)
553  template <>
554  void* KeyedObjectManager<__V>::erase( long /* key */, const void* /* obj */ ) {
556  return nullptr;
557  }
558 
559  // Remove object by sequential iterators
560  template <>
561  long KeyedObjectManager<__V>::erase( seq_type::iterator beg, seq_type::iterator end ) {
562  if ( beg == m_seq->begin() && end == m_seq->end() ) {
563  clear();
564  return OBJ_ERASED;
565  }
567  return OBJ_ERASED;
568  }
569 
570  template <>
572  return CLID_ObjectVector + 0x00060000;
573  }
574 } // namespace Containers
Containers::array::decrement::m_min
long m_min
Definition: KeyedObjectManager.cpp:50
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::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:171
Containers::find::operator()
bool operator()(const v_type &cmp) const
Definition: KeyedObjectManager.cpp:76
std::move
T move(T... args)
Containers::KeyedObjectManager::s
SETUP * s
Definition: KeyedObjectManager.h:66
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:129
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:138
Containers::KeyedObjectManager::clearDirect
void clearDirect()
Clear all direct access fields.
Definition: KeyedObjectManager.cpp:246
Containers::OBJ_INSERTED
@ OBJ_INSERTED
Object was inserted into the container.
Definition: KeyedTraits.h:36
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::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::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:311
Containers::KeyedObjectManager::object
void * object(long key) const
Retrieve object identified by a key from the container.
Definition: KeyedObjectManager.cpp:218
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::array::decrement::decrement
decrement(long m)
Definition: KeyedObjectManager.cpp:51
Containers::vector::map_type
std::vector< void * > map_type
Definition: KeyedObjectManager.cpp:61
Containers::OBJ_ERASED
@ OBJ_ERASED
Object was removed, but not deleted
Definition: KeyedTraits.h:35
Gaudi::Units::m
constexpr double m
Definition: SystemOfUnits.h:108
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:499
GaudiPython.Bindings.nullptr
nullptr
Definition: Bindings.py:93
Containers::KeyedObjectManager::m_setup
union Containers::KeyedObjectManager::@2 m_setup
HistogramsTiming.seq
seq
Definition: HistogramsTiming.py:24
CLID
unsigned int CLID
Class ID definition.
Definition: ClassID.h:18
std::map< long, void * >
Containers::OBJ_CANNOT_INSERT
@ OBJ_CANNOT_INSERT
Cannot insert object into container.
Definition: KeyedTraits.h:37
IOTest.end
def end
Definition: IOTest.py:128
Containers::KeyedObjectManager::erase
void * erase(long key, const void *obj)
Remove object from container (very inefficient if key is invalid)
Definition: KeyedObjectManager.cpp:196
ContainedObject::parent
const ObjectContainerBase * parent() const
Access to parent object.
Definition: ContainedObject.h:62
Containers::map::v
std::vector< void * > v
Definition: KeyedObjectManager.cpp:35
Containers::KeyedObjectManager::reserve
void reserve(long size)
Reserve buffer space.
Definition: KeyedObjectManager.cpp:226
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:64
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:123
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 * >
Containers::array::decrement
Definition: KeyedObjectManager.cpp:49
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:81
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:240