ATLAS Offline Software
BaseInfo.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
14 #include "AthenaKernel/BaseInfo.h"
16 #include "CxxUtils/CachedValue.h"
17 #include "GaudiKernel/System.h"
18 #include <mutex>
19 #include <map>
20 #include <unordered_map>
21 #include <algorithm>
22 #include <iostream>
23 #include "string.h"
24 
25 
26 namespace SG {
27 
28 
31  struct info {
33  info (BaseInfoBase::castfn_t* converter = 0,
34  BaseInfoBase::castfn_t* converterTo = 0,
35  bool is_virtual = false);
36 
40 
45 
49  };
50 
51 
54 
58 
60  const std::type_info* m_typeinfo;
61 
62 
64  typedef std::pair<const std::type_info*, info> ti_map_pair_type;
65  typedef std::vector<ti_map_pair_type> ti_map_type;
67 
68 
70  typedef std::pair<const std::type_info*, const CopyConversionBase*>
72  typedef std::vector<ti_copyconversion_pair_type> ti_copyconversion_type;
74 
75 
77  typedef std::unordered_map<const std::type_info*, BaseInfoBase*> bi_by_ti_map_type;
79 
80 
82  typedef std::unordered_map<std::string, const std::type_info*> ti_by_name_map_type;
83  static ti_by_name_map_type* s_ti_by_name ATLAS_THREAD_SAFE;
84 
85 
88  typedef std::unordered_multimap<const std::type_info*,
90  static init_list_t* s_init_list ATLAS_THREAD_SAFE;
91 
92 
93  // To make sure that the maps get deleted at program termination.
94  struct Deleter {
95  ~Deleter();
96  };
98 
101  typedef std::lock_guard<mutex_t> lock_t;
102  static mutex_t s_mutex ATLAS_THREAD_SAFE; // For the static variables.
103  mutable mutex_t m_mutex; // For the class members.
104 
105 
109 
110 
118  const info* findInfo (const std::type_info& tinfo) const
119  {
120  // We don't expect there to be many entries, so just use a linear search.
121  for (const auto& i : m_timap) {
122  if (i.first == &tinfo)
123  return &i.second;
124  }
125 
126  // Sometimes type_info's are not actually unique, depending on how libraries
127  // get loaded. Try again, comparing names.
128  for (const auto& i : m_timap) {
129  if (strcmp (i.first->name(), tinfo.name()) == 0)
130  return &i.second;
131  }
132  return nullptr;
133  }
134 };
135 
136 
137 
142 {
144  return m_impl->m_clid;
145 }
146 
147 
151 const std::type_info& BaseInfoBase::typeinfo() const
152 {
154  return *m_impl->m_typeinfo;
155 }
156 
157 
166 void* BaseInfoBase::cast (void* p, CLID clid) const
167 {
168  const std::type_info* ti = CLIDRegistry::CLIDToTypeinfo (clid);
169  if (ti)
170  return this->cast (p, *ti);
171  return 0;
172 }
173 
174 
183 void* BaseInfoBase::cast (void* p, const std::type_info& tinfo) const
184 {
185  if (BaseInfoBase::castfn_t* converter = castfn (tinfo)) {
186  return converter (p);
187  }
188  return nullptr;
189 }
190 
191 
201 void* BaseInfoBase::castTo (void* p, CLID clid) const
202 {
203  const std::type_info* ti = CLIDRegistry::CLIDToTypeinfo (clid);
204  if (ti)
205  return this->castTo (p, *ti);
206  return 0;
207 }
208 
209 
219 void* BaseInfoBase::castTo (void* p, const std::type_info& tinfo) const
220 {
221  if (BaseInfoBase::castfn_t* converterTo = castfnTo (tinfo)) {
222  return converterTo (p);
223  }
224  return nullptr;
225 }
226 
227 
237 {
238  const std::type_info* ti = CLIDRegistry::CLIDToTypeinfo (clid);
239  if (ti)
240  return this->castfn (*ti);
241  return 0;
242 }
243 
244 
254 BaseInfoBase::castfn (const std::type_info& tinfo) const
255 {
257  const BaseInfoBaseImpl::info* i = m_impl->findInfo (tinfo);
258  if (i)
259  return i->m_converter;
260  return nullptr;
261 }
262 
263 
273 {
274  const std::type_info* ti = CLIDRegistry::CLIDToTypeinfo (clid);
275  if (ti)
276  return this->castfnTo (*ti);
277  return 0;
278 }
279 
280 
290 BaseInfoBase::castfnTo (const std::type_info& tinfo) const
291 {
293  const BaseInfoBaseImpl::info* i = m_impl->findInfo (tinfo);
294  if (i)
295  return i->m_converterTo;
296  return nullptr;
297 }
298 
299 
304 const std::vector<CLID>& BaseInfoBase::get_bases() const
305 {
306  if (!m_impl->m_bases.isValid()) {
309  std::vector<CLID> v;
310  v.reserve (map.size());
311  for (const auto& p : map) {
313  if (clid != CLID_NULL)
314  v.push_back (clid);
315  }
316  m_impl->m_bases.set (std::move (v));
317  }
318  return *m_impl->m_bases.ptr();
319 }
320 
321 
326 std::vector<const std::type_info*> BaseInfoBase::get_ti_bases() const
327 {
330  std::vector<const std::type_info*> v;
331  v.reserve (map.size());
332  for (const auto& i : map)
333  v.push_back (i.first);
334  return v;
335 }
336 
337 
344 bool BaseInfoBase::is_base (CLID clid) const
345 {
346  const std::type_info* ti = CLIDRegistry::CLIDToTypeinfo (clid);
347  if (ti)
348  return this->is_base (*ti);
349  return 0;
350 }
351 
352 
359 bool BaseInfoBase::is_base (const std::type_info& tinfo) const
360 {
362  const BaseInfoBaseImpl::info* i = m_impl->findInfo (tinfo);
363  return i != 0;
364 }
365 
366 
374 {
375  const std::type_info* ti = CLIDRegistry::CLIDToTypeinfo (clid);
376  if (ti)
377  return this->is_virtual (*ti);
378  return false;
379 }
380 
381 
388 bool BaseInfoBase::is_virtual (const std::type_info& tinfo) const
389 {
391  const BaseInfoBaseImpl::info* i = m_impl->findInfo (tinfo);
392  if (i)
393  return i->m_is_virtual;
394  return false;
395 }
396 
397 
404 const CopyConversionBase*
405 BaseInfoBase::copy_conversion (const std::type_info& tinfo) const
406 {
408  for (const auto& p : m_impl->m_ti_copyconversion_map) {
409  if (p.first == &tinfo)
410  return p.second;
411  }
412  return 0;
413 }
414 
415 
422 const CopyConversionBase*
424 {
425  const std::type_info* ti = CLIDRegistry::CLIDToTypeinfo (clid);
426  if (ti)
427  return this->copy_conversion (*ti);
428  return 0;
429 }
430 
431 
439 void
440 BaseInfoBase::add_copy_conversion (const std::type_info& tinfo,
441  const CopyConversionBase* cnv)
442 {
444  m_impl->m_ti_copyconversion_map.emplace_back (&tinfo, cnv);
445 }
446 
447 
454 std::vector<CLID>
456 {
458  std::vector<CLID> out;
459  out.reserve (m_impl->m_ti_copyconversion_map.size());
460  for (const auto& i : m_impl->m_ti_copyconversion_map) {
462  if (clid != CLID_NULL)
463  out.push_back (clid);
464  }
465  return out;
466 }
467 
468 
479 void BaseInfoBase::add_info (const std::type_info& tinfo,
480  castfn_t* converter,
481  castfn_t* converterTo,
482  bool is_virtual)
483 {
485  {
486  const BaseInfoBaseImpl::info* i = m_impl->findInfo (tinfo);
487  if (!i) {
488  m_impl->m_timap.emplace_back (&tinfo,
489  BaseInfoBaseImpl::info (converter, converterTo, is_virtual));
490  }
491  }
492 
493  auto i = BaseInfoBaseImpl::s_bi_by_ti->find (&tinfo);
494  if (i != BaseInfoBaseImpl::s_bi_by_ti->end()) {
495  BaseInfoBaseImpl& impl = *i->second->m_impl;
496  if (impl.m_clid == CLID_NULL)
497  impl.m_clid = CLIDRegistry::typeinfoToCLID (tinfo);
498  }
499 }
500 
501 
515  BaseInfoBase::castfn_t* converterTo /*= 0*/,
516  bool is_virtual /*= false*/)
517  : m_converter (converter),
518  m_converterTo (converterTo),
519  m_is_virtual (is_virtual)
520 {
521 }
522 
523 
528 BaseInfoBase::BaseInfoBase (const std::type_info& tinfo)
529  : m_impl (new BaseInfoBaseImpl)
530 {
532  m_impl->m_typeinfo = &tinfo;
533  m_impl->m_needs_init = true;
534 
536  if (!BaseInfoBaseImpl::s_bi_by_ti)
537  BaseInfoBaseImpl::s_bi_by_ti = new BaseInfoBaseImpl::bi_by_ti_map_type;
538  if (!BaseInfoBaseImpl::s_ti_by_name)
539  BaseInfoBaseImpl::s_ti_by_name = new BaseInfoBaseImpl::ti_by_name_map_type;
540 
541  // Register this instance in the static maps.
542  (*BaseInfoBaseImpl::s_bi_by_ti)[&tinfo] = this;
543  (*BaseInfoBaseImpl::s_ti_by_name)[tinfo.name()] = &tinfo;
544 }
545 
546 
551 {
555  ++it)
556  {
557  delete it->second;
558  }
559  delete m_impl;
560 }
561 
562 
570 {
571  const std::type_info* ti = CLIDRegistry::CLIDToTypeinfo (clid);
572  if (ti)
573  return BaseInfoBase::find (*ti);
574  return 0;
575 }
576 
577 
585 BaseInfoBase* BaseInfoBase::find1 (const std::type_info& tinfo)
586 {
587  BaseInfoBase* bib = nullptr;
588  {
590  if (!BaseInfoBaseImpl::s_bi_by_ti) return 0;
592  BaseInfoBaseImpl::s_bi_by_ti->find (&tinfo);
593  if (i != BaseInfoBaseImpl::s_bi_by_ti->end()) {
594  bib = i->second;
596  if (!bib->m_impl->m_needs_init)
597  return bib;
598  bib->m_impl->m_needs_init = false;
599  }
600  }
601 
602  // Try the initlist.
603  while (true) {
604  BaseInfoBase::init_func_t* init = nullptr;
605  {
607  if (!BaseInfoBaseImpl::s_init_list) break;
609  BaseInfoBaseImpl::s_bi_by_ti->find (&tinfo);
610  if (i != BaseInfoBaseImpl::s_bi_by_ti->end())
611  bib = i->second;
613  BaseInfoBaseImpl::s_init_list->find (&tinfo);
614  if (it == BaseInfoBaseImpl::s_init_list->end()) break;
615  init = it->second;
616  BaseInfoBaseImpl::s_init_list->erase (it);
617  }
618  init (bib);
619  }
620 
621  return bib;
622 }
623 
624 
632 const BaseInfoBase* BaseInfoBase::find (const std::type_info& tinfo)
633 {
634  BaseInfoBase* bib = find1 (tinfo);
635 
636  // If we didn't find it, try looking up by name.
637  // This to deal with the issue of sometimes getting duplicate
638  // @c std::type_info instances.
639  if (!bib) {
640  const std::type_info* tinfo2 = nullptr;
641  {
643  if (BaseInfoBaseImpl::s_ti_by_name) {
645  BaseInfoBaseImpl::s_ti_by_name->find (tinfo.name());
646  if (i != BaseInfoBaseImpl::s_ti_by_name->end() && i->second != &tinfo) {
647  tinfo2 = i->second;
648  }
649  }
650  }
651  if (tinfo2) {
652  bib = find1 (*tinfo2);
653  }
654  }
655 
656  if (bib) {
657  BaseInfoBaseImpl& impl = *bib->m_impl;
658  BaseInfoBaseImpl::lock_t lock (impl.m_mutex);
659  if (impl.m_clid == CLID_NULL)
660  impl.m_clid = CLIDRegistry::typeinfoToCLID (*impl.m_typeinfo);
661  }
662 
663  return bib;
664 }
665 
666 
672 void BaseInfoBase::addInit (const std::type_info* tinfo,
673  init_func_t* init_func)
674 {
676  if (!BaseInfoBaseImpl::s_init_list)
677  BaseInfoBaseImpl::s_init_list =
679  BaseInfoBaseImpl::s_init_list->insert (std::make_pair (tinfo, init_func));
680 
681  if (BaseInfoBaseImpl::s_bi_by_ti) {
682  auto i = BaseInfoBaseImpl::s_bi_by_ti->find (tinfo);
683  if (i != BaseInfoBaseImpl::s_bi_by_ti->end()) {
684  BaseInfoBaseImpl::lock_t lock (i->second->m_impl->m_mutex);
685  BaseInfoBaseImpl& impl = *i->second->m_impl;
686  impl.m_needs_init = true;
687  if (impl.m_clid == CLID_NULL)
688  impl.m_clid = CLIDRegistry::typeinfoToCLID (*tinfo);
689  }
690  }
691 }
692 
693 
698 {
699  // This may be null during initialization, if we're initializing a
700  // BaseInfo<T>::s_instance instance which references another type
701  // for which the s_instance constructor has not yet been run.
702  if (!m_impl) return;
703 
704  bool needs_init = false;
705  const std::type_info* ti = nullptr;
706  {
708  needs_init = m_impl->m_needs_init;
709  ti = m_impl->m_typeinfo;
710  }
711 
712  if (needs_init)
713  find (*ti);
714 }
715 
716 
717 
719 BaseInfoBaseImpl::bi_by_ti_map_type* BaseInfoBaseImpl::s_bi_by_ti = 0;
720 BaseInfoBaseImpl::ti_by_name_map_type* BaseInfoBaseImpl::s_ti_by_name = 0;
721 BaseInfoBaseImpl::init_list_t* BaseInfoBaseImpl::s_init_list = 0;
723 
724 // To get them deleted.
727 {
728  delete s_bi_by_ti;
729  delete s_ti_by_name;
730  delete s_init_list;
731 }
732 
733 
734 // Helper for dumping within the debugger.
736 {
738  std::cout << "map:\n";
739  if (BaseInfoBaseImpl::s_bi_by_ti) {
740  std::vector<const std::type_info*> vv;
741  for (const auto& x : *BaseInfoBaseImpl::s_bi_by_ti)
742  vv.push_back (x.first);
743  std::sort (vv.begin(), vv.end());
744  for (const std::type_info* ti : vv)
745  {
746  const BaseInfoBase* bib = (*BaseInfoBaseImpl::s_bi_by_ti)[ti];
747  std::cout << ti << " " << bib->clid() << " [" << System::typeinfoName (*ti)
748  << "]\n";
749  }
750  }
751 
752  std::cout << "\ninitlist:\n";
753  if (BaseInfoBaseImpl::s_init_list) {
754  for (const auto& x : *BaseInfoBaseImpl::s_init_list)
755  std::cout << x.first << " " << x.second << " ["
756  << System::typeinfoName (*x.first) << "]\n";
757  }
758 }
759 
760 
761 } // namespace SG
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
SG::BaseInfoBase::find1
static BaseInfoBase * find1(const std::type_info &tinfo)
Helper for find.
Definition: BaseInfo.cxx:585
SG::BaseInfoBaseImpl::ti_copyconversion_pair_type
std::pair< const std::type_info *, const CopyConversionBase * > ti_copyconversion_pair_type
Hold copy conversion information indexed by @ type_info.
Definition: BaseInfo.cxx:71
SG::BaseInfoBaseImpl::ti_copyconversion_type
std::vector< ti_copyconversion_pair_type > ti_copyconversion_type
Definition: BaseInfo.cxx:72
SG::BaseInfoBaseImpl::mutex_t
std::mutex mutex_t
For thread-safety.
Definition: BaseInfo.cxx:100
CxxUtils::CachedValue::ptr
const T * ptr() const
Return a pointer to the cached value.
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
SG
Forward declaration.
Definition: CaloCellPacker_400_500.h:32
CLIDRegistry::typeinfoToCLID
static CLID typeinfoToCLID(const std::type_info &ti)
Return the CLID corresponding to a type_info.
Definition: CLIDRegistry.cxx:148
SG::BaseInfoBaseImpl::m_bases
CxxUtils::CachedValue< std::vector< CLID > > m_bases
CLIDs of known bases, including the class itself.
Definition: BaseInfo.cxx:108
BeamSpot::mutex
std::mutex mutex
Definition: InDetBeamSpotVertex.cxx:18
CxxUtils::CachedValue::isValid
bool isValid() const
Test to see if the value is valid.
SG::BaseInfoBaseImpl::init_list_t
std::unordered_multimap< const std::type_info *, BaseInfoBase::init_func_t * > init_list_t
Holds BaseInfo classes awaiting initialization.
Definition: BaseInfo.cxx:89
CSV_InDetExporter.new
new
Definition: CSV_InDetExporter.py:145
skel.it
it
Definition: skel.GENtoEVGEN.py:423
SG::BaseInfoBase::~BaseInfoBase
~BaseInfoBase()
Destructor.
Definition: BaseInfo.cxx:550
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:71
SG::BaseInfoBase::maybeInit
void maybeInit()
Run initializations for this class, if needed.
Definition: BaseInfo.cxx:697
SG::BaseInfoBaseImpl::ATLAS_THREAD_SAFE
static ti_by_name_map_type *s_ti_by_name ATLAS_THREAD_SAFE
Definition: BaseInfo.cxx:83
CLIDRegistry::CLIDToTypeinfo
static const std::type_info * CLIDToTypeinfo(CLID clid)
Translate between CLID and type_info.
Definition: CLIDRegistry.cxx:136
SG::BaseInfoBaseImpl::Deleter::~Deleter
~Deleter()
Definition: BaseInfo.cxx:726
SG::BaseInfoBase::init_func_t
void init_func_t(BaseInfoBase *bib)
Type for an initialization function.
Definition: Control/AthenaKernel/AthenaKernel/BaseInfo.h:688
SG::BaseInfoBase::get_ti_bases
std::vector< const std::type_info * > get_ti_bases() const
Return the type_info's of all known bases of T.
Definition: BaseInfo.cxx:326
SG::BaseInfoBase::castfnTo
castfn_t * castfnTo(CLID clid) const
Return a function for casting to a derived pointer.
Definition: BaseInfo.cxx:272
SG::BaseInfoBaseImpl::m_ti_copyconversion_map
ti_copyconversion_type m_ti_copyconversion_map
Definition: BaseInfo.cxx:73
SG::BaseInfoBase::get_bases
const std::vector< CLID > & get_bases() const
Return the class IDs of all known bases of T (that have class IDs).
Definition: BaseInfo.cxx:304
SG::BaseInfoBase::addInit
static void addInit(const std::type_info *tinfo, init_func_t *init_func)
Register an initialization function.
Definition: BaseInfo.cxx:672
x
#define x
SG::BaseInfoBase::cast
void * cast(void *p, CLID clid) const
Cast to a base pointer.
Definition: BaseInfo.cxx:166
SG::BaseInfoBase::m_impl
BaseInfoBaseImpl * m_impl
Pointer to internal state.
Definition: Control/AthenaKernel/AthenaKernel/BaseInfo.h:734
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
SG::BaseInfoBaseImpl
Definition: BaseInfo.cxx:29
SG::BaseInfoBaseImpl::bi_by_ti_map_type
std::unordered_map< const std::type_info *, BaseInfoBase * > bi_by_ti_map_type
Map of all type_info pointers to BaseInfoBase instances.
Definition: BaseInfo.cxx:77
SG::CopyConversionBase
Base class for copy conversions.
Definition: Control/AthenaKernel/AthenaKernel/BaseInfo.h:384
lumiFormat.i
int i
Definition: lumiFormat.py:92
BaseInfo.h
Provide an interface for finding inheritance information at run time.
SG::BaseInfoBaseImpl::info::m_converter
BaseInfoBase::castfn_t * m_converter
Converter function.
Definition: BaseInfo.cxx:39
SG::BaseInfoBaseImpl::m_typeinfo
const std::type_info * m_typeinfo
std::type_info of this class.
Definition: BaseInfo.cxx:60
SG::BaseInfoBaseImpl::info::m_converterTo
BaseInfoBase::castfn_t * m_converterTo
Converter function.
Definition: BaseInfo.cxx:44
CxxUtils::CachedValue
Cached value with atomic update.
Definition: CachedValue.h:55
SG::BaseInfoBaseImpl::Deleter
Definition: BaseInfo.cxx:94
SG::BaseInfoBase::get_copy_conversions
std::vector< CLID > get_copy_conversions() const
Return known copy conversions.
Definition: BaseInfo.cxx:455
SG::BaseInfoBase::copy_conversion
const CopyConversionBase * copy_conversion(const std::type_info &tinfo) const
Search for a copy conversion to tinfo.
Definition: BaseInfo.cxx:405
SG::BaseInfoBaseImpl::ATLAS_THREAD_SAFE
static bi_by_ti_map_type *s_bi_by_ti ATLAS_THREAD_SAFE
Definition: BaseInfo.cxx:78
SG::BaseInfoBase::castTo
void * castTo(void *p, CLID clid) const
Cast to a derived pointer.
Definition: BaseInfo.cxx:201
SG::BaseInfoBaseImpl::ti_map_type
std::vector< ti_map_pair_type > ti_map_type
Definition: BaseInfo.cxx:65
CLID
uint32_t CLID
The Class ID type.
Definition: Event/xAOD/xAODCore/xAODCore/ClassID_traits.h:47
SG::BaseInfoBaseImpl::ti_by_name_map_type
std::unordered_map< std::string, const std::type_info * > ti_by_name_map_type
Used to canonicalize type_info instances.
Definition: BaseInfo.cxx:82
SG::BaseInfoBase::castfn_t
void * castfn_t(void *p)
Type of a pointer conversion function.
Definition: Control/AthenaKernel/AthenaKernel/BaseInfo.h:516
SG::BaseInfoBaseImpl::info::info
info(BaseInfoBase::castfn_t *converter=0, BaseInfoBase::castfn_t *converterTo=0, bool is_virtual=false)
Constructor. converter* and is_virtual are as for add_info.
Definition: BaseInfo.cxx:514
SG::BaseInfoBase::BaseInfoBase
BaseInfoBase(const std::type_info &tinfo)
Constructor.
Definition: BaseInfo.cxx:528
FPEAudit::s_mutex
std::mutex s_mutex
Definition: FPEAuditor.cxx:43
SG::BaseInfoBase::clid
CLID clid() const
Return the CLID for this class.
Definition: BaseInfo.cxx:141
CachedValue.h
Cached value with atomic update.
SG::BaseInfoBase::find
static const BaseInfoBase * find(CLID clid)
Find the BaseInfoBase instance for clid.
Definition: BaseInfo.cxx:569
SG::BaseInfoBaseImpl::ATLAS_THREAD_SAFE
static mutex_t s_mutex ATLAS_THREAD_SAFE
Definition: BaseInfo.cxx:102
CxxUtils::CachedValue::set
void set(const T &val) const
Set the value, assuming it is currently invalid.
python.PyKernel.init
def init(v_theApp, v_rootStream=None)
Definition: PyKernel.py:45
SG::BaseInfoBaseImpl::info
Structure to hold information about one base.
Definition: BaseInfo.cxx:31
CLIDRegistry.h
a static registry of CLID->typeName entries. NOT for general use. Use ClassIDSvc instead.
SG::BaseInfoBaseImpl::info::m_is_virtual
bool m_is_virtual
True if the derivation from this base to T is via virtual derivation.
Definition: BaseInfo.cxx:48
python.PyAthena.v
v
Definition: PyAthena.py:157
impl
Definition: CaloGPUClusterAndCellDataMonitorOptions.h:46
SG::BaseInfoBase
The non-template portion of the BaseInfo implementation.
Definition: Control/AthenaKernel/AthenaKernel/BaseInfo.h:451
SG::BaseInfoBase::is_virtual
bool is_virtual(CLID clid) const
Return true if clid is the ID of a class that is known to be a virtual base of T.
Definition: BaseInfo.cxx:373
SG::BaseInfoBaseImpl::m_mutex
mutex_t m_mutex
Definition: BaseInfo.cxx:103
SG::BaseInfoBaseImpl::ATLAS_THREAD_SAFE
static init_list_t *s_init_list ATLAS_THREAD_SAFE
Definition: BaseInfo.cxx:90
SG::BaseInfoBaseImpl::findInfo
const info * findInfo(const std::type_info &tinfo) const
Find a base by type_info.
Definition: BaseInfo.cxx:118
SG::BaseInfoBase::typeinfo
const std::type_info & typeinfo() const
Return the std::type_info for this class.
Definition: BaseInfo.cxx:151
SG::BaseInfoBaseImpl::m_timap
ti_map_type m_timap
Definition: BaseInfo.cxx:66
PlotCalibFromCool.vv
vv
Definition: PlotCalibFromCool.py:716
SG::BaseInfoBase::castfn
castfn_t * castfn(CLID clid) const
Return a function for casting to a base pointer.
Definition: BaseInfo.cxx:236
SG::BaseInfoBaseImpl::m_clid
CLID m_clid
CLID of this class.
Definition: BaseInfo.cxx:53
SG::BaseInfoBaseImpl::ti_map_pair_type
std::pair< const std::type_info *, info > ti_map_pair_type
Hold base information indexed by type_info.
Definition: BaseInfo.cxx:64
SG::dumpBaseInfo
void dumpBaseInfo()
Definition: BaseInfo.cxx:735
SG::BaseInfoBase::add_info
void add_info(const std::type_info &tinfo, castfn_t *converter, castfn_t *converterTo, bool is_virtual)
Add information about one base class.
Definition: BaseInfo.cxx:479
SG::BaseInfoBase::add_copy_conversion
void add_copy_conversion(const std::type_info &tinfo, const CopyConversionBase *cnv)
Add a new copy conversion.
Definition: BaseInfo.cxx:440
SG::BaseInfoBaseImpl::s_deleter
static Deleter s_deleter
Definition: BaseInfo.cxx:97
SG::BaseInfoBaseImpl::lock_t
std::lock_guard< mutex_t > lock_t
Definition: BaseInfo.cxx:101
SG::BaseInfoBaseImpl::m_needs_init
bool m_needs_init
Set to true when first created.
Definition: BaseInfo.cxx:57
SG::BaseInfoBase::is_base
bool is_base(CLID clid) const
Return true if clid is the ID of a class that is known to be a base of T.
Definition: BaseInfo.cxx:344