ATLAS Offline Software
Loading...
Searching...
No Matches
AuxContainerBase.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5
6
7// EDM include(s):
11
12// Local include(s):
16
17#ifndef XAOD_STANDALONE
18# include "GaudiKernel/ThreadLocalContext.h"
20#endif // not XAOD_STANDALONE
21
24
25// System include(s):
26#include <iostream> //std::cout
27#include <memory_resource>
28
29using namespace std;
30
31namespace xAOD {
32
33 AuxContainerBase::AuxContainerBase( bool allowDynamicVars )
34 : AuxContainerBase( nullptr, allowDynamicVars ) {
35 }
36
38 bool allowDynamicVars )
39 : SG::IAuxStore(),
40 m_auxids(), m_vecs(), m_store( nullptr ), m_storeIO( nullptr ),
41 m_ownsStore( true ),
42 m_locked( false ),
43 m_name( "UNKNOWN" ),
44 m_memResource( memResource ){
45
46 if( allowDynamicVars ) {
48 m_storeIO = dynamic_cast< SG::IAuxStoreIO* >( m_store );
49 }
50 }
51
61 : SG::IAuxStore(),
62 m_auxids(), m_vecs(), m_store( nullptr ), m_storeIO( nullptr ),
63 m_ownsStore( true ),
64 m_locked( false ),
65 m_memResource( parent.m_memResource )
66 {
67 // Keep the source unmutable during copy
68 guard_t guard( parent.m_mutex );
69 m_name = parent.m_name;
70
71 // Unfortunately the dynamic variables can not be copied this easily...
72 if( parent.m_store ) {
73 m_ownsStore = false;
74 // cppcheck-suppress copyCtorPointerCopying
75 m_store = parent.m_store;
76 m_storeIO = dynamic_cast< SG::IAuxStoreIO* >( m_store );
77 m_auxids = m_store->getAuxIDs();
78 }
79 }
80
87 std::pmr::memory_resource* memResource )
88 : SG::IAuxStore(),
89 m_auxids(), m_vecs(),
90 m_store( store ),
91 m_storeIO( nullptr ), m_ownsStore( false ),
92 m_locked( false),
93 m_name( "UNKNOWN" ),
94 m_memResource( memResource ){
95
96 m_storeIO = dynamic_cast< SG::IAuxStoreIO* >( m_store );
97 if( m_store ) {
98 m_auxids = m_store->getAuxIDs();
99 }
100 }
101
103
104 std::vector< SG::IAuxTypeVector* >::iterator itr = m_vecs.begin();
105 std::vector< SG::IAuxTypeVector* >::iterator end = m_vecs.end();
106 for( ; itr != end; ++itr ) {
107 if( ! *itr ) continue;
108 delete *itr;
109 }
110
111 if( m_store && m_ownsStore ) delete m_store;
112 }
113
122
123 // Protect against self-assignment:
124 if( this == &rhs ) return *this;
125
126 // Keep the objects locked during copy
127 std::scoped_lock lck{m_mutex, rhs.m_mutex};
128
129 // Clean up after the old dynamic store:
130 if( m_store && m_ownsStore ) {
131 m_auxids -= m_store->getAuxIDs();
132 delete m_store;
133 }
134 m_store = nullptr;
135 m_storeIO = nullptr;
136 m_ownsStore = true;
137
138 // Take posession of the new dynamic store:
139 if( rhs.m_store ) {
140 m_store = rhs.m_store;
141 m_ownsStore = false;
142 m_storeIO = dynamic_cast< SG::IAuxStoreIO* >( m_store );
143 m_auxids.insert (m_store->getAuxIDs());
144 }
145
146 m_name = rhs.m_name;
147
148 return *this;
149 }
150
152 //
153 // Implementation of the SG::IAuxStoreHolder functions
154 //
155
160
161 std::pmr::memory_resource* AuxContainerBase::memResource()
162 {
163 const std::pmr::memory_resource* cptr = m_memResource.get();
164 std::pmr::memory_resource* ptr ATLAS_THREAD_SAFE = const_cast<std::pmr::memory_resource*>( cptr );
165 if( !ptr ) {
166#ifndef XAOD_STANDALONE
167 const EventContext& ctx = Gaudi::Hive::currentContext();
168 if( Atlas::hasExtendedEventContext( ctx ) ) {
169 ptr = Atlas::getExtendedEventContext( ctx ).memResource();
170 }
171 if( !ptr )
172#endif
173 {
174 ptr = std::pmr::get_default_resource();
175 }
176 if( ptr ) {
177 m_memResource.set( ptr );
178 }
179 }
180 return ptr;
181 }
182
184 {
185 return m_store;
186 }
187
198
199 // Guard against multi-threaded execution:
200 guard_t guard( m_mutex );
201
202 // Check that no funny business is going on:
203 if( m_store == store ) return;
204
205 // Clean up the current store object:
206 if( m_store && m_ownsStore ) {
207 m_auxids -= m_store->getAuxIDs();
208 delete m_store;
209 }
210 m_store = nullptr;
211 m_storeIO = nullptr;
212
213 // Take posession of the new object:
214 m_store = store;
215 m_storeIO = dynamic_cast< SG::IAuxStoreIO* >( m_store );
216 m_ownsStore = true;
217 if( m_store ) {
218 m_auxids.insert (m_store->getAuxIDs());
219 }
220
221 return;
222 }
223
224 //
226
228 //
229 // Implementation of the SG::IConstAuxStore functions
230 //
231
232 const void* AuxContainerBase::getData( auxid_t auxid ) const {
233
234 const SG::IAuxTypeVector* v = getVector( auxid );
235 if( v ) {
236 return v->toPtr();
237 }
238 return nullptr;
239 }
240
242
243 // Guard against multi-threaded execution:
244 guard_t guard( m_mutex );
245
246 if( ( auxid >= m_vecs.size() ) || ( ! m_vecs[ auxid ] ) ) {
247 if( m_store ) {
248 const SG::IAuxTypeVector* result = m_store->getVector( auxid );
249 if( result ) {
250 auxid_set_t& auxids_nc ATLAS_THREAD_SAFE =
251 const_cast<auxid_set_t&> (m_auxids);
252 auxids_nc.insert( auxid );
254 auxid_t linked_id = r.linkedVariable( auxid );
255 if (linked_id != SG::null_auxid) {
256 auxids_nc.insert( linked_id );
257 }
258 }
259 return result;
260 } else {
261 std::cout << "ERROR xAOD::AuxContainerBase::getData "
262 << "Unknown variable ("
264 << ") requested" << std::endl;
265 return nullptr;
266 }
267 }
268
269 // Update the statistics for this variable. The dynamic store registers
270 // its own variable accesses.
272
273 return m_vecs[ auxid ];
274 }
275
278
279 // Return the full list of IDs:
280 return getWritableAuxIDs();
281 }
282
285
286 if( m_store ) {
287 return m_store->getDecorIDs();
288 }
289 static const auxid_set_t empty;
290 return empty;
291 }
292
294 {
295 return SG::getCopyIDs (getAuxIDs(), getDecorIDs(), warnUnlocked, {});
296 }
297
299 {
300 guard_t guard( m_mutex );
301 if (m_store) {
302 return m_store->isDecoration (auxid);
303 }
304 return false;
305 }
306
308 size_t capacity ) {
309 {
310 // Guard against multi-threaded execution:
311 guard_t guard( m_mutex );
312
313 // Check if we have it as a static variable:
314 if( ( auxid >= m_vecs.size() ) || ( ! m_vecs[ auxid ] ) ) {
315 // If not, but we have a dynamic store, push it in there:
316 if( m_store ) {
317 void* result = m_store->getDecoration( auxid, size, capacity );
318 if( result ) {
319 m_auxids.insert( auxid );
321 auxid_t linked_id = r.linkedVariable( auxid );
322 if (linked_id != SG::null_auxid) {
323 m_auxids.insert( linked_id );
324 }
325 }
326 return result;
327 }
328 // If we don't have a dynamic store, complain:
329 else {
330 std::cout << "ERROR xAOD::AuxContainerBase::getDecoration "
331 << "Can't provide variable "
333 << std::endl;
334 return nullptr;
335 }
336 }
337
338 // If the container is locked, static variables can't be accessed this
339 // way:
340 if( m_locked ) {
341 throw SG::ExcStoreLocked( auxid );
342 }
343 }
344
345 // If the container is not locked, then fall back on the normal accessor
346 // function:
347 return getData( auxid, size, capacity );
348 }
349
351
352 // Guard against multi-threaded execution:
353 guard_t guard( m_mutex );
354
355 // Lock the object and its dynamic store:
356 m_locked = true;
357 if( m_store ) {
358 m_store->lock();
359 }
360
361 return;
362 }
363
365
366 // Guard against multi-threaded execution:
367 guard_t guard( m_mutex );
368
369 // Clear the decorations from the dynamic store:
370 bool anycleared = false;
371 if( m_store ) {
372 anycleared = m_store->clearDecorations();
373 }
374 // Early exit if there were no decorations.
375 if (!anycleared) return false;
376
377 // Construct the list of managed auxiliary variables from scratch after
378 // the cleanup:
379 auxid_set_t ids;
380 for( auxid_t auxid = 0; auxid < m_vecs.size(); ++auxid ) {
381 if( m_vecs[ auxid ] ) {
382 ids.insert( auxid );
383 }
384 }
385 if( m_store ) {
386 ids.insert (m_store->getAuxIDs());
387 }
388 m_auxids = std::move(ids);
389
390 return true;
391 }
392
395 {
396 guard_t guard (m_mutex);
397 if (m_store) {
398 m_store->lockDecoration (auxid);
399 }
400 }
401
402
404 {
406 auxid_t linked_id = r.linkedVariable( auxid );
407 if (linked_id != SG::null_auxid) {
408 guard_t guard( m_mutex );
409 if (linked_id < m_vecs.size() && m_vecs[ linked_id ]) {
410 return m_vecs[ linked_id ];
411 }
412 if (m_store) {
413 return CxxUtils::as_const_ptr(m_store)->linkedVector( auxid );
414 }
415 }
416 return nullptr;
417 }
418
419
421 {
423 auxid_t linked_id = r.linkedVariable( auxid );
424 if (linked_id != SG::null_auxid) {
425 guard_t guard( m_mutex );
426 if (linked_id < m_vecs.size() && m_vecs[ linked_id ]) {
427 return m_vecs[ linked_id ];
428 }
429 if (m_store) {
430 return m_store->linkedVector( auxid );
431 }
432 }
433 return nullptr;
434 }
435
436
437 void AuxContainerBase::toTransient (const EventContext& ctx)
438 {
439 // Guard against multi-threaded execution:
440 guard_t guard (m_mutex);
441
442 for (SG::IAuxTypeVector* v : m_vecs) {
443 if(v) {
444 v->toTransient( ctx );
445 }
446 }
447
448 // Do the operation on the dynamic variables:
449 if( m_store ) {
450 m_store->toTransient( ctx );
451 }
452 }
453
454
455 size_t AuxContainerBase::size() const {
456
457 // Guard against multi-threaded execution:
458 guard_t guard (m_mutex);
459
460 // Try to find a variable:
461 for (SG::auxid_t i : m_auxids) {
462 if( ( i < m_vecs.size() ) && m_vecs[ i ] && !m_vecs[ i ]->isLinked()) {
463 size_t sz = m_vecs[ i ]->size();
464 if( sz > 0 ) {
465 return sz;
466 }
467 }
468 }
469
470 // If we didn't find any, let's ask the dynamic store:
471 if( m_store ) {
472 return m_store->size();
473 }
474
475 // If we don't have any variables, then the size must be null:
476 return 0;
477 }
478
479 //
481
483 //
484 // Implementation of the SG::IAuxStore functions
485 //
486
488 size_t capacity ) {
489
490 // Guard against multi-threaded execution:
491 guard_t guard( m_mutex );
492
493 if( ( auxid >= m_vecs.size() ) || ( ! m_vecs[ auxid ] ) ) {
494
495 if( m_store ) {
496 void* result = m_store->getData( auxid, size, capacity );
497 if( result ) {
498 m_auxids.insert( auxid );
500 auxid_t linked_id = r.linkedVariable( auxid );
501 if (linked_id != SG::null_auxid) {
502 m_auxids.insert( linked_id );
503 }
504 }
505 return result;
506 } else {
507 std::cout << "ERROR xAOD::AuxContainerBase::getData "
508 << "Unknown variable ("
510 << ") requested" << std::endl;
511 return nullptr;
512 }
513 }
514 m_vecs[ auxid ]->reserve( capacity );
515 if (m_vecs[ auxid ]->size() < size) {
516 m_vecs[ auxid ]->resize( size );
517 }
518
519 return m_vecs[ auxid ]->toPtr();
520 }
521
524
525 // Return the full list of known IDs. The constness of this object's
526 // members comes from the object being const or not.
527 return m_auxids;
528 }
529
531
532 // Guard against multi-threaded execution:
533 guard_t guard( m_mutex );
534
535 // This operation is not allowed on a locked container:
536 if( m_locked ) {
537 throw SG::ExcStoreLocked( "resize" );
538 }
539
540 // Do the operation on the static variables:
541 bool nomoves = true;
542 for (SG::IAuxTypeVector* v : m_vecs) {
543 if(v && !v->isLinked()) {
544 if (!v->resize( size ))
545 nomoves = false;
546 }
547 }
548
549 // Do the operation on the dynamic variables:
550 if( m_store ) {
551 if (!m_store->resize( size ))
552 nomoves = false;
553 }
554
555 return nomoves;
556 }
557
559
560 // Guard against multi-threaded execution:
561 guard_t guard( m_mutex );
562
563 // This operation is not allowed on a locked container:
564 if( m_locked ) {
565 throw SG::ExcStoreLocked( "reserve" );
566 }
567
568 // Do the operation on the static variables:
569 for (SG::IAuxTypeVector* v : m_vecs) {
570 if(v && !v->isLinked()) {
571 v->reserve( size );
572 }
573 }
574
575 // Do the operation on the dynamic variables:
576 if( m_store ) {
577 m_store->reserve( size );
578 }
579
580 return;
581 }
582
583 void AuxContainerBase::shift( size_t pos, ptrdiff_t offs ) {
584
585 // Guard against multi-threaded execution:
586 guard_t guard( m_mutex );
587
588 // This operation is not allowed on a locked container:
589 if( m_locked ) {
590 throw SG::ExcStoreLocked( "shift" );
591 }
592
593 // Do the operation on the static variables:
594 for (SG::IAuxTypeVector* v : m_vecs) {
595 if(v && !v->isLinked()) {
596 v->shift( pos, offs );
597 }
598 }
599
600 // Do the operation on the dynamic variables:
601 if( m_store ) {
602 m_store->shift( pos, offs );
603 }
604
605 return;
606 }
607
608
610 IAuxStore& other,
611 const SG::auxid_set_t& ignore_in ) {
612 // Guard against multi-threaded execution:
613 guard_t guard( m_mutex );
614
615 // This operation is not allowed on a locked container:
616 if( m_locked ) {
617 throw SG::ExcStoreLocked( "insertMove" );
618 }
619
620 bool nomove = true;
621 size_t other_size = other.size();
622
623 SG::auxid_set_t ignore = ignore_in;
624
625 // Do the operation on the static variables:
626 for (SG::auxid_t id : m_auxids) {
627 SG::IAuxTypeVector* v_dst = nullptr;
628 if (id < m_vecs.size())
629 v_dst = m_vecs[id];
630 // Skip linked vars --- they should be taken care of by the parent var.
631 if (v_dst && !v_dst->isLinked()) {
632 ignore.insert (id);
633 if (other.getData (id)) {
634 void* src_ptr = other.getData (id, other_size, other_size);
635 if (src_ptr) {
636 if (!v_dst->insertMove (pos, src_ptr, 0, other_size,
637 other))
638 nomove = false;
639 }
640 }
641 else {
642 const void* orig = v_dst->toPtr();
643 v_dst->shift (pos, other_size);
644 if (orig != v_dst->toPtr())
645 nomove = false;
646 }
647 }
648 }
649
650 // Do the operation on the dynamic variables:
651 if( m_store ) {
652 if (!m_store->insertMove( pos, other, ignore ))
653 nomove = false;
654
655 // Notice any new variables added as a result of this.
656 m_auxids.insert (m_store->getAuxIDs());
657 }
658
659 return nomove;
660 }
661
662
664 const SG::AuxDataOption& option ) {
665
666 guard_t guard (m_mutex);
667 if (id < m_vecs.size() && m_vecs[id] != nullptr)
668 return m_vecs[id]->setOption (option);
669
670 if (m_store)
671 return m_store->setOption (id, option);
672 return false;
673 }
674
675
676 //
678
680 //
681 // Implementation of the SG::IAuxStoreIO functions
682 //
683
684 const void* AuxContainerBase::getIOData( auxid_t auxid ) const {
685
686 // Guard against multi-threaded execution:
687 guard_t guard( m_mutex );
688
689 // If the variable is not static, look for it in the dynamic store:
690 if( ( auxid >= m_vecs.size() ) || ( ! m_vecs[ auxid ] ) ) {
691 if( m_storeIO ) {
692 return m_storeIO->getIOData( auxid );
693 } else {
694 std::cout << "ERROR xAOD::AuxContainerBase::getIOData "
695 << "Unknown variable ("
697 << ") requested" << std::endl;
698 return nullptr;
699 }
700 }
701
702 // Update the statistics for this variable. The dynamic store registers
703 // its own variable accesses.
705
706 return m_vecs[ auxid ]->toVector();
707 }
708
709 const std::type_info* AuxContainerBase::getIOType( auxid_t auxid ) const {
710
711 // Guard against multi-threaded execution:
712 guard_t guard( m_mutex );
713
714 // If the variable is not static, ask the dynamic store:
715 if( ( auxid >= m_vecs.size() ) || ( ! m_vecs[ auxid ] ) ) {
716 if( m_storeIO ) {
717 return m_storeIO->getIOType( auxid );
718 }
719 }
720
721 // Fall back on getting the information from the registry:
723 }
724
727
728 // Guard against multi-threaded execution:
729 guard_t guard( m_mutex );
730
731 // All the variables handled by the internal store are dynamic
732 // if such a store exists:
733 if( m_storeIO && m_store) {
734 // I mean, all the variables. Not just the ones reported as dynamic
735 // by the internal object. Because the internal object may be something
736 // that was put into this one in order to achieve data slimming.
737 return m_store->getAuxIDs();
738 }
739 // In case we don't use an internal store, there are no dynamic
740 // variables:
741 static const auxid_set_t dummy (0);
742 return dummy;
743 }
744
747
748 // Guard against multi-threaded execution:
749 guard_t guard( m_mutex );
750
751 // All the variables handled by the internal store are dynamic
752 // if such a store exists:
753 if( m_storeIO && m_store) {
754 // I mean, all the variables. Not just the ones reported as dynamic
755 // by the internal object. Because the internal object may be something
756 // that was put into this one in order to achieve data slimming.
757 return m_store->getAuxIDs();
758 }
759
760 // In case we don't use an internal store, there are no dynamic
761 // variables:
762 return auxid_set_t();
763 }
764
765 //
767
768 const char* AuxContainerBase::name() const {
769
770 return m_name.c_str();
771 }
772
773 void AuxContainerBase::setName( const char* name ) {
774
775 m_name = name;
776 return;
777 }
778
779} // namespace xAOD
An auxiliary data store that holds data internally.
Handle mappings between names and auxid_t.
Exceptions that can be thrown from AthContainers.
static Double_t sz
static const Attributes_t empty
Helper for getting a const version of a pointer.
Define macros for attributes used to control the static checker.
Hold information about an option setting request.
Handle mappings between names and auxid_t.
std::string getName(SG::auxid_t auxid) const
Return the name of an aux data item.
const std::type_info * getVecType(SG::auxid_t auxid) const
Return the type of the STL vector used to hold an aux data item.
static AuxTypeRegistry & instance()
Return the singleton registry instance.
Exception — Attempted to modify auxiliary data in a locked store.
Interface providing I/O for a generic auxiliary store.
Definition IAuxStoreIO.h:44
Interface for non-const operations on an auxiliary store.
Definition IAuxStore.h:51
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
Common base class for the auxiliary containers.
SG::auxid_set_t auxid_set_t
The aux ID set type definition.
virtual bool resize(size_t size) override
Resize the arrays to a given size.
void setName(const char *name)
Set the name of the container instance.
virtual const void * getIOData(auxid_t auxid) const override
Get a pointer to the data being stored for one aux data item.
CxxUtils::CachedPointer< std::pmr::memory_resource > m_memResource ATLAS_THREAD_SAFE
Memory resource to use for this container.
bool m_locked
Has the container been locked?
virtual SG::auxid_set_t getCopyIDs(bool warnUnlocked=false) const override
Get the set of variables that we should deep copy.
virtual void toTransient(const EventContext &ctx) override
Perform processing on aux variable objects just after reading to make them usable as transient object...
virtual bool isDecoration(auxid_t auxid) const override
Test if a variable is a decoration.
virtual SG::IAuxStore * getStore() override
Get the currently used internal store object.
virtual void lockDecoration(SG::auxid_t auxid) override
Lock a decoration.
virtual const void * getData(auxid_t auxid) const override
Get a pointer to a given array.
virtual const auxid_set_t & getAuxIDs() const override
Get the types(names) of variables handled by this container.
virtual void setStore(SG::IAuxStore *store) override
Set a different internal store object.
SG::IAuxStore * m_store
Internal dynamic auxiliary store object.
virtual bool insertMove(size_t pos, IAuxStore &other, const SG::auxid_set_t &ignore) override
Insert contents of another store via move.
virtual size_t size() const override
Get the size of the container.
virtual const SG::IAuxTypeVector * getVector(SG::auxid_t auxid) const override final
Return vector interface for one aux data item.
AuxContainerBase(bool allowDynamicVars=true)
Default constructor.
virtual void shift(size_t pos, ptrdiff_t offs) override
Shift the contents of the stored arrays.
bool m_ownsStore
Flag deciding if the object owns the dynamic store or not.
virtual SG::auxid_set_t getSelectedAuxIDs() const override
Get the IDs of the selected dynamic Aux variables (for writing).
virtual const auxid_set_t & getDynamicAuxIDs() const override
Get the types(names) of variables created dynamically.
AthContainers_detail::lock_guard< mutex_t > guard_t
std::string m_name
Name of the container in memory. Set externally.
virtual void * getDecoration(auxid_t auxid, size_t size, size_t capacity) override
Get a pointer to a given array, as a decoration.
virtual void lock() override
Lock the container.
std::pmr::memory_resource * memResource()
Return the memory resource to use.
virtual const auxid_set_t & getDecorIDs() const override
Get the types(names) of decorations handled by this container.
SG::IAuxStoreIO * m_storeIO
The IO interface to the internal auxiliary store.
virtual void reserve(size_t size) override
Reserve a given size for the arrays.
auxid_set_t m_auxids
Internal list of all available variables.
virtual const std::type_info * getIOType(auxid_t auxid) const override
Return the type of the data to be stored for one aux data item.
virtual const SG::IAuxTypeVector * linkedVector(SG::auxid_t auxid) const override
Return interface for a linked variable.
virtual const auxid_set_t & getWritableAuxIDs() const override
Return a set of writable data identifiers.
std::vector< SG::IAuxTypeVector * > m_vecs
Internal list of all managed variables.
const char * name() const
Get the name of the container instance.
virtual bool clearDecorations() override
Clear all decorations.
SG::auxid_t auxid_t
The aux ID type definition.
virtual bool setOption(auxid_t id, const SG::AuxDataOption &option) override
Make an option setting on an aux variable.
AuxContainerBase & operator=(const AuxContainerBase &rhs)
Assignment operator.
ReadStats & stats()
Access the object belonging to the current thread.
Definition IOStats.cxx:17
static IOStats & instance()
Singleton object accessor.
Definition IOStats.cxx:11
void readBranch(const std::string &prefix, SG::auxid_t auxid)
Function incrementing the read counter on a specific branch.
int r
Definition globals.cxx:22
const ExtendedEventContext & getExtendedEventContext(const EventContext &ctx)
Retrieve an extended context from a context object.
bool hasExtendedEventContext(const EventContext &ctx)
Test whether a context object has an extended context installed.
const T * as_const_ptr(const T *p)
Helper for getting a const version of a pointer.
Forward declaration.
static const auxid_t null_auxid
To signal no aux data item.
Definition AuxTypes.h:30
virtual SG::auxid_set_t getCopyIDs(bool warnUnlocked=false) const override
Return the set of variables to copy in a deep copy.
AuxStoreInternal(bool standalone=false)
An auxiliary data store that holds data internally.
size_t auxid_t
Identifier for a particular aux data item.
Definition AuxTypes.h:27
STL namespace.
ICaloAffectedTool is abstract interface for tools checking if 4 mom is in calo affected region.