25 :
m_data{mode, topStore} {}
31 return m_data.m_structMode;
36 m_data.m_structMode = mode;
71 if (
m_data.m_transientStore &&
72 (
m_data.m_transientStore->getAuxIDs().test(auxid))) {
73 return m_data.m_transientStore->getVector(auxid);
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())) {
90 if (this_nc->getEntryFor(auxid).isSuccess() ==
false) {
91 ::Error(
"xAOD::AuxStoreBase::getVector",
100 vec->resize (
vec->size());
117 std::size_t capacity) {
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])) {
133 m_data.m_vecs[auxid]->reserve(capacity);
135 return m_data.m_vecs[auxid]->toPtr();
140 if (
m_data.m_transientStore &&
141 m_data.m_transientStore->getAuxIDs().test(auxid)) {
142 return m_data.m_transientStore->getDecoration(auxid,
size, capacity);
146 if (
m_data.m_auxIDs.test(auxid)) {
155 if (!
m_data.m_transientStore) {
156 m_data.m_transientStore = std::make_unique<SG::AuxStoreInternal>(
159 m_data.m_transientStore->lock();
163 const std::size_t nids =
m_data.m_transientStore->getAuxIDs().size();
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);
170 std::atomic_thread_fence( std::memory_order_seq_cst );
171 m_data.m_auxIDs.insert(auxid);
180 if (
m_data.m_isDecoration.size() <= auxid) {
181 m_data.m_isDecoration.resize(auxid + 1);
183 m_data.m_isDecoration[auxid] =
true;
184 m_data.m_decorIDs.insert(auxid);
185 std::atomic_thread_fence( std::memory_order_seq_cst );
195 if (auxid <
m_data.m_isDecoration.size() &&
m_data.m_isDecoration[auxid]) {
198 if (
m_data.m_transientStore) {
199 return m_data.m_transientStore->isDecoration(auxid);
211 if (
m_data.m_transientStore) {
212 m_data.m_transientStore->lock();
222 bool anycleared =
false;
223 if (
m_data.m_transientStore) {
227 anycleared =
m_data.m_transientStore->clearDecorations();
231 old_id_set -=
m_data.m_transientStore->getAuxIDs();
233 m_data.m_auxIDs -= old_id_set;
234 m_data.m_decorIDs.clear();
247 if (
m_data.m_transientStore) {
248 m_data.m_transientStore->lockDecoration(auxid);
250 m_data.m_decorIDs.erase(auxid);
258 if (
id >=
m_data.m_vecs.size())
261 if (!
m_data.m_vecs[
id] ||
m_data.m_vecs[
id]->isLinked()) {
265 const std::size_t
size =
m_data.m_vecs[id]->size();
273 if (
m_data.m_transientStore) {
274 return m_data.m_transientStore->size();
285 if (linked_id <
m_data.m_vecs.size()) {
286 return m_data.m_vecs[linked_id].get();
288 if (
m_data.m_transientStore) {
290 ->linkedVector(auxid);
299 if (linked_id <
m_data.m_vecs.size()) {
300 return m_data.m_vecs[linked_id].get();
302 if (
m_data.m_transientStore) {
303 return m_data.m_transientStore->linkedVector(auxid);
309 std::size_t capacity) {
320 if (!
m_data.m_transientStore) {
321 m_data.m_transientStore = std::make_unique<SG::AuxStoreInternal>(
324 m_data.m_transientStore->lock();
328 std::size_t nids =
m_data.m_transientStore->getAuxIDs().size();
330 if (
result && (nids !=
m_data.m_transientStore->getAuxIDs().size())) {
331 m_data.m_auxIDs.insert(auxid);
340 if (!((auxid <
m_data.m_isDecoration.size()) &&
341 m_data.m_isDecoration[auxid])) {
348 ::Error(
"xAOD::AuxStoreBase::getData",
356 ::Error(
"xAOD::AuxStoreBase::getData",
358 ::Error(
"xAOD::AuxStoreBase::getData",
XAOD_MESSAGE(
" name = %s"),
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"));
368 m_data.m_vecs[auxid]->reserve(capacity);
372 return m_data.m_vecs[auxid]->toPtr();
387 ::Error(
"xAOD::AuxStoreBase::resize",
389 static_cast<int>(
size));
397 for (
auto& v :
m_data.m_vecs) {
398 if (v && !v->isLinked()) {
399 if (!v->resize(
size)) {
404 if (
m_data.m_transientStore) {
420 ::Error(
"xAOD::AuxStoreBase::reserve",
422 static_cast<int>(
size));
426 for (
auto& v :
m_data.m_vecs) {
427 if (v && !v->isLinked()) {
432 if (
m_data.m_transientStore) {
444 ::Error(
"xAOD::AuxStoreBase::shift",
445 XAOD_MESSAGE(
"Should not have been called for single-object "
451 if ((
static_cast<std::size_t
>(std::abs(offs)) >
m_data.m_size) &&
458 for (
auto& v :
m_data.m_vecs) {
459 if (v && !v->isLinked()) {
464 if (
m_data.m_transientStore) {
465 m_data.m_transientStore->shift(pos, offs);
476 ::Error(
"xAOD::AuxStoreBase::insertMove",
477 XAOD_MESSAGE(
"Should not have been called for single-object "
483 std::size_t other_size =
other.size();
489 if (
id <
m_data.m_vecs.size()) {
490 v_dst =
m_data.m_vecs[id].get();
494 if (
other.getData(
id)) {
495 void* src_ptr =
other.getData(
id, other_size, other_size);
502 const void* orig = v_dst->
toPtr();
503 v_dst->
shift(pos, other_size);
504 if (orig != v_dst->
toPtr()) {
511 if (
m_data.m_transientStore) {
512 if (!
m_data.m_transientStore->insertMove(pos,
other, ignore))
529 if (!this_nc->getEntryFor(auxid).isSuccess()) {
530 ::Error(
"xAOD::AuxStoreBase::getIOData",
539 if (
m_data.m_transientStore &&
540 m_data.m_transientStore->getAuxIDs().test(auxid)) {
541 return m_data.m_transientStore->getIOData(auxid);
545 if (!this_nc->setupInputData(auxid).isSuccess()) {
560 ::Fatal(
"xAOD::AuxStoreBase::getIOData",
566 if (!this_nc->getEntryFor(auxid).isSuccess()) {
567 ::Error(
"xAOD::AuxStoreBase::getIOData",
589 if (
m_data.m_transientStore &&
590 m_data.m_transientStore->getAuxIDs().test(auxid)) {
591 return m_data.m_transientStore->getIOType(auxid);
597 if (!this_nc->setupInputData(auxid).isSuccess()) {
598 ::Error(
"xAOD::AuxStoreBase::getIOType",
601 static_cast<int>(auxid),
608 ::Fatal(
"xAOD::AuxStoreBase::getIOType",
655 return m_selection.getSelectedAuxIDs(auxids).size();
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.
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.
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.
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.
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.