ATLAS Offline Software
Public Member Functions | Static Public Attributes | Protected Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
AthenaPoolAuxStore Class Reference
Inheritance diagram for AthenaPoolAuxStore:
Collaboration diagram for AthenaPoolAuxStore:

Public Member Functions

 AthenaPoolAuxStore (bool standalone)
 
bool standalone () const
 Return the standalone flag. More...
 
virtual const void * getData (SG::auxid_t auxid) const override
 Return the data vector for one aux data item. More...
 
virtual void * getData (SG::auxid_t auxid, size_t size, size_t capacity) override
 Return the data vector for one aux data item. More...
 
virtual const void * getData (SG::auxid_t auxid) const=0
 Pick up the const version from the base class. More...
 
virtual const IAuxTypeVector * getVector (SG::auxid_t auxid) const override
 Return vector interface for one aux data item. More...
 
virtual void * getDecoration (auxid_t auxid, size_t size, size_t capacity) override
 Return the data vector for one aux data decoration item. More...
 
virtual bool resize (size_t sz) override
 Change the size of all aux data vectors. More...
 
virtual void reserve (size_t sz) override
 Change the capacity of all aux data vectors. More...
 
virtual void shift (size_t pos, ptrdiff_t offs) override
 Shift the elements of the container. More...
 
virtual bool insertMove (size_t pos, IAuxStore &other, const SG::auxid_set_t &ignore=SG::auxid_set_t(0)) override
 Move all elements from other to this store. More...
 
virtual const SG::auxid_set_tgetAuxIDs () const override
 Return a set of identifiers for existing data items in this store. More...
 
virtual const SG::auxid_set_tgetDecorIDs () const override
 Return a set of identifiers for decorations in this store. More...
 
virtual bool isDecoration (auxid_t auxid) const override
 Test if a particular variable is tagged as a decoration. More...
 
virtual const SG::auxid_set_tgetWritableAuxIDs () const override
 Return a set of identifiers for writable data items in this store. More...
 
virtual const void * getIOData (SG::auxid_t auxid) const override
 Return a pointer to the data to be stored for one aux data item. More...
 
virtual const std::type_info * getIOType (SG::auxid_t auxid) const override
 Return the type of the data to be stored for one aux data item. More...
 
virtual const SG::auxid_set_tgetDynamicAuxIDs () const override
 Get the list of all variables that need to be handled. More...
 
virtual void lock () override
 Lock the container. More...
 
virtual bool clearDecorations () override
 Clear all decorations. More...
 
virtual size_t size () const override
 Return the number of elements in the store. More...
 
virtual bool setOption (auxid_t id, const AuxDataOption &option) override
 Set an option for an auxiliary data variable. More...
 
virtual void lockDecoration (SG::auxid_t auxid) override
 Lock a decoration. More...
 
virtual IAuxTypeVector * linkedVector (SG::auxid_t auxid) override
 Return interface for a linked variable. More...
 
virtual const IAuxTypeVector * linkedVector (SG::auxid_t auxid) const override
 Return interface for a linked variable. More...
 
virtual const IAuxTypeVector * linkedVector (SG::auxid_t) const
 Return interface for a linked variable. More...
 
virtual SG::auxid_set_t getSelectedAuxIDs () const
 Get a list of dynamic variables that need to be written out. More...
 

Static Public Attributes

static constexpr bool supportsThinning = true
 Mark that this type supports thinning operations. More...
 

Protected Member Functions

const void * getIODataInternal (auxid_t auxid, bool quiet) const
 Return a pointer to the data to be stored for one aux data item. More...
 
void * getIODataInternal (auxid_t auxid, bool quiet)
 Return a pointer to the data to be stored for one aux data item. More...
 
void addAuxID (auxid_t auxid)
 Add a new auxid to the set of those being managed by this store. More...
 
virtual void * getDataInternal (SG::auxid_t auxid, size_t size, size_t capacity, bool no_lock_check)
 Return the data vector for one aux data item. More...
 
void addVector (std::unique_ptr< IAuxTypeVector > vec, bool isDecoration)
 Explicitly add a vector to the store. More...
 

Private Types

typedef AthContainers_detail::mutex mutex_t
 Mutex used to synchronize modifications to the cache vector. More...
 
typedef AthContainers_detail::lock_guard< mutex_tguard_t
 

Private Member Functions

virtual IAuxTypeVector * getVectorInternal_noLock (SG::auxid_t auxid, size_t size, size_t capacity, bool no_lock_check)
 Implementation of getVectorInternal; no locking. More...
 
size_t size_noLock () const
 Return the number of elements in the store; no locking. More...
 

Private Attributes

bool m_standalone
 Are we being written in standalone mode? More...
 
std::vector< std::unique_ptr< IAuxTypeVector > > m_vecs
 The collection of vectors of aux data that we're managing, indexed by auxid. More...
 
SG::auxid_set_t m_decorations
 Record which variables are decorations. More...
 
SG::auxid_set_t m_auxids
 Set of auxid's for which we've created a vector. More...
 
bool m_locked
 Has this container been locked? More...
 
mutex_t m_mutex
 

Detailed Description

Definition at line 33 of file AuxDiscoverySvc.cxx.

Member Typedef Documentation

◆ guard_t

