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 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 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 void * getDataInternal_noLock (SG::auxid_t auxid, size_t size, size_t capacity, bool no_lock_check)
 Implementation of getDataInternal; 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 446 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 445 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 650 of file AuxStoreInternal.cxx.

651 {
652  m_auxids.insert (auxid);
653 }

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

130 {
131  guard_t guard (m_mutex);
132  auxid_t auxid = vec->auxid();
133  if (m_locked)
134  throw ExcStoreLocked (auxid);
135 
136  // Resize the vector if needed.
137  if (m_vecs.size() <= auxid) {
138  m_vecs.resize (auxid+1);
139  }
140 
141  // Give up if the variable is already present in the store.
142  if (m_vecs[auxid]) std::abort();
143 
144  // Make sure the length is consistent with the rest of the store.
145  if (!vec->isLinked()) {
146  size_t sz = this->size_noLock();
147  if (vec->size() < sz)
148  vec->resize (sz);
149  }
150 
151  // Add it to the store.
152  m_vecs[auxid] = std::move (vec);
153  addAuxID (auxid);
154  if (isDecoration) {
155  m_decorations.insert (auxid);
156  }
157 }

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

556 {
557  guard_t guard (m_mutex);
558  bool anycleared = false;
559  for (auxid_t id : m_decorations) {
560  m_vecs[id].reset();
561  m_auxids.erase (id);
562  anycleared = true;
563  }
564  if (anycleared) {
566  }
567  return anycleared;
568 }

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

385 {
386  return m_auxids;
387 }

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

712 {
713  guard_t guard (m_mutex);
714  return getDataInternal_noLock (auxid, size, capacity, no_lock_check);
715 }

◆ getDataInternal_noLock()

void * SG::AuxStoreInternal::getDataInternal_noLock ( SG::auxid_t  auxid,
size_t  size,
size_t  capacity,
bool  no_lock_check 
)
privatevirtualinherited

Implementation of getDataInternal; no locking.

Definition at line 657 of file AuxStoreInternal.cxx.

661 {
662  if (m_vecs.size() <= auxid) {
663  m_vecs.resize (auxid+1);
664  }
665  if (m_vecs[auxid] == 0) {
666  if (m_locked && !no_lock_check)
667  throw ExcStoreLocked (auxid);
668  const AuxTypeRegistry& r = AuxTypeRegistry::instance();
669  m_vecs[auxid] = r.makeVector (auxid, size, capacity);
670  addAuxID (auxid);
671  std::unique_ptr<IAuxTypeVector> linked = m_vecs[auxid]->linkedVector();
672  if (linked) {
673  auxid_t linked_id = linked->auxid();
674  m_vecs[linked_id] = std::move (linked);
675  addAuxID (linked_id);
676  }
677  }
678  else {
679  // Make sure the vector has at least the requested size.
680  // One way in which it could be short: setOption was called and created
681  // a variable in a store that had no other variables.
682  if (m_vecs[auxid]->size() < size) {
683  m_vecs[auxid]->resize (size);
684  m_vecs[auxid]->reserve (capacity);
685  }
686  }
687  return m_vecs[auxid]->toPtr();
688 }

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

183 {
184  guard_t guard (m_mutex);
185  if (m_vecs.size() <= auxid) {
186  m_vecs.resize (auxid+1);
187  }
188  if (m_vecs[auxid] == 0) {
189  m_vecs[auxid] = AuxTypeRegistry::instance().makeVector (auxid, size, capacity);
190  addAuxID (auxid);
191  std::unique_ptr<IAuxTypeVector> linked = m_vecs[auxid]->linkedVector();
192  auxid_t linked_id = null_auxid;
193  if (linked) {
194  linked_id = linked->auxid();
195  m_vecs[linked_id] = std::move (linked);
196  addAuxID (linked_id);
197  }
198  if (m_locked) {
199  m_decorations.insert (auxid);
200  if (linked_id != null_auxid) {
201  m_decorations.insert (linked_id);
202  }
203  }
204  }
205  if (m_locked && !m_decorations.test (auxid)) {
206  throw ExcStoreLocked (auxid);
207  }
208  return m_vecs[auxid]->toPtr();
209 }

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

527 {
528  return getAuxIDs();
529 }

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

490 {
491  return getIODataInternal (auxid, false);
492 }

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

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

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

425 {
426  guard_t guard (m_mutex);
427  if (auxid >= m_vecs.size() || !m_vecs[auxid]) {
428  if (!quiet) {
429  std::ostringstream ss;
430  ss << "Requested variable "
432  << " (" << auxid << ") doesn't exist";
433  ATHCONTAINERS_ERROR("AuxStoreInternal::getIODataInternal", ss.str());
434  }
435  return 0;
436  }
437 
438  if (m_standalone) {
439  if (!SG::AuxTypeRegistry::instance().isLinked (auxid))
440  return m_vecs[auxid]->toPtr();
441  }
442  return m_vecs[auxid]->toVector();
443 }

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

