ATLAS Offline Software
Public Member Functions | Public Attributes | Static Public Attributes | Protected Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
APRTest::AuxStore Class Referenceabstract

#include <AuxStoreTest.h>

Inheritance diagram for APRTest::AuxStore:
Collaboration diagram for APRTest::AuxStore:

Public Member Functions

virtual ~AuxStore ()
 
virtual void setStore (IAuxStore *store) override
 
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 override
 Return the data vector for one aux data item. More...
 
virtual IAuxStore * getStore () override
 Return the pointer to the store object currently in use. More...
 
virtual const IAuxStore * getStore () const override
 
virtual AuxStoreType getStoreType () const override
 Return the type of the store object. More...
 
virtual size_t size () const override
 Return the number of elements in the store. More...
 
bool standalone () const
 Return the standalone flag. 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 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...
 

Public Attributes

int m_data = 0
 

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
 
enum  AuxStoreType { AST_ObjectStore = 0, AST_ContainerStore = 1 }
 Type of the auxiliary store. More...
 

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...
 
virtual void setStore (IAuxStore *store)=0
 Give an auxiliary store object to the holder object. More...
 

Private Attributes

IAuxStore * m_extra_store = 0
 
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 16 of file AuxStoreTest.h.

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.

Member Enumeration Documentation

◆ AuxStoreType

Type of the auxiliary store.

In the xAOD EDM we use auxiliary store objects in some cases to describe a single object, and in most cases to describe a container of objects. This enumeration declares which type the object implementing this interface is.

Enumerator
AST_ObjectStore 

The store describes a single object.

AST_ContainerStore 

The store describes a container.

Definition at line 66 of file IAuxStoreHolder.h.

66  {
67  AST_ObjectStore = 0,
69  };

Constructor & Destructor Documentation

◆ ~AuxStore()

virtual APRTest::AuxStore::~AuxStore ( )
inlinevirtual

Definition at line 22 of file AuxStoreTest.h.

22 {}

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 687 of file AuxStoreInternal.cxx.

688 {
689  m_auxids.insert (auxid);
690 }

◆ 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 146 of file AuxStoreInternal.cxx.

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

◆ 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 592 of file AuxStoreInternal.cxx.

593 {
594  guard_t guard (m_mutex);
595  bool anycleared = false;
596  for (auxid_t id : m_decorations) {
597  m_vecs[id].reset();
598  m_auxids.erase (id);
599  anycleared = true;
600  }
601  if (anycleared) {
603  }
604  return anycleared;
605 }

◆ 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 411 of file AuxStoreInternal.cxx.

412 {
413  return m_auxids;
414 }

◆ getData() [1/3]

const void * APRTest::AuxStore::getData ( SG::auxid_t  auxid) const
inlineoverridevirtual

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.

Reimplemented from SG::AuxStoreInternal.

Definition at line 53 of file AuxStoreTest.h.

54  {
55  return m_extra_store? m_extra_store->getData( auxid)
57  }

◆ getData() [2/3]

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

Pick up the const version from the base class.

◆ getData() [3/3]

void * APRTest::AuxStore::getData ( SG::auxid_t  auxid,
size_t  size,
size_t  capacity 
)
inlineoverridevirtual

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.

Reimplemented from SG::AuxStoreInternal.

Definition at line 46 of file AuxStoreTest.h.

47  {
48  return m_extra_store? m_extra_store->getData( auxid, size, capacity)
49  : SG::AuxStoreInternal::getData( auxid, size, capacity);
50  }

◆ 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 746 of file AuxStoreInternal.cxx.

750 {
751  guard_t guard (m_mutex);
752  return getVectorInternal_noLock (auxid, size, capacity, no_lock_check)->toPtr();
753 }

◆ 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 204 of file AuxStoreInternal.cxx.

205 {
206  guard_t guard (m_mutex);
207  if (m_vecs.size() <= auxid) {
208  m_vecs.resize (auxid+1);
209  }
210  if (m_vecs[auxid] == 0) {
211  m_vecs[auxid] = AuxTypeRegistry::instance().makeVector (auxid, size, capacity);
212  std::unique_ptr<IAuxTypeVector> linked = m_vecs[auxid]->linkedVector();
213  auxid_t linked_id = null_auxid;
214  if (linked) {
215  linked_id = linked->auxid();
216  m_vecs[linked_id] = std::move (linked);
217  }
218  if (m_locked) {
219  // Need to be sure that the addition to the decoration bitset is visible
220  // to other threads before the addition to the variable bitset.
221  m_decorations.insert (auxid);
222  if (linked_id != null_auxid) {
223  m_decorations.insert (linked_id);
224  }
225  std::atomic_thread_fence (std::memory_order_seq_cst);
226  }
227  addAuxID (auxid);
228  if (linked_id != null_auxid) {
229  addAuxID (linked_id);
230  }
231  }
232  if (m_locked && !m_decorations.test (auxid)) {
233  throw ExcStoreLocked (auxid);
234  }
235  return m_vecs[auxid]->toPtr();
236 }

◆ 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 421 of file AuxStoreInternal.cxx.

