3 * - By John Hodge (thePowersGang)
6 * - typeid and dynamic_cast
10 #include <acess/sys.h>
15 type_info::~type_info()
20 bool type_info::operator==(const type_info& other) const
22 //_SysDebug("type_info::operator== - '%s' == '%s'", this->__type_name, other.__type_name);
23 return this->__type_name == other.__type_name;
26 bool type_info::operator!=(const type_info& other) const
28 //_SysDebug("type_info::operator!= - '%s' != '%s'", this->__type_name, other.__type_name);
29 return this->__type_name != other.__type_name;
32 bool type_info::before(const type_info& other) const
34 //_SysDebug("type_info::before - '%s' < '%s'", this->__type_name, other.__type_name);
35 return this->__type_name < other.__type_name;
38 const char *type_info::name() const
40 return this->__type_name;
44 type_info::type_info(const type_info& rhs):
45 __type_name(rhs.__type_name)
48 type_info& type_info::operator=(const type_info& rhs)
50 __type_name = rhs.__type_name;
54 bool type_info::is_class() const
56 if( typeid(*this) == typeid(::__cxxabiv1::__class_type_info) )
63 bool type_info::is_subclass() const
65 if( typeid(*this) == typeid(::__cxxabiv1::__si_class_type_info) )
67 if( typeid(*this) == typeid(::__cxxabiv1::__vmi_class_type_info) )
73 bool type_info::__is_child(const type_info &poss_child, unsigned long &offset) const
75 // Check #1: Child is same type
76 if( poss_child == *this ) {
81 _SysDebug("typeids = this:%s , poss_child:%s", typeid(*this).name(), typeid(poss_child).name());
83 // Check #2: This type must be a class
84 if( !this->is_class() ) {
87 // Check #3: Child class must be a subclass
88 if( !poss_child.is_subclass() ) {
92 if( typeid(poss_child) == typeid(::__cxxabiv1::__si_class_type_info) ) {
93 auto &si_poss_child = reinterpret_cast<const ::__cxxabiv1::__si_class_type_info&>(poss_child);
95 _SysDebug("type_info::__is_child - Single inheritance");
96 return __is_child( *si_poss_child.__base_type, offset );
98 else if( typeid(poss_child) == typeid(::__cxxabiv1::__vmi_class_type_info) ) {
99 // Multiple inheritance
100 _SysDebug("TODO: type_info::__is_child - Multiple inheritance");
105 _SysDebug("ERROR: type_info::__is_child - Reported subclass type, but not a subclass %s",
106 typeid(poss_child).name()
113 // NOTE: Not defined by the C++ ABI, but is similar to one defined by GCC (__cxa_type_match
114 //bool __acess_type_match(std::typeinfo& possibly_derived, const std::typeinfo& base_type)