typedef AthContainers_detail::lock_guard<mutex_t> SG::AuxStoreInternal::guard_t
privateinherited

Definition at line 461 of file AuxStoreInternal.h.

◆ mutex_t

typedef AthContainers_detail::mutex SG::AuxStoreInternal::mutex_t
privateinherited

Mutex used to synchronize modifications to the cache vector.

Definition at line 460 of file AuxStoreInternal.h.

Constructor & Destructor Documentation

◆ AthenaPoolAuxStore()

AthenaPoolAuxStore::AthenaPoolAuxStore ( bool  standalone)
inline

Definition at line 35 of file AuxDiscoverySvc.cxx.

Member Function Documentation

◆ addAuxID()

void SG::AuxStoreInternal::addAuxID ( auxid_t  auxid)
protectedinherited

Add a new auxid to the set of those being managed by this store.

Parameters
auxidThe auxid to add.

Definition at line 676 of file AuxStoreInternal.cxx.

677 {
678  m_auxids.insert (auxid);
679 }

◆ addVector()

void SG::AuxStoreInternal::addVector ( std::unique_ptr< IAuxTypeVector vec,
bool  isDecoration 
)
protectedinherited

Explicitly add a vector to the store.

Parameters
vecVector data being added.
isDecorationShould this variable be marked as a decoration?

For internal use. The auxid must not already exist in the store.

Definition at line 144 of file AuxStoreInternal.cxx.

146 {
147  guard_t guard (m_mutex);
148  auxid_t auxid = vec->auxid();
149  if (m_locked)
150  throw ExcStoreLocked (auxid);
151 
152  // Resize the vector if needed.
153  if (m_vecs.size() <= auxid) {
154  m_vecs.resize (auxid+1);
155  }
156 
157  // Give up if the variable is already present in the store.
158  if (m_vecs[auxid]) std::abort();
159 
160  // Make sure the length is consistent with the rest of the store.
161  if (!vec->isLinked()) {
162  size_t sz = this->size_noLock();
163  if (vec->size() < sz)
164  vec->resize (sz);
165  }
166 
167  // Add it to the store.
168  m_vecs[auxid] = std::move (vec);
169  addAuxID (auxid);
170  if (isDecoration) {
171  m_decorations.insert (auxid);
172  }
173 }

◆ clearDecorations()

bool SG::AuxStoreInternal::clearDecorations ( )
overridevirtualinherited

Clear all decorations.

Erase all decorations from the store, restoring the state to when lock was called. Be sure to clear the cache of the referencing container!

Returns true if there were any decorations that were cleared, false if the store did not contain any decorations.

Implements SG::IConstAuxStore.

Definition at line 581 of file AuxStoreInternal.cxx.

582 {
583  guard_t guard (m_mutex);
584  bool anycleared = false;
585  for (auxid_t id : m_decorations) {
586  m_vecs[id].reset();
587  m_auxids.erase (id);
588  anycleared = true;
589  }
590  if (anycleared) {
592  }
593  return anycleared;
594 }

◆ getAuxIDs()

const SG::auxid_set_t & SG::AuxStoreInternal::getAuxIDs ( ) const
overridevirtualinherited

Return a set of identifiers for existing data items in this store.

This should include identifiers for all items, const and non-const.

Implements SG::IConstAuxStore.

Definition at line 400 of file AuxStoreInternal.cxx.

401 {
402  return m_auxids;
403 }

◆ getData() [1/3]

const void * SG::AuxStoreInternal::getData ( SG::auxid_t  auxid) const
overridevirtualinherited

Return the data vector for one aux data item.

Parameters
auxidThe identifier of the desired aux data item.

Each aux data item is stored as a vector, with one entry per entry in the owning container. This returns a pointer to the start of the vector.

This should return nullptr if the item doesn't exist.

Implements SG::IConstAuxStore.

Reimplemented in APRTest::AuxStore, and RootAuxDynStore.

Definition at line 83 of file AuxStoreInternal.cxx.

84 {
85  const IAuxTypeVector* v = getVector (auxid);
86  if (v) {
87  return v->toPtr();
88  }
89  return nullptr;
90 }

◆ getData() [2/3]

virtual const void* SG::IConstAuxStore::getData
inherited

Pick up the const version from the base class.

◆ getData() [3/3]

void * SG::AuxStoreInternal::getData ( SG::auxid_t  auxid,
size_t  size,
size_t  capacity 
)
overridevirtualinherited

Return the data vector for one aux data item.

Parameters
auxidThe identifier of the desired aux data item.
sizeThe current size of the container (in case the data item does not already exist).
capacityThe current capacity of the container (in case the data item does not already exist).

Each aux data item is stored as a vector, with one entry per entry in the owning container. This returns a pointer to the start of the vector.

If the data item does not exist, it should be created and initialized to default values. size and capacity give the size for the new aux data item vector.

Implements SG::IAuxStore.

Reimplemented in APRTest::AuxStore, and RootAuxDynStore.

Definition at line 130 of file AuxStoreInternal.cxx.

131 {
132  return getDataInternal (auxid, size, capacity, false);
133 }

◆ getDataInternal()

void * SG::AuxStoreInternal::getDataInternal ( SG::auxid_t  auxid,
size_t  size,
size_t  capacity,
bool  no_lock_check 
)
protectedvirtualinherited