422 {
423  return m_decorations;
424 }

◆ 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 563 of file AuxStoreInternal.cxx.

564 {
565  return getAuxIDs();
566 }

◆ 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 526 of file AuxStoreInternal.cxx.

527 {
528  return getIODataInternal (auxid, false);
529 }

◆ 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 494 of file AuxStoreInternal.cxx.

495 {
496  guard_t guard (m_mutex);
497  if (auxid >= m_vecs.size() || !m_vecs[auxid]) {
498  if (!quiet) {
499  std::ostringstream ss;
500  ss << "Requested variable "
502  << " (" << auxid << ") doesn't exist";
503  ATHCONTAINERS_ERROR("AuxStoreInternal::getIODataInternal", ss.str());
504  }
505  return 0;
506  }
507 
508  if (m_standalone) {
509  if (!SG::AuxTypeRegistry::instance().isLinked (auxid))
510  return m_vecs[auxid]->toPtr();
511  }
512  return m_vecs[auxid]->toVector();
513 }

◆ 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 461 of file AuxStoreInternal.cxx.

462 {
463  guard_t guard (m_mutex);
464  if (auxid >= m_vecs.size() || !m_vecs[auxid]) {
465  if (!quiet) {
466  std::ostringstream ss;
467  ss << "Requested variable "
469  << " (" << auxid << ") doesn't exist";
470  ATHCONTAINERS_ERROR("AuxStoreInternal::getIODataInternal", ss.str());
471  }
472  return 0;
473  }
474 
475  if (m_standalone) {
476  if (!SG::AuxTypeRegistry::instance().isLinked (auxid))
477  return m_vecs[auxid]->toPtr();
478  }
479  return m_vecs[auxid]->toVector();
480 }

◆ 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 543 of file AuxStoreInternal.cxx.

544 {
545  if (m_standalone) {
547  if (!r.isLinked (auxid))
548  return r.getType (auxid);
549  }
550  guard_t guard (m_mutex);
551  if (auxid < m_vecs.size() && m_vecs[auxid]) {
552  const std::type_info* ret = m_vecs[auxid]->objType();
553  if (ret) return ret;
554  }
555  return SG::AuxTypeRegistry::instance().getVecType (auxid);
556 }

◆ 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::AuxContainerBase, xAOD::ShallowAuxContainer, xAOD::AuxInfoBase, and xAOD::details::AuxStoreBase.

Definition at line 86 of file IAuxStoreIO.h.

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

◆ getStore() [1/2]

virtual const IAuxStore* APRTest::AuxStore::getStore ( ) const
inlineoverridevirtual

Implements SG::IAuxStoreHolder.

Definition at line 35 of file AuxStoreTest.h.

35 { return static_cast<const IAuxStore*>(this); }

◆ getStore() [2/2]

virtual IAuxStore* APRTest::AuxStore::getStore ( )
inlineoverridevirtual

Return the pointer to the store object currently in use.

There's not much use case for this function yet, but it makes the interface complete at least.

Implements SG::IAuxStoreHolder.

Definition at line 34 of file AuxStoreTest.h.

34 { return static_cast<IAuxStore*>(this); }

◆ getStoreType()

virtual AuxStoreType APRTest::AuxStore::getStoreType ( ) const
inlineoverridevirtual

Return the type of the store object.

See also
AuxStoreType

Implements SG::IAuxStoreHolder.

Definition at line 37 of file AuxStoreTest.h.

37 { return AST_ContainerStore; }

◆ 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 101 of file AuxStoreInternal.cxx.

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

◆ 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 695 of file AuxStoreInternal.cxx.

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

◆ 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 444 of file AuxStoreInternal.cxx.

445 {
446  return getAuxIDs();
447 }

◆ 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 343 of file AuxStoreInternal.cxx.

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

◆ 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 431 of file AuxStoreInternal.cxx.

432 {
433  return m_decorations.test (auxid);
434 }

◆ 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 800 of file AuxStoreInternal.cxx.

801 {
802  const AuxTypeRegistry& r = AuxTypeRegistry::instance();
803  auxid_t linked_id = r.linkedVariable (auxid);
804  guard_t guard (m_mutex);
805  if (linked_id < m_vecs.size())
806  return m_vecs[linked_id].get();
807  return nullptr;
808 }

◆ 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 780 of file AuxStoreInternal.cxx.

781 {
782  const AuxTypeRegistry& r = AuxTypeRegistry::instance();
783  auxid_t linked_id = r.linkedVariable (auxid);
784  guard_t guard (m_mutex);
785  if (linked_id < m_vecs.size())
786  return m_vecs[linked_id].get();
787  return nullptr;
788 }

◆ 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 575 of file AuxStoreInternal.cxx.

576 {
577  guard_t guard (m_mutex);
578  m_locked = true;
579 }

◆ 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 764 of file AuxStoreInternal.cxx.

765 {
766  guard_t guard (m_mutex);
767  m_decorations.reset (auxid);
768 }

◆ 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 278 of file AuxStoreInternal.cxx.

