ATLAS Offline Software
Loading...
Searching...
No Matches
AuxStoreBase.cxx
Go to the documentation of this file.
1// Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2
3// Local include(s).
5
8
9// Framework include(s).
16
17// ROOT include(s):
18#include <TError.h>
19
20#include <atomic>
21
22namespace xAOD::details {
23
25 : m_data{mode, topStore} {}
26
28
30
31 return m_data.m_structMode;
32}
33
35
36 m_data.m_structMode = mode;
37 reset();
38}
39
40const std::string& AuxStoreBase::prefix() const {
41
42 return m_data.m_prefix;
43}
44
46
47 return m_data.m_topStore;
48}
49
50void AuxStoreBase::setTopStore(bool value) {
51
52 m_data.m_topStore = value;
53 reset();
54}
55
56const void* AuxStoreBase::getData(SG::auxid_t auxid) const {
57
58 const SG::IAuxTypeVector* v = getVector(auxid);
59 if (v) {
60 return v->toPtr();
61 }
62 return nullptr;
63}
64
66
67 // Guard against multi-threaded execution:
68 guard_t guard(m_mutex1);
69
70 // Check if the transient store already handles this variable:
71 if (m_data.m_transientStore &&
72 (m_data.m_transientStore->getAuxIDs().test(auxid))) {
73 return m_data.m_transientStore->getVector(auxid);
74 }
75
76 // Access the object through a non-const pointer. This is "safe" because
77 // of the mutex lock above.
78 auto this_nc ATLAS_THREAD_SAFE = const_cast<AuxStoreBase*>(this);
79
80 // Connect this auxiliary variable both to the input and output
81 // if needed:
82 if ((auxid >= m_data.m_vecs.size()) || (!m_data.m_vecs[auxid])) {
83 if ((!this_nc->setupInputData(auxid).isSuccess()) ||
84 (!this_nc->setupOutputData(auxid).isSuccess())) {
85 return nullptr;
86 }
87 }
88
89 // Make sure the variable is up to date:
90 if (this_nc->getEntryFor(auxid).isSuccess() == false) {
91 ::Error("xAOD::AuxStoreBase::getVector",
92 XAOD_MESSAGE("Couldn't read in variable %s"),
93 SG::AuxTypeRegistry::instance().getName(auxid).c_str());
94 return nullptr;
95 }
96
97 // Let the AuxTypeVector object know that the std::vector that it manages
98 // has changed. (This updates the cached span.)
99 SG::IAuxTypeVector* vec = m_data.m_vecs[auxid].get();
100 vec->resize (vec->size());
101
102 // Return the pointer to the object:
103 return vec;
104}
105
107
108 return m_data.m_auxIDs;
109}
110
112
113 return m_data.m_decorIDs;
114}
115
117 std::size_t capacity) {
118
119 // Guard against multi-threaded execution:
120 guard_t guard(m_mutex1);
121
122 // Remember the requested size:
123 m_data.m_size = size;
124
125 // If this is a locked object, deal with it correctly:
126 if (m_locked) {
127 // If the variable exists already and it's a decoration, then let's
128 // give it back.
129 if ((auxid < m_data.m_vecs.size()) && m_data.m_vecs[auxid] &&
130 (auxid < m_data.m_isDecoration.size() &&
131 m_data.m_isDecoration[auxid])) {
132 // Things look okay...
133 m_data.m_vecs[auxid]->reserve(capacity);
134 m_data.m_vecs[auxid]->resize(size);
135 return m_data.m_vecs[auxid]->toPtr();
136 }
137 // If it's in the transient store already, return it from there.
138 // Since in a locked store *everything* is a decoration in the
139 // transient store.
140 if (m_data.m_transientStore &&
141 m_data.m_transientStore->getAuxIDs().test(auxid)) {
142 return m_data.m_transientStore->getDecoration(auxid, size, capacity);
143 }
144 // If we know this auxiliary ID, but it was not found as a decoration
145 // by the previous checks, then we're in trouble.
146 if (m_data.m_auxIDs.test(auxid)) {
147 throw SG::ExcStoreLocked(auxid);
148 }
149 }
150
151 // Check if we want to write this variable to the output:
152 if (!(isAuxIDSelected(auxid) && hasOutput())) {
153
154 // Create the store only when necessary:
155 if (!m_data.m_transientStore) {
156 m_data.m_transientStore = std::make_unique<SG::AuxStoreInternal>(
157 m_data.m_structMode == EStructMode::kObjectStore);
158 if (m_locked) {
159 m_data.m_transientStore->lock();
160 }
161 }
162 // Let the transient store create the decoration:
163 const std::size_t nids = m_data.m_transientStore->getAuxIDs().size();
164 void* result =
165 m_data.m_transientStore->getDecoration(auxid, size, capacity);
166 if (result && (nids != m_data.m_transientStore->getAuxIDs().size())) {
167 if (m_data.m_transientStore->isDecoration(auxid)) {
168 m_data.m_decorIDs.insert(auxid);
169 }
170 std::atomic_thread_fence( std::memory_order_seq_cst );
171 m_data.m_auxIDs.insert(auxid);
172 }
173 // Return the memory address from the transient store:
174 return result;
175 }
176
177 // Doesn't exist yet. So let's make it:
178 if (m_locked) {
179 // If the container is locked, remember that this is a decoration:
180 if (m_data.m_isDecoration.size() <= auxid) {
181 m_data.m_isDecoration.resize(auxid + 1);
182 }
183 m_data.m_isDecoration[auxid] = true;
184 m_data.m_decorIDs.insert(auxid);
185 std::atomic_thread_fence( std::memory_order_seq_cst );
186 }
187 void* result = getData(auxid, size, capacity);
188
189 // Return the pointer made by getData(...):
190 return result;
191}
192
194 if (m_locked) {
195 if (auxid < m_data.m_isDecoration.size() && m_data.m_isDecoration[auxid]) {
196 return true;
197 }
198 if (m_data.m_transientStore) {
199 return m_data.m_transientStore->isDecoration(auxid);
200 }
201 }
202 return false;
203}
204
206
207 // Guard against multi-threaded execution:
208 guard_t guard(m_mutex1);
209
210 m_locked = true;
211 if (m_data.m_transientStore) {
212 m_data.m_transientStore->lock();
213 }
214}
215
217
218 // Guard against multi-threaded execution:
219 guard_t guard(m_mutex1);
220
221 // Clear the transient decorations:
222 bool anycleared = false;
223 if (m_data.m_transientStore) {
224 SG::auxid_set_t old_id_set = m_data.m_transientStore->getAuxIDs();
225
226 // Clear the decorations from the transient store:
227 anycleared = m_data.m_transientStore->clearDecorations();
228
229 // Now remove ids that were cleared.
230 if (anycleared) {
231 old_id_set -= m_data.m_transientStore->getAuxIDs();
232 // old_id_set is now the set of ids that were cleared.
233 m_data.m_auxIDs -= old_id_set;
234 m_data.m_decorIDs.clear();
235 }
236 }
237
238 // The decorations which are going into the output file, are here to stay.
239 // Removing their IDs from the internal set would just cause more problems
240 // in my mind than just leaving them be.
241
242 return anycleared;
243}
244
247 if (m_data.m_transientStore) {
248 m_data.m_transientStore->lockDecoration(auxid);
249 }
250 m_data.m_decorIDs.erase(auxid);
251}
252
253std::size_t AuxStoreBase::size() const {
254
255 // First, try to find a managed vector in the store:
256 for (SG::auxid_t id : m_data.m_auxIDs) {
257 // Make sure that we are still within the bounds of our vector:
258 if (id >= m_data.m_vecs.size())
259 break;
260 // Skip non-existent or linked objects:
261 if (!m_data.m_vecs[id] || m_data.m_vecs[id]->isLinked()) {
262 continue;
263 }
264 // Ask the vector for its size:
265 const std::size_t size = m_data.m_vecs[id]->size();
266 // Only accept a non-zero size. Not sure why...
267 if (size > 0) {
268 return size;
269 }
270 }
271
272 // Check if we have a transient store, and get the size from that:
273 if (m_data.m_transientStore) {
274 return m_data.m_transientStore->size();
275 }
276
277 // Apparently the store is empty:
278 return 0;
279}
280
283 SG::auxid_t linked_id = r.linkedVariable(auxid);
284 guard_t guard(m_mutex1);
285 if (linked_id < m_data.m_vecs.size()) {
286 return m_data.m_vecs[linked_id].get();
287 }
288 if (m_data.m_transientStore) {
289 return CxxUtils::as_const_ptr(m_data.m_transientStore.get())
290 ->linkedVector(auxid);
291 }
292 return nullptr;
293}
294
297 SG::auxid_t linked_id = r.linkedVariable(auxid);
298 guard_t guard(m_mutex1);
299 if (linked_id < m_data.m_vecs.size()) {
300 return m_data.m_vecs[linked_id].get();
301 }
302 if (m_data.m_transientStore) {
303 return m_data.m_transientStore->linkedVector(auxid);
304 }
305 return nullptr;
306}
307
308void* AuxStoreBase::getData(SG::auxid_t auxid, std::size_t size,
309 std::size_t capacity) {
310
311 // Guard against multi-threaded execution:
312 guard_t guard(m_mutex2);
313
314 // Remember the size:
315 m_data.m_size = size;
316
317 // Check if we want to write this variable to the output:
318 if (!(isAuxIDSelected(auxid) && hasOutput())) {
319 // Create the store only when necessary:
320 if (!m_data.m_transientStore) {
321 m_data.m_transientStore = std::make_unique<SG::AuxStoreInternal>(
322 m_data.m_structMode == EStructMode::kObjectStore);
323 if (m_locked) {
324 m_data.m_transientStore->lock();
325 }
326 }
327 // Let the transient store create the variable:
328 std::size_t nids = m_data.m_transientStore->getAuxIDs().size();
329 void* result = m_data.m_transientStore->getData(auxid, size, capacity);
330 if (result && (nids != m_data.m_transientStore->getAuxIDs().size())) {
331 m_data.m_auxIDs.insert(auxid);
332 }
333 // Return the address in the transient memory:
334 return result;
335 }
336
337 // If the variable exists already, and this is a locked store, then
338 // we are in trouble.
339 if (m_locked && (auxid < m_data.m_vecs.size()) && m_data.m_vecs[auxid]) {
340 if (!((auxid < m_data.m_isDecoration.size()) &&
341 m_data.m_isDecoration[auxid])) {
342 throw SG::ExcStoreLocked(auxid);
343 }
344 }
345
346 // Connect this auxiliary variable just to the output:
347 if (setupOutputData(auxid).isFailure()) {
348 ::Error("xAOD::AuxStoreBase::getData",
349 XAOD_MESSAGE("Failed to set up variable %s"),
350 SG::AuxTypeRegistry::instance().getName(auxid).c_str());
351 return nullptr;
352 }
353
354 // Check whether things make sense:
355 if ((m_data.m_structMode == EStructMode::kObjectStore) && (size != 1)) {
356 ::Error("xAOD::AuxStoreBase::getData",
357 XAOD_MESSAGE("Branch creation requested with:"));
358 ::Error("xAOD::AuxStoreBase::getData", XAOD_MESSAGE(" name = %s"),
359 SG::AuxTypeRegistry::instance().getName(auxid).c_str());
360 ::Error("xAOD::AuxStoreBase::getData", XAOD_MESSAGE(" size = %i"),
361 static_cast<int>(size));
362 ::Error("xAOD::AuxStoreBase::getData",
363 XAOD_MESSAGE(" m_structMode = EStructMode::kObjectStore"));
364 return nullptr;
365 }
366
367 // Make sure the variable is of the right size:
368 m_data.m_vecs[auxid]->reserve(capacity);
369 m_data.m_vecs[auxid]->resize(size);
370
371 // Return the object:
372 return m_data.m_vecs[auxid]->toPtr();
373}
374
376
377 return getAuxIDs();
378}
379
380bool AuxStoreBase::resize(std::size_t size) {
381
382 // Guard against multi-threaded execution:
383 guard_t guard(m_mutex1);
384
385 // A sanity check:
386 if ((m_data.m_structMode == EStructMode::kObjectStore) && (size != 1)) {
387 ::Error("xAOD::AuxStoreBase::resize",
388 XAOD_MESSAGE("size = %i for single-object store"),
389 static_cast<int>(size));
390 return false;
391 }
392
393 // Remember the new size:
394 m_data.m_size = size;
395
396 bool nomoves = true;
397 for (auto& v : m_data.m_vecs) {
398 if (v && !v->isLinked()) {
399 if (!v->resize(size)) {
400 nomoves = false;
401 }
402 }
403 }
404 if (m_data.m_transientStore) {
405 if (!m_data.m_transientStore->resize(size)) {
406 nomoves = false;
407 }
408 }
409
410 return nomoves;
411}
412
413void AuxStoreBase::reserve(std::size_t size) {
414
415 // Guard against multi-threaded execution:
416 guard_t guard(m_mutex1);
417
418 // A sanity check:
419 if ((m_data.m_structMode == EStructMode::kObjectStore) && (size != 1)) {
420 ::Error("xAOD::AuxStoreBase::reserve",
421 XAOD_MESSAGE("size = %i for single-object store"),
422 static_cast<int>(size));
423 return;
424 }
425
426 for (auto& v : m_data.m_vecs) {
427 if (v && !v->isLinked()) {
428 v->reserve(size);
429 }
430 }
431
432 if (m_data.m_transientStore) {
433 m_data.m_transientStore->reserve(size);
434 }
435}
436
437void AuxStoreBase::shift(std::size_t pos, std::ptrdiff_t offs) {
438
439 // Guard against multi-threaded execution:
440 guard_t guard(m_mutex1);
441
442 // A sanity check:
443 if (m_data.m_structMode == EStructMode::kObjectStore) {
444 ::Error("xAOD::AuxStoreBase::shift",
445 XAOD_MESSAGE("Should not have been called for single-object "
446 "store"));
447 return;
448 }
449
450 // Adjust the size of the container:
451 if ((static_cast<std::size_t>(std::abs(offs)) > m_data.m_size) &&
452 (offs < 0)) {
453 m_data.m_size = 0;
454 } else {
455 m_data.m_size += offs;
456 }
457
458 for (auto& v : m_data.m_vecs) {
459 if (v && !v->isLinked()) {
460 v->shift(pos, offs);
461 }
462 }
463
464 if (m_data.m_transientStore) {
465 m_data.m_transientStore->shift(pos, offs);
466 }
467}
468
470 const SG::auxid_set_t& ignore_in) {
471 // Guard against multi-threaded execution:
472 guard_t guard(m_mutex1);
473
474 // A sanity check:
475 if (m_data.m_structMode == EStructMode::kObjectStore) {
476 ::Error("xAOD::AuxStoreBase::insertMove",
477 XAOD_MESSAGE("Should not have been called for single-object "
478 "store"));
479 return false;
480 }
481
482 bool nomove = true;
483 std::size_t other_size = other.size();
484
485 SG::auxid_set_t ignore = ignore_in;
486
487 for (SG::auxid_t id : m_data.m_auxIDs) {
488 SG::IAuxTypeVector* v_dst = nullptr;
489 if (id < m_data.m_vecs.size()) {
490 v_dst = m_data.m_vecs[id].get();
491 }
492 if (v_dst && !v_dst->isLinked()) {
493 ignore.insert(id);
494 if (other.getData(id)) {
495 void* src_ptr = other.getData(id, other_size, other_size);
496 if (src_ptr) {
497 if (!v_dst->insertMove(pos, src_ptr, 0, other_size, other)) {
498 nomove = false;
499 }
500 }
501 } else {
502 const void* orig = v_dst->toPtr();
503 v_dst->shift(pos, other_size);
504 if (orig != v_dst->toPtr()) {
505 nomove = false;
506 }
507 }
508 }
509 }
510
511 if (m_data.m_transientStore) {
512 if (!m_data.m_transientStore->insertMove(pos, other, ignore))
513 nomove = false;
514 }
515
516 return nomove;
517}
518
519const void* AuxStoreBase::getIOData(SG::auxid_t auxid) const {
520
521 // Guard against multi-threaded execution:
522 guard_t guard(m_mutex1);
523
524 auto this_nc ATLAS_THREAD_SAFE =
525 const_cast<AuxStoreBase*>(this); // locked above
526
527 // If the variable is coming from the input, and is connected to already.
528 if (hasEntryFor(auxid)) {
529 if (!this_nc->getEntryFor(auxid).isSuccess()) {
530 ::Error("xAOD::AuxStoreBase::getIOData",
531 XAOD_MESSAGE("Couldn't read in variable %s"),
532 SG::AuxTypeRegistry::instance().getName(auxid).c_str());
533 return nullptr;
534 }
535 return getInputObject(auxid);
536 }
537
538 // Check if it's in the transient store:
539 if (m_data.m_transientStore &&
540 m_data.m_transientStore->getAuxIDs().test(auxid)) {
541 return m_data.m_transientStore->getIOData(auxid);
542 }
543
544 // If not, try connecting to it now:
545 if (!this_nc->setupInputData(auxid).isSuccess()) {
546 // This is not actually an error condition anymore. We can end up here
547 // when we decorate constant objects coming from the input file, but
548 // on one event we can't set any decorations. For instance when the
549 // input container is empty. In that case the object will still list
550 // the auxiliary ID belonging to that decoration as being available,
551 // but it really isn't.
552 //
553 // Later on it might be needed to tweak the logic of all of this, but
554 // for now just silently returning 0 seems to do the right thing.
555 return nullptr;
556 }
557
558 // Now we should know this variable:
559 if (!hasEntryFor(auxid)) {
560 ::Fatal("xAOD::AuxStoreBase::getIOData",
561 XAOD_MESSAGE("Internal logic error detected"));
562 return nullptr;
563 }
564
565 // Make sure that the right payload is in memory:
566 if (!this_nc->getEntryFor(auxid).isSuccess()) {
567 ::Error("xAOD::AuxStoreBase::getIOData",
568 XAOD_MESSAGE("Couldn't read in variable %s"),
569 SG::AuxTypeRegistry::instance().getName(auxid).c_str());
570 return nullptr;
571 }
572
573 // Return the pointer.
574 return getInputObject(auxid);
575}
576
578const std::type_info* AuxStoreBase::getIOType(SG::auxid_t auxid) const {
579
580 // Guard against multi-threaded execution:
581 guard_t guard(m_mutex1);
582
583 // If the variable is connected to already:
584 if (hasEntryFor(auxid)) {
585 return getInputType(auxid);
586 }
587
588 // Check if it's in the transient store:
589 if (m_data.m_transientStore &&
590 m_data.m_transientStore->getAuxIDs().test(auxid)) {
591 return m_data.m_transientStore->getIOType(auxid);
592 }
593
594 // If not, try connecting to it now:
595 auto this_nc ATLAS_THREAD_SAFE =
596 const_cast<AuxStoreBase*>(this); // locked above
597 if (!this_nc->setupInputData(auxid).isSuccess()) {
598 ::Error("xAOD::AuxStoreBase::getIOType",
599 XAOD_MESSAGE("Couldn't connect to auxiliary variable "
600 "%i %s"),
601 static_cast<int>(auxid),
602 SG::AuxTypeRegistry::instance().getName(auxid).c_str());
603 return nullptr;
604 }
605
606 // Now we should know this variable:
607 if (!hasEntryFor(auxid)) {
608 ::Fatal("xAOD::AuxStoreBase::getIOType",
609 XAOD_MESSAGE("Internal logic error detected"));
610 return nullptr;
611 }
612
613 // Return the type info:
614 return getInputType(auxid);
615}
616
618
619 // All the auxiliary decorations handled by this object are considered
620 // dynamic:
621 return getAuxIDs();
622}
623
625void AuxStoreBase::selectAux(const std::set<std::string>& attributes) {
626
627 guard_t guard(m_mutex1);
628 m_selection.selectAux(attributes);
629}
630
633
634 // Guard against multi-threaded execution:
635 guard_t guard(m_mutex1);
636 // Leave the calculation up to the internal object:
637 return m_selection.getSelectedAuxIDs(m_data.m_auxIDs);
638}
639
649
650 // A temporary object:
651 SG::auxid_set_t auxids;
652 auxids.insert(auxid);
653
654 // Check if the auxid is returned as a selected ID:
655 return m_selection.getSelectedAuxIDs(auxids).size();
656}
657
658} // namespace xAOD::details
An auxiliary data store that holds data internally.
Handle mappings between names and auxid_t.
std::vector< size_t > vec
Exceptions that can be thrown from AthContainers.
#define XAOD_MESSAGE(MESSAGE)
Simple macro for printing error/verbose messages.
Abstract interface for manipulating vectors of arbitrary types.
Helper for getting a const version of a pointer.
Define macros for attributes used to control the static checker.
#define ATLAS_THREAD_SAFE
ConcurrentBitset & insert(bit_t bit, bit_t new_nbits=0)
Set a bit to 1.
Handle mappings between names and auxid_t.
static AuxTypeRegistry & instance()
Return the singleton registry instance.
Exception — Attempted to modify auxiliary data in a locked store.
Interface for non-const operations on an auxiliary store.
Definition IAuxStore.h:48
Abstract interface for manipulating vectors of arbitrary types.
bool isLinked() const
Return true if this variable is linked from another one.
virtual void * toPtr()=0
Return a pointer to the start of the vector's data.
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.
virtual bool shift(size_t pos, ptrdiff_t offs)=0
Shift the elements of the vector.
A set of aux data identifiers.
Definition AuxTypes.h:47
virtual ~AuxStoreBase()
Destructor.
virtual const SG::auxid_set_t & getWritableAuxIDs() const override
Return a set of writable data identifiers.
virtual void reset()=0
Reset all (transient) information in the object.
virtual void shift(std::size_t pos, std::ptrdiff_t offs) override
Shift the contents of the stored arrays.
virtual const SG::IAuxTypeVector * getVector(SG::auxid_t auxid) const override
Return vector interface for one aux data item.
mutex_t m_mutex1
Mutex objects used for multithreaded synchronisation.
virtual void lockDecoration(SG::auxid_t auxid) override
Lock a decoration.
virtual const void * getIOData(SG::auxid_t auxid) const override
Get a pointer to the data being stored for one aux data item.
virtual StatusCode setupOutputData(SG::auxid_t auxid)=0
Connect a variable to the output.
virtual const void * getData(SG::auxid_t auxid) const override
Get a pointer to a given array.
AuxSelection m_selection
Object helping to select which auxiliary variables to write.
const std::string & prefix() const
Get the currently configured object name prefix.
void setTopStore(bool value=true)
Set whether the object should behave as a "top store" or not.
virtual bool hasOutput() const =0
Check if an output is being written by the object.
bool isAuxIDSelected(SG::auxid_t auxid) const
Check if an auxiliary variable is selected for ouput writing.
void setStructMode(EStructMode mode)
Set the structure mode of the object to a new value.
virtual const SG::auxid_set_t & getDecorIDs() const override
Get the types(names) of decorations handled by this container.
bool isTopStore() const
Check if the object is a "top store", or not.
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.
virtual bool insertMove(std::size_t pos, SG::IAuxStore &other, const SG::auxid_set_t &ignore) override
Insert contents of another store via move.
virtual SG::auxid_set_t getSelectedAuxIDs() const override
Get the IDs of the selected aux variables.
virtual const std::type_info * getInputType(SG::auxid_t auxid) const =0
Get the type of an input object, for getIOType()
virtual bool clearDecorations() override
Remove the decorations added so far.
EStructMode
"Structural" modes of the object
@ kObjectStore
The object describes a single object.
virtual bool hasEntryFor(SG::auxid_t auxid) const =0
Check if a given variable is available from the input.
bool m_locked
Is this container locked?
virtual void reserve(std::size_t size) override
Reserve a given size for the arrays.
virtual bool isDecoration(SG::auxid_t auxid) const override
Test if a variable is a decoration.
virtual const SG::auxid_set_t & getDynamicAuxIDs() const override
Get the types(names) of variables created dynamically.
virtual const SG::auxid_set_t & getAuxIDs() const override
Get the types(names) of variables handled by this container.
AuxStoreBase(bool topStore=true, EStructMode mode=EStructMode::kUndefinedStore)
Constructor.
virtual const SG::IAuxTypeVector * linkedVector(SG::auxid_t auxid) const override
Return (const) interface for a linked variable.
virtual void * getDecoration(SG::auxid_t auxid, std::size_t size, std::size_t capacity) override
Get a pointer to a given array, creating the array if necessary.
EStructMode structMode() const
Get what structure mode the object was constructed with.
Members m_data
Member variables of the base class.
AthContainers_detail::lock_guard< mutex_t > guard_t
Guard type for multithreaded synchronisation.
virtual bool resize(std::size_t size) override
Resize the arrays to a given size.
virtual std::size_t size() const override
Return the number of elements in the store.
virtual const void * getInputObject(SG::auxid_t auxid) const =0
Get a pointer to an input object, as it is in memory, for getIOData()
virtual void selectAux(const std::set< std::string > &attributes)
Select dynamic auxiliary attributes for writing.
virtual void lock() override
Lock the object, and don't let decorations be added.
int r
Definition globals.cxx:22
const T * as_const_ptr(const T *p)
Helper for getting a const version of a pointer.
size_t auxid_t
Identifier for a particular aux data item.
Definition AuxTypes.h:27