Return the data vector for one aux data item.

Parameters
auxidThe identifier of the desired aux data item.
sizeThe current size of the container (in case the data item does not already exist).
capacityThe current capacity of the container (in case the data item does not already exist).
no_lock_checkIf true, then skip the test for a locked container.

Each aux data item is stored as a vector, with one entry per entry in the owning container. This returns a pointer to the start of the vector.

If the data item does not exist, it should be created and initialized to default values. size and capacity give the size for the new aux data item vector.

Definition at line 735 of file AuxStoreInternal.cxx.

739 {
740  guard_t guard (m_mutex);
741  return getVectorInternal_noLock (auxid, size, capacity, no_lock_check)->toPtr();
742 }

◆ getDecoration()

void * SG::AuxStoreInternal::getDecoration ( auxid_t  auxid,
size_t  size,
size_t  capacity 
)
overridevirtualinherited

Return the data vector for one aux data decoration item.

Parameters
auxidThe identifier of the desired aux data item.
sizeThe current size of the container (in case the data item does not already exist).
capacityThe current capacity of the container (in case the data item does not already exist).

Each aux data item is stored as a vector, with one entry per entry in the owning container. This returns a pointer to the start of the vector.

If the data item does not exist, it then it will be created and initialized with default values. If the container is locked, then the new item will be marked as a decoration. size and capacity give the size for the new aux data item vector.

If the data item already exists, then we return it if either the container is not locked or the item is marked as a decoration. Otherwise we throw an exception.

Implements SG::IConstAuxStore.

Reimplemented in RootAuxDynStore.

Definition at line 198 of file AuxStoreInternal.cxx.

199 {
200  guard_t guard (m_mutex);
201  if (m_vecs.size() <= auxid) {
202  m_vecs.resize (auxid+1);
203  }
204  if (m_vecs[auxid] == 0) {
205  m_vecs[auxid] = AuxTypeRegistry::instance().makeVector (auxid, size, capacity);
206  addAuxID (auxid);
207  std::unique_ptr<IAuxTypeVector> linked = m_vecs[auxid]->linkedVector();
208  auxid_t linked_id = null_auxid;
209  if (linked) {
210  linked_id = linked->auxid();
211  m_vecs[linked_id] = std::move (linked);
212  addAuxID (linked_id);
213  }
214  if (m_locked) {
215  m_decorations.insert (auxid);
216  if (linked_id != null_auxid) {
217  m_decorations.insert (linked_id);
218  }
219  }
220  }
221  if (m_locked && !m_decorations.test (auxid)) {
222  throw ExcStoreLocked (auxid);
223  }
224  return m_vecs[auxid]->toPtr();
225 }

◆ getDecorIDs()

const SG::auxid_set_t & SG::AuxStoreInternal::getDecorIDs ( ) const
overridevirtualinherited

Return a set of identifiers for decorations in this store.

Implements SG::IConstAuxStore.

Definition at line 410 of file AuxStoreInternal.cxx.

411 {
412  return m_decorations;
413 }

◆ getDynamicAuxIDs()

const SG::auxid_set_t & SG::AuxStoreInternal::getDynamicAuxIDs ( ) const
overridevirtualinherited

Get the list of all variables that need to be handled.

Implements SG::IAuxStoreIO.

Definition at line 552 of file AuxStoreInternal.cxx.

553 {
554  return getAuxIDs();
555 }

◆ getIOData()

const void * SG::AuxStoreInternal::getIOData ( SG::auxid_t  auxid) const
overridevirtualinherited

Return a pointer to the data to be stored for one aux data item.

Parameters
auxidThe identifier of the desired aux data item.

This will usually be a pointer to a std::vector; however, it may be something different for a standalone object.

Returns 0 and reports an error if the requested aux data item does not exist.

Implements SG::IAuxStoreIO.

Reimplemented in RootAuxDynStore.

Definition at line 515 of file AuxStoreInternal.cxx.

516 {
517  return getIODataInternal (auxid, false);
518 }

◆ getIODataInternal() [1/2]

void * SG::AuxStoreInternal::getIODataInternal ( auxid_t  auxid,
bool  quiet 
)
protectedinherited

Return a pointer to the data to be stored for one aux data item.

Parameters
auxidThe identifier of the desired aux data item.
quietIf true, then don't print an error on failure.

This will usually be a pointer to a std::vector; however, it may be something different for a standalone object.

Returns 0 and reports an error if the requested aux data item does not exist.

Definition at line 483 of file AuxStoreInternal.cxx.

484 {
485  guard_t guard (m_mutex);
486  if (auxid >= m_vecs.size() || !m_vecs[auxid]) {
487  if (!quiet) {
488  std::ostringstream ss;
489  ss << "Requested variable "
491  << " (" << auxid << ") doesn't exist";
492  ATHCONTAINERS_ERROR("AuxStoreInternal::getIODataInternal", ss.str());
493  }
494  return 0;
495  }
496 
497  if (m_standalone) {
498  if (!SG::AuxTypeRegistry::instance().isLinked (auxid))
499  return m_vecs[auxid]->toPtr();
500  }
501  return m_vecs[auxid]->toVector();
502 }

◆ getIODataInternal() [2/2]

const void * SG::AuxStoreInternal::getIODataInternal ( auxid_t  auxid,
bool  quiet 
) const
protectedinherited