279 {
280  guard_t guard (m_mutex);
281  if (m_locked)
282  throw ExcStoreLocked ("reserve");
283  for (std::unique_ptr<IAuxTypeVector>& v : m_vecs) {
284  if (v && !v->isLinked())
285  v->reserve (sz);
286  }
287 }

◆ 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 254 of file AuxStoreInternal.cxx.

255 {
256  guard_t guard (m_mutex);
257  if (m_locked)
258  throw ExcStoreLocked ("resize");
259  bool nomoves = true;
260  for (std::unique_ptr<IAuxTypeVector>& v : m_vecs) {
261  if (v && !v->isLinked()) {
262  if (!v->resize (sz))
263  nomoves = false;
264  }
265  }
266  return nomoves;
267 }

◆ 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 647 of file AuxStoreInternal.cxx.

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

◆ setStore() [1/2]

virtual void APRTest::AuxStore::setStore ( IAuxStore *  store)
inlineoverridevirtual

Definition at line 25 of file AuxStoreTest.h.

25  {
27  }

◆ setStore() [2/2]

virtual void SG::IAuxStoreHolder::setStore ( IAuxStore store)
pure virtualinherited

Give an auxiliary store object to the holder object.

The purpose of this function is to give an alternate store object to this object instead of the one it uses normally.

Parameters
storePointer to an object implementing direct ROOT I/O

Implemented in xAOD::ShallowAuxContainer, xAOD::AuxContainerBase, and xAOD::AuxInfoBase.

◆ 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 312 of file AuxStoreInternal.cxx.

313 {
314  guard_t guard (m_mutex);
315  if (m_locked)
316  throw ExcStoreLocked ("shift");
317  for (std::unique_ptr<IAuxTypeVector>& v : m_vecs) {
318  if (v && !v->isLinked())
319  v->shift (pos, offs);
320  }
321 }

◆ size()

virtual size_t APRTest::AuxStore::size ( ) const
inlineoverridevirtual

Return the number of elements in the store.

May return 0 for a store with no aux data.

Reimplemented from SG::AuxStoreInternal.

Definition at line 39 of file AuxStoreTest.h.

◆ 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 625 of file AuxStoreInternal.cxx.

626 {
627  for (SG::auxid_t id : m_auxids) {
628  if (id < m_vecs.size() && m_vecs[id] && !m_vecs[id]->isLinked() &&
629  m_vecs[id]->size() > 0)
630  {
631  return m_vecs[id]->size();
632  }
633  }
634  return 0;
635 }

◆ standalone()

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

Return the standalone flag.

Definition at line 69 of file AuxStoreInternal.cxx.

70 {
71  return m_standalone;
72 }

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_data

int APRTest::AuxStore::m_data = 0

Definition at line 20 of file AuxStoreTest.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_extra_store

IAuxStore* APRTest::AuxStore::m_extra_store = 0
private

Definition at line 18 of file AuxStoreTest.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
SGTest::store
TestStore store
Definition: TestStore.cxx:23
beamspotman.r
def r
Definition: beamspotman.py:674
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:687
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:625
APRTest::AuxStore::size
virtual size_t size() const override
Return the number of elements in the store.
Definition: AuxStoreTest.h:39
PowhegControl_ttHplus_NLO.ss
ss
Definition: PowhegControl_ttHplus_NLO.py:83
SG::AuxStoreInternal::getData
virtual const void * getData(SG::auxid_t auxid) const override
Return the data vector for one aux data item.
Definition: AuxStoreInternal.cxx:85
SG::AuxTypeRegistry::instance
static AuxTypeRegistry & instance()
Return the singleton registry instance.
Definition: AuxTypeRegistry.cxx:639
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:54
SG::AuxTypeRegistry::getName
std::string getName(SG::auxid_t auxid) const
Return the name of an aux data item.
Definition: AuxTypeRegistry.cxx:881
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:9
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:411
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:461
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:695
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:936
SG::AuxStoreInternal::setOption
virtual bool setOption(auxid_t id, const AuxDataOption &option) override
Set an option for an auxiliary data variable.
Definition: AuxStoreInternal.cxx:647
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:746
SG::AuxStoreInternal::size
virtual size_t size() const override
Return the number of elements in the store.
Definition: AuxStoreInternal.cxx:613
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:817
id
SG::auxid_t id
Definition: Control/AthContainers/Root/debug.cxx:239
APRTest::AuxStore::m_extra_store
IAuxStore * m_extra_store
Definition: AuxStoreTest.h:18
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:16
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::isDecoration
virtual bool isDecoration(auxid_t auxid) const override
Test if a particular variable is tagged as a decoration.
Definition: AuxStoreInternal.cxx:431
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::IAuxStoreHolder::AST_ObjectStore
@ AST_ObjectStore
The store describes a single object.
Definition: IAuxStoreHolder.h:67
SG::IAuxTypeVector::toPtr
virtual void * toPtr()=0
Return a pointer to the start of the vector's data.
SG::IAuxStoreHolder::AST_ContainerStore
@ AST_ContainerStore
The store describes a container.
Definition: IAuxStoreHolder.h:68
CxxUtils::ConcurrentBitset::test
bool test(bit_t bit) const
Test to see if a bit is set.