17#include "GaudiKernel/System.h"
20#include <unordered_map>
36 bool is_virtual =
false);
71 typedef std::pair<const std::type_info*, const CopyConversionBase*>
89 typedef std::unordered_multimap<
const std::type_info*,
124 for (
const auto& i :
m_timap) {
125 if (i.first == &tinfo)
131 for (
const auto& i :
m_timap) {
132 if (strcmp (i.first->name(), tinfo.name()) == 0)
157 return *
m_impl->m_typeinfo;
173 return this->
cast (p, *ti);
189 return converter (p);
208 return this->
castTo (p, *ti);
225 return converterTo (p);
243 return this->
castfn (*ti);
262 return i->m_converter;
298 return i->m_converterTo;
309 if (!
m_impl->m_bases.isValid()) {
313 v.reserve (
map.size());
314 for (
const auto& p :
map) {
316 if (
clid != CLID_NULL)
319 m_impl->m_bases.set (std::move (v));
321 return *
m_impl->m_bases.ptr();
333 std::vector<const std::type_info*> v;
334 v.reserve (
map.size());
335 for (
const auto& i :
map)
336 v.push_back (i.first);
396 return i->m_is_virtual;
411 for (
const auto& p :
m_impl->m_ti_copyconversion_map) {
412 if (p.first == &tinfo)
459 m_impl->m_ti_copyconversion_map.emplace_back (&tinfo, cnv);
473 std::vector<CLID> out;
474 out.reserve (
m_impl->m_ti_copyconversion_map.size());
475 for (
const auto& i :
m_impl->m_ti_copyconversion_map) {
477 if (
clid != CLID_NULL)
478 out.push_back (
clid);
504 m_impl->m_timap.emplace_back (&tinfo,
509 auto i = BaseInfoBaseImpl::s_bi_by_ti->find (&tinfo);
510 if (i != BaseInfoBaseImpl::s_bi_by_ti->end()) {
512 if (
impl.m_clid == CLID_NULL)
549 m_impl->m_typeinfo = &tinfo;
551 m_impl->m_needs_init =
true;
554 if (!BaseInfoBaseImpl::s_bi_by_ti)
556 if (!BaseInfoBaseImpl::s_ti_by_name)
560 (*BaseInfoBaseImpl::s_bi_by_ti)[&tinfo] =
this;
561 (*BaseInfoBaseImpl::s_ti_by_name)[tinfo.name()] = &tinfo;
570 for (BaseInfoBaseImpl::ti_copyconversion_type::iterator it =
571 m_impl->m_ti_copyconversion_map.begin();
572 it !=
m_impl->m_ti_copyconversion_map.end();
608 if (!BaseInfoBaseImpl::s_bi_by_ti)
return 0;
609 BaseInfoBaseImpl::bi_by_ti_map_type::iterator i =
610 BaseInfoBaseImpl::s_bi_by_ti->find (&tinfo);
611 if (i != BaseInfoBaseImpl::s_bi_by_ti->end()) {
625 if (!BaseInfoBaseImpl::s_init_list)
break;
626 BaseInfoBaseImpl::bi_by_ti_map_type::iterator i =
627 BaseInfoBaseImpl::s_bi_by_ti->find (&tinfo);
628 if (i != BaseInfoBaseImpl::s_bi_by_ti->end())
630 BaseInfoBaseImpl::init_list_t::iterator it =
631 BaseInfoBaseImpl::s_init_list->find (&tinfo);
632 if (it == BaseInfoBaseImpl::s_init_list->end())
break;
634 BaseInfoBaseImpl::s_init_list->erase (it);
658 const std::type_info* tinfo2 =
nullptr;
661 if (BaseInfoBaseImpl::s_ti_by_name) {
662 BaseInfoBaseImpl::ti_by_name_map_type::iterator i =
663 BaseInfoBaseImpl::s_ti_by_name->find (tinfo.name());
664 if (i != BaseInfoBaseImpl::s_ti_by_name->end() && i->second != &tinfo) {
670 bib =
find1 (*tinfo2);
677 if (
impl.m_clid == CLID_NULL)
694 if (!BaseInfoBaseImpl::s_init_list)
695 BaseInfoBaseImpl::s_init_list =
697 BaseInfoBaseImpl::s_init_list->insert (std::make_pair (tinfo, init_func));
699 if (BaseInfoBaseImpl::s_bi_by_ti) {
700 auto i = BaseInfoBaseImpl::s_bi_by_ti->find (tinfo);
701 if (i != BaseInfoBaseImpl::s_bi_by_ti->end()) {
704 impl.m_needs_init =
true;
705 if (
impl.m_clid == CLID_NULL)
722 bool needs_init =
false;
723 const std::type_info* ti =
nullptr;
726 needs_init =
m_impl->m_needs_init;
756 std::println (
"map:");
757 if (BaseInfoBaseImpl::s_bi_by_ti) {
758 std::vector<const std::type_info*> vv;
759 for (
const auto&
x : *BaseInfoBaseImpl::s_bi_by_ti)
760 vv.push_back (
x.first);
762 for (
const std::type_info* ti : vv)
764 const BaseInfoBase* bib = (*BaseInfoBaseImpl::s_bi_by_ti)[ti];
765 std::println (
"{} {} [{}]",
766 static_cast<const void*
>(ti),
767 bib->
clid(), System::typeinfoName (*ti));
771 std::println (
"\ninitlist:");
772 if (BaseInfoBaseImpl::s_init_list) {
773 for (
const auto&
x : *BaseInfoBaseImpl::s_init_list)
774 std::println (
"{} {} [{}]",
775 static_cast<const void*
>(
x.first),
776 reinterpret_cast<const void*
>(
x.second),
777 System::typeinfoName (*
x.first));
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.