Return a pointer to the data to be stored for one aux data item.

Parameters
auxidThe identifier of the desired aux data item.
quietIf true, then don't print an error on failure.

This will usually be a pointer to a std::vector; however, it may be something different for a standalone object.

Returns 0 and reports an error if the requested aux data item does not exist.

Definition at line 450 of file AuxStoreInternal.cxx.

451 {
452  guard_t guard (m_mutex);
453  if (auxid >= m_vecs.size() || !m_vecs[auxid]) {
454  if (!quiet) {
455  std::ostringstream ss;
456  ss << "Requested variable "
458  << " (" << auxid << ") doesn't exist";
459  ATHCONTAINERS_ERROR("AuxStoreInternal::getIODataInternal", ss.str());
460  }
461  return 0;
462  }
463 
464  if (m_standalone) {
465  if (!SG::AuxTypeRegistry::instance().isLinked (auxid))
466  return m_vecs[auxid]->toPtr();
467  }
468  return m_vecs[auxid]->toVector();
469 }

◆ getIOType()

const std::type_info * SG::AuxStoreInternal::getIOType ( SG::auxid_t  auxid) const
overridevirtualinherited

Return the type of the data to be stored for one aux data item.

Parameters
auxidThe identifier of the desired aux data item.

For an aux data item of type T, this will usually be std::vector<T>. For standalone objects, however, it will usually be T; and std::vector<char> will be used instead of std::vector<bool>.

Returns 0 if the requested aux data item does not exist.

Implements SG::IAuxStoreIO.

Definition at line 532 of file AuxStoreInternal.cxx.

533 {
534  if (m_standalone) {
536  if (!r.isLinked (auxid))
537  return r.getType (auxid);
538  }
539  guard_t guard (m_mutex);
540  if (auxid < m_vecs.size() && m_vecs[auxid]) {
541  const std::type_info* ret = m_vecs[auxid]->objType();
542  if (ret) return ret;
543  }
544  return SG::AuxTypeRegistry::instance().getVecType (auxid);
545 }

◆ getSelectedAuxIDs()

virtual SG::auxid_set_t SG::IAuxStoreIO::getSelectedAuxIDs ( ) const
inlinevirtualinherited

Get a list of dynamic variables that need to be written out.

Reimplemented in xAOD::TAuxStore, xAOD::AuxContainerBase, xAOD::ShallowAuxContainer, and xAOD::AuxInfoBase.

Definition at line 86 of file IAuxStoreIO.h.

86  {
87  // default all are selected
88  return getDynamicAuxIDs();
89  }

◆ getVector()

const IAuxTypeVector * SG::AuxStoreInternal::getVector ( SG::auxid_t  auxid) const
overridevirtualinherited

Return vector interface for one aux data item.

Parameters
auxidThe identifier of the desired aux data item.

This should return nullptr if the item doesn't exist.

Implements SG::IConstAuxStore.

Reimplemented in RootAuxDynStore.

Definition at line 99 of file AuxStoreInternal.cxx.

100 {
101  guard_t guard (m_mutex);
102  if (auxid >= m_vecs.size() || !m_vecs[auxid]) {
103  // With the new behavior of SG::Accessor::isAvailable,
104  // we shouldn't print an error message here. Asking the store whether
105  // it has an element using this function is not necessarily an
106  // error condition by now. In any case, the DataVector code will
107  // complain itself in case of an error.
108  return 0;
109  }
110  return m_vecs[auxid].get();
111 }

◆ getVectorInternal_noLock()

IAuxTypeVector * SG::AuxStoreInternal::getVectorInternal_noLock ( SG::auxid_t  auxid,
size_t  size,
size_t  capacity,
bool  no_lock_check 
)
privatevirtualinherited

Implementation of getVectorInternal; no locking.

Definition at line 684 of file AuxStoreInternal.cxx.

688 {
689  if (m_vecs.size() <= auxid) {
690  m_vecs.resize (auxid+1);
691  }
692  if (m_vecs[auxid] == 0) {
693  if (m_locked && !no_lock_check)
694  throw ExcStoreLocked (auxid);
695  const AuxTypeRegistry& r = AuxTypeRegistry::instance();
696  m_vecs[auxid] = r.makeVector (auxid, size, capacity);
697  addAuxID (auxid);
698  std::unique_ptr<IAuxTypeVector> linked = m_vecs[auxid]->linkedVector();
699  if (linked) {
700  auxid_t linked_id = linked->auxid();
701  m_vecs[linked_id] = std::move (linked);
702  addAuxID (linked_id);
703  }
704  }
705  else {
706  // Make sure the vector has at least the requested size.
707  // One way in which it could be short: setOption was called and created
708  // a variable in a store that had no other variables.
709  if (m_vecs[auxid]->size() < size) {
710  m_vecs[auxid]->resize (size);
711  m_vecs[auxid]->reserve (capacity);
712  }
713  }
714  return m_vecs[auxid].get();
715 }

◆ getWritableAuxIDs()

const SG::auxid_set_t & SG::AuxStoreInternal::getWritableAuxIDs ( ) const
overridevirtualinherited

Return a set of identifiers for writable data items in this store.

This should include only non-const identifiers.

Implements SG::IAuxStore.

