31907ee10c2eb36b592294941ee93b2dab00ad0a
[tpg/acess2.git] / Usermode / Libraries / libc++.so_src / typeinfo.cc
1 /*
2  * Acess2 C++ Library
3  * - By John Hodge (thePowersGang)
4  *
5  * typeinfo.cc
6  * - typeid and dynamic_cast
7  */
8 #include <typeinfo>
9 #include <cxxabi.h>
10 #include <acess/sys.h>
11 #include <cstdlib>
12
13 namespace std {
14
15 type_info::~type_info()
16 {
17         // nop
18 }
19
20 bool type_info::operator==(const type_info& other) const
21 {
22         //_SysDebug("type_info::operator== - '%s' == '%s'", this->__type_name, other.__type_name);
23         return this->__type_name == other.__type_name;
24 }
25
26 bool type_info::operator!=(const type_info& other) const
27 {
28         //_SysDebug("type_info::operator!= - '%s' != '%s'", this->__type_name, other.__type_name);
29         return this->__type_name != other.__type_name;
30 }
31
32 bool type_info::before(const type_info& other) const
33 {
34         //_SysDebug("type_info::before - '%s' < '%s'", this->__type_name, other.__type_name);
35         return this->__type_name < other.__type_name;
36 }
37
38 const char *type_info::name() const
39 {
40         return this->__type_name;
41 }
42
43 // Private
44 type_info::type_info(const type_info& rhs):
45         __type_name(rhs.__type_name)
46 {
47 }
48 type_info& type_info::operator=(const type_info& rhs)
49 {
50         _SysDebug("type_info::operator=, was %s now %s", __type_name, rhs.__type_name);
51         __type_name = rhs.__type_name;
52         return *this;
53 }
54
55 bool type_info::is_class() const
56 {
57         if( typeid(*this) == typeid(::__cxxabiv1::__class_type_info) )
58                 return true;
59         if( is_subclass() )
60                 return true;
61         return false;
62 }
63
64 bool type_info::is_subclass() const
65 {
66         if( typeid(*this) == typeid(::__cxxabiv1::__si_class_type_info) )
67                 return true;
68         if( typeid(*this) == typeid(::__cxxabiv1::__vmi_class_type_info) )
69                 return true;
70         return false;
71 }
72
73 // Acess-defined
74 bool type_info::__is_child(const type_info &poss_child, unsigned long &offset) const
75 {
76         _SysDebug("typeids = this:%s , poss_child:%s", typeid(*this).name(), typeid(poss_child).name());
77
78         // Check #1: Child is same type
79         if( poss_child == *this ) {
80                 offset = 0;
81                 return true;
82         }
83         
84         // Check #2: This type must be a class
85         if( !this->is_class() ) {
86                 return false;
87         }
88         // Check #3: Child class must be a subclass
89         if( !poss_child.is_subclass() ) {
90                 return false;
91         }
92         
93         if( typeid(poss_child) == typeid(::__cxxabiv1::__si_class_type_info) ) {
94                 auto &si_poss_child = reinterpret_cast<const ::__cxxabiv1::__si_class_type_info&>(poss_child);
95                 // Single inheritance
96                 _SysDebug("type_info::__is_child - Single inheritance");
97                 return __is_child( *si_poss_child.__base_type, offset );
98         }
99         else if( typeid(poss_child) == typeid(::__cxxabiv1::__vmi_class_type_info) ) {
100                 // Multiple inheritance
101                 _SysDebug("TODO: type_info::__is_child - Multiple inheritance");
102                 abort();
103                 for(;;);
104         }
105         else {
106                 // Oops!
107                 _SysDebug("ERROR: type_info::__is_child - Reported subclass type, but not a subclass %s",
108                         typeid(poss_child).name()
109                         );
110                 abort();
111                 for(;;);
112         }
113 }
114
115
116 // NOTE: Not defined by the C++ ABI, but is similar to one defined by GCC (__cxa_type_match
117 //bool __acess_type_match(std::typeinfo& possibly_derived, const std::typeinfo& base_type)
118 //{
119 //      return false;
120 //}
121
122 };      // namespace std

UCC git Repository :: git.ucc.asn.au