00001 #ifndef __METHOD_H__ 00002 #define __METHOD_H__ 00003 00007 enum RTTIMethodFlags { 00008 RTTI_MTH_INSTANCE = RTTI_FLD_INSTANCE, 00009 RTTI_MTH_STATIC = RTTI_FLD_STATIC, 00010 RTTI_MTH_CONST = RTTI_FLD_CONST, 00011 RTTI_MTH_PUBLIC = RTTI_FLD_PUBLIC, 00012 RTTI_MTH_PROTECTED = RTTI_FLD_PROTECTED, 00013 RTTI_MTH_PRIVATE = RTTI_FLD_PRIVATE, 00014 RTTI_MTH_VIRTUAL = RTTI_FLD_VIRTUAL, 00015 RTTI_MTH_ABSTRACT = 0x0200 00016 }; 00017 00018 00022 class RTTIMethodDescriptor { 00023 public: 00027 char const* getName() { 00028 return name; 00029 } 00030 00035 RTTIMethodType* getType() { 00036 return type; 00037 } 00038 00043 int getFlags() { 00044 return flags; 00045 } 00046 00047 00055 void getMethodDeclaration(char* buf) { 00056 type->getMethodDeclaration(buf, name); 00057 } 00058 00065 void invoke(void* result, void* obj, void* parameters[]) { 00066 type->invoke(result, obj, parameters); 00067 } 00068 00073 RTTIClassDescriptor* getDeclaringClass() { 00074 return type->getClass(); 00075 } 00076 00083 RTTIMethodDescriptor(char const* name, int flags, RTTIMethodType* type) { 00084 this->name = name; 00085 this->flags = flags; 00086 this->type = type; 00087 type->isStatic = (flags & RTTI_MTH_STATIC) != 0; 00088 next = NULL; 00089 chain = &next; 00090 } 00091 00098 RTTIMethodDescriptor& operator, (RTTIMethodDescriptor& method) { 00099 *chain = &method; 00100 chain = &method.next; 00101 return *this; 00102 } 00103 00107 ~RTTIMethodDescriptor() { 00108 type->destroy(); 00109 } 00110 00115 int getIndex() { 00116 return index; 00117 } 00118 00119 protected: 00120 friend class RTTIType; 00121 friend class RTTIClassDescriptor; 00122 friend class RTTIBfdRepository; 00123 00124 00125 int flags; 00126 int index; 00127 RTTIMethodType* type; 00128 char const* name; 00129 00130 RTTIMethodDescriptor* next; 00131 RTTIMethodDescriptor** chain; 00132 }; 00133 00134 #endif