Definition at line 433 of file AuxStoreInternal.cxx.

434 {
435  return getAuxIDs();
436 }

◆ insertMove()

bool SG::AuxStoreInternal::insertMove ( size_t  pos,
IAuxStore other,
const SG::auxid_set_t ignore = SG::auxid_set_t(0) 
)
overridevirtualinherited

Move all elements from other to this store.

Parameters
posThe starting index of the insertion.
otherStore from which to do the move.
ignoreSet of variables that should not be added to the store.

Let len be the size of other. The store will be increased in size by len elements, with the elements at pos being copied to pos+len. Then, for each auxiliary variable, the entire contents of that variable for other will be moved to this store at index pos. This will be done via move semantics if possible; otherwise, it will be done with a copy. Variables present in this store but not in other will have the corresponding elements default-initialized. Variables in other but not in this store will be added unless they are in ignore.

Returns true if it is known that none of the vectors' memory moved, false otherwise.

Implements SG::IAuxStore.

Definition at line 332 of file AuxStoreInternal.cxx.

335 {
336  guard_t guard (m_mutex);
337  const AuxTypeRegistry& r = AuxTypeRegistry::instance();
338 
339  if (m_locked)
340  throw ExcStoreLocked ("insertMove");
341  bool nomove = true;
342  size_t other_size = other.size();
343  if (other_size == 0)
344  return true;
345  for (SG::auxid_t id : m_auxids) {
346  SG::IAuxTypeVector* v_dst = nullptr;
347  if (id < m_vecs.size())
348  v_dst = m_vecs[id].get();
349  // Skip linked vars --- they should be taken care of by the parent var.
350  if (v_dst && !v_dst->isLinked()) {
351  if (other.getData (id)) {
352  void* src_ptr = other.getData (id, other_size, other_size);
353  if (src_ptr) {
354  if (!v_dst->insertMove (pos, src_ptr, 0, other_size,
355  other))
356  nomove = false;
357  }
358  }
359  else {
360  const void* orig = v_dst->toPtr();
361  v_dst->shift (pos, other_size);
362  if (orig != v_dst->toPtr())
363  nomove = false;
364  }
365  }
366  }
367 
368  // Add any new variables not present in the original container.
369  for (SG::auxid_t id : other.getAuxIDs()) {
370  if (!m_auxids.test(id) && !ignore.test(id))
371  {
372  if (r.isLinked (id)) continue;
373  if (other.getData (id)) {
374  void* src_ptr = other.getData (id, other_size, other_size);
375  if (src_ptr) {
376  size_t sz = size_noLock();
377  if (sz < other_size) sz = other_size + pos;
378  IAuxTypeVector* v = getVectorInternal_noLock (id, sz, sz, false);
379  v->resize (sz - other_size);
380  v->insertMove (pos, src_ptr, 0, other_size,
381  other);
382  nomove = false;
383  }
384  }
385  }
386  }
387 
388  return nomove;
389 }

◆ isDecoration()

bool SG::AuxStoreInternal::isDecoration ( auxid_t  auxid) const
overridevirtualinherited

Test if a particular variable is tagged as a decoration.

Parameters
auxidThe identifier of the desired aux data item.

Implements SG::IConstAuxStore.

Reimplemented in RootAuxDynStore.

Definition at line 420 of file AuxStoreInternal.cxx.

421 {
422  return m_decorations.test (auxid);
423 }

◆ linkedVector() [1/3]

const IAuxTypeVector * SG::AuxStoreInternal::linkedVector ( SG::auxid_t  auxid) const
overridevirtualinherited

Return interface for a linked variable.

Parameters
auxidThe ID of the parent variable.

If auxid has a linked variable, then return the IAuxTypeVector describing it. Otherwise, return nullptr. May return nullptr unconditionally if this store does not support linked variables.

Reimplemented from SG::IConstAuxStore.

Definition at line 789 of file AuxStoreInternal.cxx.

790 {
791  const AuxTypeRegistry& r = AuxTypeRegistry::instance();
792  auxid_t linked_id = r.linkedVariable (auxid);
793  guard_t guard (m_mutex);
794  if (linked_id < m_vecs.size())
795  return m_vecs[linked_id].get();
796  return nullptr;
797 }

◆ linkedVector() [2/3]

IAuxTypeVector * SG::AuxStoreInternal::linkedVector ( SG::auxid_t  auxid)
overridevirtualinherited

Return interface for a linked variable.

Parameters
auxidThe ID of the parent variable.

If auxid has a linked variable, then return the IAuxTypeVector describing it. Otherwise, return nullptr. May return nullptr unconditionally if this store does not support linked variables.

Reimplemented from SG::IAuxStore.

Definition at line 769 of file AuxStoreInternal.cxx.

770 {
771  const AuxTypeRegistry& r = AuxTypeRegistry::instance();
772  auxid_t linked_id = r.linkedVariable (auxid);
773  guard_t guard (m_mutex);
774  if (linked_id < m_vecs.size())
775  return m_vecs[linked_id].get();
776  return nullptr;
777 }

◆ linkedVector() [3/3]

virtual const IAuxTypeVector* SG::IConstAuxStore::linkedVector
inlineinherited

Return interface for a linked variable.

Parameters
auxidThe ID of the parent variable.

