17#include "GaudiKernel/System.h"
20#include <unordered_map>
35 bool is_virtual =
false);
70 typedef std::pair<const std::type_info*, const CopyConversionBase*>
88 typedef std::unordered_multimap<
const std::type_info*,
123 for (
const auto& i :
m_timap) {
124 if (i.first == &tinfo)
130 for (
const auto& i :
m_timap) {
131 if (strcmp (i.first->name(), tinfo.name()) == 0)
156 return *
m_impl->m_typeinfo;
172 return this->
cast (p, *ti);
188 return converter (p);
207 return this->
castTo (p, *ti);
224 return converterTo (p);
242 return this->
castfn (*ti);
261 return i->m_converter;
297 return i->m_converterTo;
308 if (!
m_impl->m_bases.isValid()) {
312 v.reserve (
map.size());
313 for (
const auto& p :
map) {
315 if (
clid != CLID_NULL)
318 m_impl->m_bases.set (std::move (v));
320 return *
m_impl->m_bases.ptr();
332 std::vector<const std::type_info*> v;
333 v.reserve (
map.size());
334 for (
const auto& i :
map)
335 v.push_back (i.first);
395 return i->m_is_virtual;
410 for (
const auto& p :
m_impl->m_ti_copyconversion_map) {
411 if (p.first == &tinfo)
458 m_impl->m_ti_copyconversion_map.emplace_back (&tinfo, cnv);
472 std::vector<CLID> out;
473 out.reserve (
m_impl->m_ti_copyconversion_map.size());
474 for (
const auto& i :
m_impl->m_ti_copyconversion_map) {
476 if (
clid != CLID_NULL)
477 out.push_back (
clid);
503 m_impl->m_timap.emplace_back (&tinfo,
508 auto i = BaseInfoBaseImpl::s_bi_by_ti->find (&tinfo);
509 if (i != BaseInfoBaseImpl::s_bi_by_ti->end()) {
511 if (
impl.m_clid == CLID_NULL)
548 m_impl->m_typeinfo = &tinfo;
550 m_impl->m_needs_init =
true;
553 if (!BaseInfoBaseImpl::s_bi_by_ti)
555 if (!BaseInfoBaseImpl::s_ti_by_name)
559 (*BaseInfoBaseImpl::s_bi_by_ti)[&tinfo] =
this;
560 (*BaseInfoBaseImpl::s_ti_by_name)[tinfo.name()] = &tinfo;
569 for (BaseInfoBaseImpl::ti_copyconversion_type::iterator it =
570 m_impl->m_ti_copyconversion_map.begin();
571 it !=
m_impl->m_ti_copyconversion_map.end();
607 if (!BaseInfoBaseImpl::s_bi_by_ti)
return 0;
608 BaseInfoBaseImpl::bi_by_ti_map_type::iterator i =
609 BaseInfoBaseImpl::s_bi_by_ti->find (&tinfo);
610 if (i != BaseInfoBaseImpl::s_bi_by_ti->end()) {
624 if (!BaseInfoBaseImpl::s_init_list)
break;
625 BaseInfoBaseImpl::bi_by_ti_map_type::iterator i =
626 BaseInfoBaseImpl::s_bi_by_ti->find (&tinfo);
627 if (i != BaseInfoBaseImpl::s_bi_by_ti->end())
629 BaseInfoBaseImpl::init_list_t::iterator it =
630 BaseInfoBaseImpl::s_init_list->find (&tinfo);
631 if (it == BaseInfoBaseImpl::s_init_list->end())
break;
633 BaseInfoBaseImpl::s_init_list->erase (it);
657 const std::type_info* tinfo2 =
nullptr;
660 if (BaseInfoBaseImpl::s_ti_by_name) {
661 BaseInfoBaseImpl::ti_by_name_map_type::iterator i =
662 BaseInfoBaseImpl::s_ti_by_name->find (tinfo.name());
663 if (i != BaseInfoBaseImpl::s_ti_by_name->end() && i->second != &tinfo) {
669 bib =
find1 (*tinfo2);
676 if (
impl.m_clid == CLID_NULL)
693 if (!BaseInfoBaseImpl::s_init_list)
694 BaseInfoBaseImpl::s_init_list =
696 BaseInfoBaseImpl::s_init_list->insert (std::make_pair (tinfo, init_func));
698 if (BaseInfoBaseImpl::s_bi_by_ti) {
699 auto i = BaseInfoBaseImpl::s_bi_by_ti->find (tinfo);
700 if (i != BaseInfoBaseImpl::s_bi_by_ti->end()) {
703 impl.m_needs_init =
true;
704 if (
impl.m_clid == CLID_NULL)
721 bool needs_init =
false;
722 const std::type_info* ti =
nullptr;
725 needs_init =
m_impl->m_needs_init;
755 std::cout <<
"map:\n";
756 if (BaseInfoBaseImpl::s_bi_by_ti) {
757 std::vector<const std::type_info*> vv;
758 for (
const auto&
x : *BaseInfoBaseImpl::s_bi_by_ti)
759 vv.push_back (
x.first);
761 for (
const std::type_info* ti : vv)
763 const BaseInfoBase* bib = (*BaseInfoBaseImpl::s_bi_by_ti)[ti];
764 std::cout << ti <<
" " << bib->
clid() <<
" [" << System::typeinfoName (*ti)
769 std::cout <<
"\ninitlist:\n";
770 if (BaseInfoBaseImpl::s_init_list) {
771 for (
const auto&
x : *BaseInfoBaseImpl::s_init_list)
772 std::cout <<
x.first <<
" " <<
x.second <<
" ["
773 << System::typeinfoName (*
x.first) <<
"]\n";
a static registry of CLID->typeName entries.
Cached value with atomic update.
Provide an interface for finding inheritance information at run time.
uint32_t CLID
The Class ID type.
static CLID typeinfoToCLID(const std::type_info &ti)
Return the CLID corresponding to a type_info.
static const std::type_info * CLIDToTypeinfo(CLID clid)
Translate between CLID and type_info.
Cached value with atomic update.
The non-template portion of the BaseInfo implementation.
static BaseInfoBase * find1(const std::type_info &tinfo)
Helper for find.
BaseInfoBase(const std::type_info &tinfo, destroy_fn *destroy)
Constructor.
const CopyConversionBase * copy_conversion(const std::type_info &tinfo) const
Search for a copy conversion to tinfo.
void add_info(const std::type_info &tinfo, castfn_t *converter, castfn_t *converterTo, bool is_virtual)
Add information about one base class.
void add_copy_conversion(const std::type_info &tinfo, const CopyConversionBase *cnv)
Add a new copy conversion.
void maybeInit()
Run initializations for this class, if needed.
void init_func_t(BaseInfoBase *bib)
Type for an initialization function.
~BaseInfoBase()
Destructor.
std::vector< const std::type_info * > get_ti_bases() const
Return the type_info's of all known bases of T.
castfn_t * castfnTo(CLID clid) const
Return a function for casting to a derived pointer.
void * castTo(void *p, CLID clid) const
Cast to a derived pointer.
CLID clid() const
Return the CLID for this class.
static void addInit(const std::type_info *tinfo, init_func_t *init_func)
Register an initialization function.
void destroy(void *p) const
Delete an instance of the described type.
static const BaseInfoBase * find(CLID clid)
Find the BaseInfoBase instance for clid.
const std::type_info & typeinfo() const
Return the std::type_info for this class.
void * cast(void *p, CLID clid) const
Cast to a base pointer.
castfn_t * castfn(CLID clid) const
Return a function for casting to a base pointer.
const std::vector< CLID > & get_bases() const
Return the class IDs of all known bases of T (that have class IDs).
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.
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.
std::vector< CLID > get_copy_conversions() const
Return known copy conversions.
BaseInfoBaseImpl * m_impl
Pointer to internal state.
void * castfn_t(void *p)
Type of a pointer conversion function.
Base class for copy conversions.
virtual void lock() override
Lock the container.
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
Structure to hold information about one base.
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.
bool m_is_virtual
True if the derivation from this base to T is via virtual derivation.
BaseInfoBase::castfn_t * m_converter
Converter function.
BaseInfoBase::castfn_t * m_converterTo
Converter function.
std::lock_guard< mutex_t > lock_t
BaseInfoBase::destroy_fn * m_destroy
std::pair< const std::type_info *, const CopyConversionBase * > ti_copyconversion_pair_type
Hold copy conversion information indexed by @ type_info.
CLID m_clid
CLID of this class.
ti_copyconversion_type m_ti_copyconversion_map
std::pair< const std::type_info *, info > ti_map_pair_type
Hold base information indexed by type_info.
std::vector< ti_copyconversion_pair_type > ti_copyconversion_type
std::mutex mutex_t
For thread-safety.
static bi_by_ti_map_type *s_bi_by_ti ATLAS_THREAD_SAFE
std::unordered_map< std::string, const std::type_info * > ti_by_name_map_type
Used to canonicalize type_info instances.
CxxUtils::CachedValue< std::vector< CLID > > m_bases
CLIDs of known bases, including the class itself.
const info * findInfo(const std::type_info &tinfo) const
Find a base by type_info.
std::vector< ti_map_pair_type > ti_map_type
std::unordered_multimap< const std::type_info *, BaseInfoBase::init_func_t * > init_list_t
Holds BaseInfo classes awaiting initialization.
bool m_needs_init
Set to true when first created.
const std::type_info * m_typeinfo
std::type_info of this class.
std::unordered_map< const std::type_info *, BaseInfoBase * > bi_by_ti_map_type
Map of all type_info pointers to BaseInfoBase instances.