ATLAS Offline Software
AuxStoreInternal.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
12 #include <iostream>
13 #include <sstream>
14 #include <atomic>
15 
21 
22 
23 namespace SG {
24 
25 
31  : m_standalone (standalone),
32  m_locked (false)
33 {
34 }
35 
36 
43 {
44 }
45 
46 
51 {
52  guard_t guard (other.m_mutex);
53  m_standalone = other.m_standalone;
54  m_decorations = other.m_decorations;
55  m_auxids = other.m_auxids;
56  m_locked = other.m_locked;
57  size_t size = other.m_vecs.size();
58  m_vecs.resize (size);
59  for (size_t i = 0; i < size; i++) {
60  if (other.m_vecs[i])
61  m_vecs[i] = other.m_vecs[i]->clone();
62  }
63 }
64 
65 
70 {
71  return m_standalone;
72 }
73 
74 
85 const void* AuxStoreInternal::getData (auxid_t auxid) const
86 {
87  const IAuxTypeVector* v = getVector (auxid);
88  if (v) {
89  return v->toPtr();
90  }
91  return nullptr;
92 }
93 
94 
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 }
114 
115 
132 void* AuxStoreInternal::getData (auxid_t auxid, size_t size, size_t capacity)
133 {
134  return getDataInternal (auxid, size, capacity, false);
135 }
136 
137 
145 void
146 AuxStoreInternal::addVector (std::unique_ptr<IAuxTypeVector> vec,
147  bool isDecoration)
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 }
180 
181 
203 void*
204 AuxStoreInternal::getDecoration (auxid_t auxid, size_t size, size_t capacity)
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 }
237 
238 
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 }
268 
269 
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 }
288 
289 
312 void AuxStoreInternal::shift (size_t pos, ptrdiff_t offs)
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 }
322 
323 
344  IAuxStore& other,
345  const SG::auxid_set_t& ignore)
346 {
347  guard_t guard (m_mutex);
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 }
401 
402 
410 const SG::auxid_set_t&
412 {
413  return m_auxids;
414 }
415 
416 
420 const SG::auxid_set_t&
422 {
423  return m_decorations;
424 }
425 
426 
432 {
433  return m_decorations.test (auxid);
434 }
435 
436 
443 const SG::auxid_set_t&
445 {
446  return getAuxIDs();
447 }
448 
449 
461 const void* AuxStoreInternal::getIODataInternal (auxid_t auxid, bool quiet) const
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 }
481 
482 
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 }
514 
515 
526 const void* AuxStoreInternal::getIOData (auxid_t auxid) const
527 {
528  return getIODataInternal (auxid, false);
529 }
530 
531 
543 const std::type_info* AuxStoreInternal::getIOType (auxid_t auxid) const
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 }
557 
558 
562 const SG::auxid_set_t&
564 {
565  return getAuxIDs();
566 }
567 
568 
576 {
577  guard_t guard (m_mutex);
578  m_locked = true;
579 }
580 
581 
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 }
606 
607 
614 {
615  guard_t guard (m_mutex);
616  return size_noLock();
617 }
618 
619 
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 }
636 
637 
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 }
681 
682 
688 {
689  m_auxids.insert (auxid);
690 }
691 
692 
696  size_t size,
697  size_t capacity,
698  bool no_lock_check)
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);
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 }
727 
728 
747  size_t size,
748  size_t capacity,
749  bool no_lock_check)
750 {
751  guard_t guard (m_mutex);
752  return getVectorInternal_noLock (auxid, size, capacity, no_lock_check)->toPtr();
753 }
754 
755 
765 {
766  guard_t guard (m_mutex);
767  m_decorations.reset (auxid);
768 }
769 
770 
781 {
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 }
789 
790 
801 {
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 }
809 
810 
811 } // namespace SG
SG::AuxStoreInternal::reserve
virtual void reserve(size_t sz) override
Change the capacity of all aux data vectors.
Definition: AuxStoreInternal.cxx:278
SG::IAuxTypeVector::shift
virtual bool shift(size_t pos, ptrdiff_t offs)=0
Shift the elements of the vector.
SG::AuxStoreInternal::addVector
void addVector(std::unique_ptr< IAuxTypeVector > vec, bool isDecoration)
Explicitly add a vector to the store.
Definition: AuxStoreInternal.cxx:146
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: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
SG::AuxStoreInternal::getDecoration
virtual void * getDecoration(auxid_t auxid, size_t size, size_t capacity) override
Return the data vector for one aux data decoration item.
Definition: AuxStoreInternal.cxx:204
SG
Forward declaration.
Definition: CaloCellPacker_400_500.h:32
PowhegControl_ttHplus_NLO.ss
ss
Definition: PowhegControl_ttHplus_NLO.py:83
L1CaloPhase1Monitoring.standalone
standalone
Definition: L1CaloPhase1Monitoring.py:139
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::standalone
bool standalone() const
Return the standalone flag.
Definition: AuxStoreInternal.cxx:69
SG::ExcStoreLocked
Exception — Attempted to modify auxiliary data in a locked store.
Definition: Control/AthContainers/AthContainers/exceptions.h:183
exceptions.h
Exceptions that can be thrown from AthContainers.
SG::AuxStoreInternal::~AuxStoreInternal
virtual ~AuxStoreInternal()
Destructor.
Definition: AuxStoreInternal.cxx:42
SG::AuxStoreInternal::m_decorations
SG::auxid_set_t m_decorations
Record which variables are decorations.
Definition: AuxStoreInternal.h:451
PackedParameters.h
Describe how the contents of a PackedContainer are to be saved.
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::AuxStoreInternal
AuxStoreInternal(bool standalone=false)
Constructor.
Definition: AuxStoreInternal.cxx:30
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::getDynamicAuxIDs
virtual const SG::auxid_set_t & getDynamicAuxIDs() const override
Get the list of all variables that need to be handled.
Definition: AuxStoreInternal.cxx:563
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
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
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
lumiFormat.i
int i
Definition: lumiFormat.py:85
CxxUtils::ConcurrentBitset::insert
ConcurrentBitset & insert(bit_t bit, bit_t new_nbits=0)
Set a bit to 1.
SG::AuxStoreInternal::clearDecorations
virtual bool clearDecorations() override
Clear all decorations.
Definition: AuxStoreInternal.cxx:592
CxxUtils::ConcurrentBitset::reset
ConcurrentBitset & reset(bit_t bit)
Turn off one bit.
SG::AuxStoreInternal::lock
virtual void lock() override
Lock the container.
Definition: AuxStoreInternal.cxx:575
SG::AuxStoreInternal::lockDecoration
virtual void lockDecoration(SG::auxid_t auxid) override
Lock a decoration.
Definition: AuxStoreInternal.cxx:764
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
error.h
Helper for emitting error messages.
SG::AuxStoreInternal::shift
virtual void shift(size_t pos, ptrdiff_t offs) override
Shift the elements of the container.
Definition: AuxStoreInternal.cxx:312
SG::AuxStoreInternal::insertMove
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.
Definition: AuxStoreInternal.cxx:343
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::getIOType
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.
Definition: AuxStoreInternal.cxx:543
SG::AuxStoreInternal::size
virtual size_t size() const override
Return the number of elements in the store.
Definition: AuxStoreInternal.cxx:613
SG::AuxStoreInternal::linkedVector
virtual IAuxTypeVector * linkedVector(SG::auxid_t auxid) override
Return interface for a linked variable.
Definition: AuxStoreInternal.cxx:780
SG::AuxStoreInternal::getIOData
virtual const void * getIOData(SG::auxid_t auxid) const override
Return a pointer to the data to be stored for one aux data item.
Definition: AuxStoreInternal.cxx:526
SG::AuxDataOption
Hold information about an option setting request.
Definition: AuxDataOption.h:37
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
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
SG::IAuxStore
Interface for non-const operations on an auxiliary store.
Definition: IAuxStore.h:48
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:101
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
AuxTypeRegistry.h
Handle mappings between names and auxid_t.
SG::AuxStoreInternal::resize
virtual bool resize(size_t sz) override
Change the size of all aux data vectors.
Definition: AuxStoreInternal.cxx:254
SG::AuxStoreInternal::getDecorIDs
virtual const SG::auxid_set_t & getDecorIDs() const override
Return a set of identifiers for decorations in this store.
Definition: AuxStoreInternal.cxx:421
SG::auxid_set_t
A set of aux data identifiers.
Definition: AuxTypes.h:47
SG::AuxStoreInternal::getWritableAuxIDs
virtual const SG::auxid_set_t & getWritableAuxIDs() const override
Return a set of identifiers for writable data items in this store.
Definition: AuxStoreInternal.cxx:444
python.dummyaccess.exists
def exists(filename)
Definition: dummyaccess.py:9
CxxUtils::ConcurrentBitset::erase
ConcurrentBitset & erase(bit_t bit)
Turn off one bit.
AuxStoreInternal.h
An auxiliary data store that holds data internally.
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.