If auxid has a linked variable, then return the IAuxTypeVector describing it. Otherwise, return nullptr. May return nullptr unconditionally if this store does not support linked variables.

Definition at line 189 of file IConstAuxStore.h.

190  { return nullptr; }

◆ lock()

void SG::AuxStoreInternal::lock ( )
overridevirtualinherited

Lock the container.

After this, only decorations can be changed/modified. If the container is already locked, this is a no-op.

Implements SG::IConstAuxStore.

Definition at line 564 of file AuxStoreInternal.cxx.

565 {
566  guard_t guard (m_mutex);
567  m_locked = true;
568 }

◆ lockDecoration()

void SG::AuxStoreInternal::lockDecoration ( SG::auxid_t  auxid)
overridevirtualinherited

Lock a decoration.

Parameters
auxidIdentifier of the decoration to lock.

A decoration is locked by changing from a decoration to an ordinary variable. If the container itself is locked, then modifications to the variable are not permitted after this call.

Implements SG::IConstAuxStore.

Definition at line 753 of file AuxStoreInternal.cxx.

754 {
755  guard_t guard (m_mutex);
756  m_decorations.reset (auxid);
757 }

◆ reserve()

void SG::AuxStoreInternal::reserve ( size_t  sz)
overridevirtualinherited

Change the capacity of all aux data vectors.

Parameters
szThe new capacity.

This should be called when the capacity of the container changes (by reserve). This should change the capacity for the vectors for all aux data items.

Implements SG::IAuxStore.

Definition at line 267 of file AuxStoreInternal.cxx.

268 {
269  guard_t guard (m_mutex);
270  if (m_locked)
271  throw ExcStoreLocked ("reserve");
272  for (std::unique_ptr<IAuxTypeVector>& v : m_vecs) {
273  if (v && !v->isLinked())
274  v->reserve (sz);
275  }
276 }

◆ resize()

bool SG::AuxStoreInternal::resize ( size_t  sz)
overridevirtualinherited

Change the size of all aux data vectors.

Parameters
szThe new size.

This should be called when the size of the container changes. This should resize the vectors for all aux data items.

If the size of the container grows, the new elements should be default-initialized; if it shrinks, destructors should be run as appropriate.

Should return true if it is known that none of the data pointers changed (and thus the cache does not need to be cleared), false otherwise.

Implements SG::IAuxStore.

Definition at line 243 of file AuxStoreInternal.cxx.

244 {
245  guard_t guard (m_mutex);
246  if (m_locked)
247  throw ExcStoreLocked ("resize");
248  bool nomoves = true;
249  for (std::unique_ptr<IAuxTypeVector>& v : m_vecs) {
250  if (v && !v->isLinked()) {
251  if (!v->resize (sz))
252  nomoves = false;
253  }
254  }
255  return nomoves;
256 }

◆ setOption()

bool SG::AuxStoreInternal::setOption ( auxid_t  id,
const AuxDataOption option 
)
overridevirtualinherited

Set an option for an auxiliary data variable.

Parameters
idThe variable for which we want to set the option.
optionThe option setting to make.

The interpretation of option depends on the associated auxiliary store. See PackedParameters.h for option settings for writing packed data. Returns true on success, false otherwise.

Reimplemented from SG::IAuxStore.

Definition at line 636 of file AuxStoreInternal.cxx.

637 {
638  // Does this variable exist in this store?
639  bool exists = false;
640  {
641  guard_t guard (m_mutex);
642  if (id < m_vecs.size() && m_vecs[id] != 0)
643  exists = true;
644  }
645 
646  // If not, and we have a packing parameter request, then create the variable.
647  if (!exists) {
648  if (!PackedParameters::isValidOption (option)) return false;
649  size_t sz = size();
650  getDataInternal (id, sz, sz, true);
651  }
652 
653  // Try the option setting.
654  guard_t guard (m_mutex);
655  if (m_vecs[id]->setOption (option)) return true;
656 
657  // It didn't work. If this is a packing request, then try to convert
658  // the variable to packed form and retry.
659  if (!PackedParameters::isValidOption (option)) return false;
660  std::unique_ptr<IAuxTypeVector> packed = m_vecs[id]->toPacked();
661  if (packed) {
662  // Converted to packed form. Replace the object and retry.
663  m_vecs[id] = std::move (packed);
664  return m_vecs[id]->setOption (option);
665  }
666 
667  // Didn't work.
668  return false;
669 }

◆ shift()

void SG::AuxStoreInternal::shift ( size_t  pos,
ptrdiff_t  offs 
)
overridevirtualinherited

Shift the elements of the container.

Parameters
posThe starting index for the shift.
offsThe (signed) amount of the shift.

This operation shifts the elements in the vectors for all aux data items, to implement an insertion or deletion. offs may be either positive or negative.

If offs is positive, then the container is growing. The container size should be increased by offs, the element at pos moved to pos + offs, and similarly for following elements. The elements between pos and pos + offs should be default-initialized.

If offs is negative, then the container is shrinking. The element at pos should be moved to pos + offs, and similarly for following elements. The container should then be shrunk by -offs elements (running destructors as appropriate).

Implements SG::IAuxStore.

Definition at line 301 of file AuxStoreInternal.cxx.

