00001 #ifndef __TYPE_H__ 00002 #define __TYPE_H__ 00003 00004 #include <string.h> 00005 00006 class RTTIClassDescriptor; 00007 class RTTIFieldDescriptor; 00008 00012 class RTTI_DLL_ENTRY RTTIType { 00013 public: 00018 int getTag() { 00019 return tag; 00020 } 00021 00026 virtual void getTypeName(char* buf); 00027 00028 static RTTIType voidType; 00029 static RTTIType charType; 00030 static RTTIType ucharType; 00031 static RTTIType scharType; 00032 static RTTIType shortType; 00033 static RTTIType ushortType; 00034 static RTTIType intType; 00035 static RTTIType uintType; 00036 static RTTIType longType; 00037 static RTTIType ulongType; 00038 static RTTIType floatType; 00039 static RTTIType doubleType; 00040 static RTTIType boolType; 00041 static RTTIType unknownType; 00042 00043 enum TypeTag { 00044 RTTI_UNKNOWN, 00045 RTTI_VOID, 00046 RTTI_CHAR, 00047 RTTI_UCHAR, 00048 RTTI_SCHAR, 00049 RTTI_SHORT, 00050 RTTI_USHORT, 00051 RTTI_INT, 00052 RTTI_UINT, 00053 RTTI_LONG, 00054 RTTI_ULONG, 00055 RTTI_FLOAT, 00056 RTTI_DOUBLE, 00057 RTTI_BOOL, 00058 RTTI_ARRAY, 00059 RTTI_STRUCT, 00060 RTTI_PTR, 00061 RTTI_DERIVED, 00062 RTTI_METHOD 00063 }; 00064 00068 bool isBuiltin() { 00069 return tag <= RTTI_BOOL; 00070 } 00071 00075 bool isScalar() { 00076 return tag > RTTI_VOID && tag <= RTTI_BOOL; 00077 } 00078 00082 bool isArray() { 00083 return tag == RTTI_ARRAY; 00084 } 00085 00089 bool isPointer() { 00090 return tag == RTTI_PTR; 00091 } 00092 00096 bool isClass() { 00097 return tag == RTTI_STRUCT; 00098 } 00099 00103 bool isBaseClass() { 00104 return tag == RTTI_DERIVED; 00105 } 00106 00110 ~RTTIType(); 00111 00112 protected: 00113 friend class RTTIClassDescriptor; 00114 friend class RTTIFieldDescriptor; 00115 friend class RTTIMethodDescriptor; 00116 00117 int tag; 00118 00119 void destroy() { 00120 if (!isBuiltin()) { 00121 delete this; 00122 } 00123 } 00124 00125 RTTIType(int tag) { 00126 this->tag = tag; 00127 } 00128 }; 00129 00130 00134 class RTTI_DLL_ENTRY RTTIPtrType : public RTTIType { 00135 public: 00136 RTTIPtrType(RTTIType* ptrType) : RTTIType(RTTI_PTR) { 00137 this->ptrType = ptrType; 00138 } 00139 void getTypeName(char* buf); 00140 protected: 00141 RTTIType* ptrType; 00142 }; 00143 00147 class RTTI_DLL_ENTRY RTTIArrayType : public RTTIType { 00148 public: 00149 RTTIArrayType(RTTIType* elemType, int nElems) : RTTIType(RTTI_ARRAY) { 00150 this->elemType = elemType; 00151 this->nElems = nElems; 00152 } 00153 void getTypeName(char* buf); 00154 00155 int getArraySize() { 00156 return nElems; 00157 } 00158 00159 RTTIType* getElementType() { 00160 return elemType; 00161 } 00162 00163 protected: 00164 RTTIType* elemType; 00165 int nElems; 00166 }; 00167 00171 class RTTI_DLL_ENTRY RTTIDerivedType : public RTTIType { 00172 public: 00173 RTTIDerivedType(RTTIClassDescriptor* baseClass) : RTTIType(RTTI_DERIVED) { 00174 this->baseClass = baseClass; 00175 } 00176 00177 RTTIClassDescriptor* getBaseClass() { 00178 return baseClass; 00179 } 00180 00181 void getTypeName(char* buf); 00182 00183 protected: 00184 RTTIClassDescriptor* baseClass; 00185 }; 00186 00190 class RTTI_DLL_ENTRY RTTIMethodType : public RTTIType { 00191 public: 00192 void getTypeName(char* buf); 00193 00194 void getMethodDeclaration(char* buf, char const* name); 00195 00196 virtual void invoke(void* result, void* obj, void* parameters[]) = 0; 00197 00198 RTTIClassDescriptor* getClass() { 00199 return methodClass; 00200 } 00201 00202 RTTIType* getReturnType() { 00203 return returnType; 00204 } 00205 00206 RTTIType** getParameterTypes() { 00207 return paramTypes; 00208 } 00209 00210 int getNumberOfParameters() { 00211 return nParams; 00212 } 00213 00214 RTTIMethodType() : RTTIType(RTTI_METHOD) {} 00215 ~RTTIMethodType() { 00216 delete[] paramTypes; 00217 } 00218 protected: 00219 friend class RTTIMethodDescriptor; 00220 friend class RTTIBfdRepository; 00221 00222 RTTIType* returnType; 00223 int nParams; 00224 RTTIType** paramTypes; 00225 RTTIClassDescriptor* methodClass; 00226 bool isStatic; 00227 }; 00228 00229 00230 #endif 00231