507 {
508  if (m_standalone) {
510  if (!r.isLinked (auxid))
511  return r.getType (auxid);
512  }
513  guard_t guard (m_mutex);
514  if (auxid < m_vecs.size() && m_vecs[auxid]) {
515  const std::type_info* ret = m_vecs[auxid]->objType();
516  if (ret) return ret;
517  }
518  return SG::AuxTypeRegistry::instance().getVecType (auxid);
519 }

◆ 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  }

◆ getStore() [1/2]

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

Implements SG::IAuxStoreHolder.

Definition at line 35 of file AuxStoreTest.h.

35 { return (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 (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; }

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

408 {
409  return getAuxIDs();
410 }

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

319 {
320  guard_t guard (m_mutex);
321  const AuxTypeRegistry& r = AuxTypeRegistry::instance();
322 
323  if (m_locked)
324  throw ExcStoreLocked ("insertMove");
325  bool nomove = true;
326  size_t other_size = other.size();
327  if (other_size == 0)
328  return true;
329  for (SG::auxid_t id : m_auxids) {
330  SG::IAuxTypeVector* v_dst = nullptr;
331  if (id < m_vecs.size())
332  v_dst = m_vecs[id].get();
333  // Skip linked vars --- they should be taken care of by the parent var.
334  if (v_dst && !v_dst->isLinked()) {
335  if (other.getData (id)) {
336  void* src_ptr = other.getData (id, other_size, other_size);
337  if (src_ptr) {
338  if (!v_dst->insertMove (pos, src_ptr, reinterpret_cast<char*>(src_ptr) + other_size*r.getEltSize(id),
339  other))
340  nomove = false;
341  }
342  }
343  else {
344  const void* orig = v_dst->toPtr();
345  v_dst->shift (pos, other_size);
346  if (orig != v_dst->toPtr())
347  nomove = false;
348  }
349  }
350  }
351 
352  // Add any new variables not present in the original container.
353  for (SG::auxid_t id : other.getAuxIDs()) {
354  if (!m_auxids.test(id) && !ignore.test(id))
355  {
356  if (r.isLinked (id)) continue;
357  if (other.getData (id)) {
358  void* src_ptr = other.getData (id, other_size, other_size);
359  if (src_ptr) {
360  size_t sz = size_noLock();
361  if (sz < other_size) sz = other_size + pos;
362  (void)getDataInternal_noLock (id, sz, sz, false);
363  m_vecs[id]->resize (sz - other_size);
364  m_vecs[id]->insertMove (pos, src_ptr, reinterpret_cast<char*>(src_ptr) + other_size*r.getEltSize(id),
365  other);
366  nomove = false;
367  }
368  }
369  }
370  }
371 
372  return nomove;
373 }

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

395 {
396  return m_decorations.test (auxid);
397 }

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

763 {
764  const AuxTypeRegistry& r = AuxTypeRegistry::instance();
765  auxid_t linked_id = r.linkedVariable (auxid);
766  guard_t guard (m_mutex);
767  if (linked_id < m_vecs.size())
768  return m_vecs[linked_id].get();
769  return nullptr;
770 }

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

743 {
744  const AuxTypeRegistry& r = AuxTypeRegistry::instance();
745  auxid_t linked_id = r.linkedVariable (auxid);
746  guard_t guard (m_mutex);
747  if (linked_id < m_vecs.size())
748  return m_vecs[linked_id].get();
749  return nullptr;
750 }

◆ 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 174 of file IConstAuxStore.h.

175  { 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 538 of file AuxStoreInternal.cxx.

539 {
540  guard_t guard (m_mutex);
541  m_locked = true;
542 }

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

727 {
728  guard_t guard (m_mutex);
729  m_decorations.reset (auxid);
730 }

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

252 {
253  guard_t guard (m_mutex);
254  if (m_locked)
255  throw ExcStoreLocked ("reserve");
256  for (std::unique_ptr<IAuxTypeVector>& v : m_vecs) {
257  if (v && !v->isLinked())
258  v->reserve (sz);
259  }
260 }

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

228 {
229  guard_t guard (m_mutex);
230  if (m_locked)
231  throw ExcStoreLocked ("resize");
232  bool nomoves = true;
233  for (std::unique_ptr<IAuxTypeVector>& v : m_vecs) {
234  if (v && !v->isLinked()) {
235  if (!v->resize (sz))
236  nomoves = false;
237  }
238  }
239  return nomoves;
240 }

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

611 {
612  // Does this variable exist in this store?
613  bool exists = false;
614  {
615  guard_t guard (m_mutex);
616  if (id < m_vecs.size() && m_vecs[id] != 0)
617  exists = true;
618  }
619 
620  // If not, and we have a packing parameter request, then create the variable.
621  if (!exists) {
622  if (!PackedParameters::isValidOption (option)) return false;
623  size_t sz = size();
624  getDataInternal (id, sz, sz, true);
625  }
626 
627  // Try the option setting.
628  guard_t guard (m_mutex);
629  if (m_vecs[id]->setOption (option)) return true;
630 
631  // It didn't work. If this is a packing request, then try to convert
632  // the variable to packed form and retry.
633  if (!PackedParameters::isValidOption (option)) return false;
634  std::unique_ptr<IAuxTypeVector> packed = m_vecs[id]->toPacked();
635  if (packed) {
636  // Converted to packed form. Replace the object and retry.
637  m_vecs[id] = std::move (packed);
638  return m_vecs[id]->setOption (option);
639  }
640 
641  // Didn't work.
642  return false;
643 }

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

286 {
287  guard_t guard (m_mutex);
288  if (m_locked)
289  throw ExcStoreLocked ("shift");
290  for (std::unique_ptr<IAuxTypeVector>& v : m_vecs) {
291  if (v && !v->isLinked())
292  v->shift (pos, offs);
293  }
294 }

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

589 {
590  for (SG::auxid_t id : m_auxids) {
591  if (id < m_vecs.size() && m_vecs[id] && !m_vecs[id]->isLinked() &&
592  m_vecs[id]->size() > 0)
593  {
594  return m_vecs[id]->size();
595  }
596  }
597  return 0;
598 }

◆ 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 439 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 436 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 442 of file AuxStoreInternal.h.

◆ m_mutex

mutex_t SG::AuxStoreInternal::m_mutex
mutableprivateinherited

Definition at line 447 of file AuxStoreInternal.h.

◆ m_standalone

bool SG::AuxStoreInternal::m_standalone
privateinherited

Are we being written in standalone mode?

Definition at line 429 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 433 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:221
beamspotman.r
def r
Definition: beamspotman.py:676
store
StoreGateSvc * store
Definition: fbtTestBasics.cxx:69
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:650
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:588
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:83
SG::AuxTypeRegistry::instance
static AuxTypeRegistry & instance()
Return the singleton registry instance.
Definition: AuxTypeRegistry.cxx:49
SG::AuxStoreInternal::m_auxids
SG::auxid_set_t m_auxids
Set of auxid's for which we've created a vector.
Definition: AuxStoreInternal.h:439
quiet
bool quiet
Definition: TrigGlobEffCorrValidation.cxx:190
SG::AuxStoreInternal::guard_t
AthContainers_detail::lock_guard< mutex_t > guard_t
Definition: AuxStoreInternal.h:446
SG::AuxStoreInternal::m_mutex
mutex_t m_mutex
Definition: AuxStoreInternal.h:447
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:277
SG::AuxStoreInternal::m_decorations
SG::auxid_set_t m_decorations
Record which variables are decorations.
Definition: AuxStoreInternal.h:436
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:442
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:384
SG::AuxTypeRegistry
Handle mappings between names and auxid_t.
Definition: AuxTypeRegistry.h:62
DiTauMassTools::ignore
void ignore(T &&)
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:54
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:433
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.
ret
T ret(T t)
Definition: rootspy.cxx:260
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:424
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:328
SG::AuxStoreInternal::setOption
virtual bool setOption(auxid_t id, const AuxDataOption &option) override
Set an option for an auxiliary data variable.
Definition: AuxStoreInternal.cxx:610
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:708
SG::AuxStoreInternal::size
virtual size_t size() const override
Return the number of elements in the store.
Definition: AuxStoreInternal.cxx:576
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:216
id
SG::auxid_t id
Definition: Control/AthContainers/Root/debug.cxx:191
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:18
python.PyAthena.v
v
Definition: PyAthena.py:157
SG::AuxStoreInternal::m_standalone
bool m_standalone
Are we being written in standalone mode?
Definition: AuxStoreInternal.h:429
InDetDD::other
@ other
Definition: InDetDD_Defs.h:16
SG::IAuxTypeVector::insertMove
virtual bool insertMove(size_t pos, void *beg, void *end, IAuxStore &srcStore)=0
Insert elements into the vector via move semantics.
SG::AuxStoreInternal::isDecoration
virtual bool isDecoration(auxid_t auxid) const override
Test if a particular variable is tagged as a decoration.
Definition: AuxStoreInternal.cxx:394
SG::IAuxTypeVector
Abstract interface for manipulating vectors of arbitrary types.
Definition: IAuxTypeVector.h:40
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::AuxStoreInternal::getDataInternal_noLock
virtual void * getDataInternal_noLock(SG::auxid_t auxid, size_t size, size_t capacity, bool no_lock_check)
Implementation of getDataInternal; no locking.
Definition: AuxStoreInternal.cxx:657
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.