302 {
303  guard_t guard (m_mutex);
304  if (m_locked)
305  throw ExcStoreLocked ("shift");
306  for (std::unique_ptr<IAuxTypeVector>& v : m_vecs) {
307  if (v && !v->isLinked())
308  v->shift (pos, offs);
309  }
310 }

◆ size()

size_t SG::AuxStoreInternal::size ( ) const
overridevirtualinherited

Return the number of elements in the store.

May return 0 for a store with no aux data.

Implements SG::IConstAuxStore.

Reimplemented in RootAuxDynStore, and APRTest::AuxStore.

Definition at line 602 of file AuxStoreInternal.cxx.

603 {
604  guard_t guard (m_mutex);
605  return size_noLock();
606 }

◆ size_noLock()

size_t SG::AuxStoreInternal::size_noLock ( ) const
privateinherited

Return the number of elements in the store; no locking.

Return the number of elements in the store.

(No locking.)

May return 0 for a store with no aux data.

Definition at line 614 of file AuxStoreInternal.cxx.

615 {
616  for (SG::auxid_t id : m_auxids) {
617  if (id < m_vecs.size() && m_vecs[id] && !m_vecs[id]->isLinked() &&
618  m_vecs[id]->size() > 0)
619  {
620  return m_vecs[id]->size();
621  }
622  }
623  return 0;
624 }

◆ standalone()

bool SG::AuxStoreInternal::standalone ( ) const
inherited

Return the standalone flag.

Definition at line 67 of file AuxStoreInternal.cxx.

68 {
69  return m_standalone;
70 }

Member Data Documentation

◆ m_auxids

SG::auxid_set_t SG::AuxStoreInternal::m_auxids
privateinherited

Set of auxid's for which we've created a vector.

Definition at line 454 of file AuxStoreInternal.h.

◆ m_decorations

SG::auxid_set_t SG::AuxStoreInternal::m_decorations
privateinherited

Record which variables are decorations.

Definition at line 451 of file AuxStoreInternal.h.

◆ m_locked

bool SG::AuxStoreInternal::m_locked
privateinherited

Has this container been locked?

Definition at line 457 of file AuxStoreInternal.h.

◆ m_mutex

mutex_t SG::AuxStoreInternal::m_mutex
mutableprivateinherited

Definition at line 462 of file AuxStoreInternal.h.

◆ m_standalone

bool SG::AuxStoreInternal::m_standalone
privateinherited

Are we being written in standalone mode?

Definition at line 444 of file AuxStoreInternal.h.

◆ m_vecs

std::vector<std::unique_ptr<IAuxTypeVector> > SG::AuxStoreInternal::m_vecs
privateinherited

The collection of vectors of aux data that we're managing, indexed by auxid.

Definition at line 448 of file AuxStoreInternal.h.

◆ supportsThinning

constexpr bool SG::IAuxStore::supportsThinning = true
staticconstexprinherited

Mark that this type supports thinning operations.

See AthContainers/supportsThinning.h and AthenaPoolCnvSvc/T_AthenaPoolCnv.h. Helps guide which pool converter template will be used. If false, the default pool converter will be used rather than the aux store-specific one. Ordinary xAOD type should not touch this, but may be overridden in a derived class to handle certain special cases.

Definition at line 199 of file IAuxStore.h.


The documentation for this class was generated from the following file:
SG::IAuxTypeVector::shift
virtual bool shift(size_t pos, ptrdiff_t offs)=0
Shift the elements of the vector.
SG::IAuxTypeVector::isLinked
bool isLinked() const
Return true if this variable is linked from another one.
Definition: IAuxTypeVector.h:226
beamspotman.r
def r
Definition: beamspotman.py:676
SG::AuxStoreInternal::addAuxID
void addAuxID(auxid_t auxid)
Add a new auxid to the set of those being managed by this store.
Definition: AuxStoreInternal.cxx:676
fitman.sz
sz
Definition: fitman.py:527
SG::AuxStoreInternal::size_noLock
size_t size_noLock() const
Return the number of elements in the store; no locking.
Definition: AuxStoreInternal.cxx:614
PowhegControl_ttHplus_NLO.ss
ss
Definition: PowhegControl_ttHplus_NLO.py:83
SG::AuxTypeRegistry::instance
static AuxTypeRegistry & instance()
Return the singleton registry instance.
Definition: AuxTypeRegistry.cxx:640
SG::AuxStoreInternal::m_auxids
SG::auxid_set_t m_auxids
Set of auxid's for which we've created a vector.
Definition: AuxStoreInternal.h:454
quiet
bool quiet
Definition: TrigGlobEffCorrValidation.cxx:190
SG::AuxStoreInternal::guard_t
AthContainers_detail::lock_guard< mutex_t > guard_t
Definition: AuxStoreInternal.h:461
SG::AuxStoreInternal::m_mutex
mutex_t m_mutex
Definition: AuxStoreInternal.h:462
ATHCONTAINERS_ERROR
#define ATHCONTAINERS_ERROR(ctx, msg)
Definition: error.h:50
SG::AuxTypeRegistry::getName
std::string getName(SG::auxid_t auxid) const
Return the name of an aux data item.
Definition: AuxTypeRegistry.cxx:882
SG::AuxStoreInternal::standalone
bool standalone() const
Return the standalone flag.
Definition: AuxStoreInternal.cxx:67
SG::AuxStoreInternal::m_decorations
SG::auxid_set_t m_decorations
Record which variables are decorations.
Definition: AuxStoreInternal.h:451
SG::IAuxTypeVector::insertMove
virtual bool insertMove(size_t pos, void *src, size_t src_pos, size_t src_n, IAuxStore &srcStore)=0
Insert elements into the vector via move semantics.
vec
std::vector< size_t > vec
Definition: CombinationsGeneratorTest.cxx:12
SG::AuxStoreInternal::m_locked
bool m_locked
Has this container been locked?
Definition: AuxStoreInternal.h:457
CxxUtils::ConcurrentBitset::clear
ConcurrentBitset & clear()
Clear all bits in the set.
SG::AuxStoreInternal::getAuxIDs
virtual const SG::auxid_set_t & getAuxIDs() const override
Return a set of identifiers for existing data items in this store.
Definition: AuxStoreInternal.cxx:400
SG::AuxTypeRegistry
Handle mappings between names and auxid_t.
Definition: AuxTypeRegistry.h:61
DiTauMassTools::ignore
void ignore(T &&)
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:58
SG::AuxStoreInternal::m_vecs
std::vector< std::unique_ptr< IAuxTypeVector > > m_vecs
The collection of vectors of aux data that we're managing, indexed by auxid.
Definition: AuxStoreInternal.h:448
SG::auxid_t
size_t auxid_t
Identifier for a particular aux data item.
Definition: AuxTypes.h:27
H5Utils::internal::packed
H5::CompType packed(H5::CompType in)
Definition: common.cxx:16
CxxUtils::ConcurrentBitset::insert
ConcurrentBitset & insert(bit_t bit, bit_t new_nbits=0)
Set a bit to 1.
CxxUtils::ConcurrentBitset::reset
ConcurrentBitset & reset(bit_t bit)
Turn off one bit.
SG::AuxStoreInternal::getIODataInternal
const void * getIODataInternal(auxid_t auxid, bool quiet) const
Return a pointer to the data to be stored for one aux data item.
Definition: AuxStoreInternal.cxx:450
SG::AuxStoreInternal::getVectorInternal_noLock
virtual IAuxTypeVector * getVectorInternal_noLock(SG::auxid_t auxid, size_t size, size_t capacity, bool no_lock_check)
Implementation of getVectorInternal; no locking.
Definition: AuxStoreInternal.cxx:684
SG::AuxTypeRegistry::getVecType
const std::type_info * getVecType(SG::auxid_t auxid) const
Return the type of the STL vector used to hold an aux data item.
Definition: AuxTypeRegistry.cxx:937
SG::AuxStoreInternal::setOption
virtual bool setOption(auxid_t id, const AuxDataOption &option) override
Set an option for an auxiliary data variable.
Definition: AuxStoreInternal.cxx:636
SG::AuxStoreInternal::getDataInternal
virtual void * getDataInternal(SG::auxid_t auxid, size_t size, size_t capacity, bool no_lock_check)
Return the data vector for one aux data item.
Definition: AuxStoreInternal.cxx:735
SG::AuxStoreInternal::size
virtual size_t size() const override
Return the number of elements in the store.
Definition: AuxStoreInternal.cxx:602
SG::IAuxStoreIO::getDynamicAuxIDs
virtual const SG::auxid_set_t & getDynamicAuxIDs() const =0
Get the list of all dynamically created variables.
SG::AuxTypeRegistry::makeVector
std::unique_ptr< IAuxTypeVector > makeVector(SG::auxid_t auxid, size_t size, size_t capacity) const
Construct a new vector to hold an aux item.
Definition: AuxTypeRegistry.cxx:818
id
SG::auxid_t id
Definition: Control/AthContainers/Root/debug.cxx:220
SG::PackedParameters::isValidOption
static bool isValidOption(const AuxDataOption &option)
Test to see if option is a recognized packing option.
Definition: PackedParameters.cxx:197
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
SG::AuxStoreInternal
An auxiliary data store that holds data internally.
Definition: AuxStoreInternal.h:43
python.PyAthena.v
v
Definition: PyAthena.py:154
SG::AuxStoreInternal::m_standalone
bool m_standalone
Are we being written in standalone mode?
Definition: AuxStoreInternal.h:444
InDetDD::other
@ other
Definition: InDetDD_Defs.h:16
SG::AuxStoreInternal::getVector
virtual const IAuxTypeVector * getVector(SG::auxid_t auxid) const override
Return vector interface for one aux data item.
Definition: AuxStoreInternal.cxx:99
SG::AuxStoreInternal::isDecoration
virtual bool isDecoration(auxid_t auxid) const override
Test if a particular variable is tagged as a decoration.
Definition: AuxStoreInternal.cxx:420
SG::IAuxTypeVector
Abstract interface for manipulating vectors of arbitrary types.
Definition: IAuxTypeVector.h:42
python.dummyaccess.exists
def exists(filename)
Definition: dummyaccess.py:9
CxxUtils::ConcurrentBitset::erase
ConcurrentBitset & erase(bit_t bit)
Turn off one bit.
SG::IAuxTypeVector::toPtr
virtual void * toPtr()=0
Return a pointer to the start of the vector's data.
CxxUtils::ConcurrentBitset::test
bool test(bit_t bit) const
Test to see if a bit is set.