00001 #ifndef __FIELD_H__
00002 #define __FIELD_H__
00003
00004 #include <string.h>
00005
00009 enum RTTIFieldFlags {
00010 RTTI_FLD_INSTANCE = 0x0001,
00011 RTTI_FLD_STATIC = 0x0002,
00012 RTTI_FLD_CONST = 0x0004,
00013 RTTI_FLD_PUBLIC = 0x0010,
00014 RTTI_FLD_PROTECTED = 0x0020,
00015 RTTI_FLD_PRIVATE = 0x0040,
00016 RTTI_FLD_VIRTUAL = 0x0100,
00017 RTTI_FLD_VOLATILE = 0x0200,
00018 RTTI_FLD_TRANSIENT = 0x0400
00019 };
00020
00021
00025 class RTTIFieldDescriptor {
00026 public:
00031 char const* getName() {
00032 return name;
00033 }
00034
00042 void setValue(void* obj, void* buf) {
00043 memcpy((char*)obj + offs, buf, size);
00044 }
00045
00053 void getValue(void* obj, void* buf) {
00054 memcpy(buf, (char*)obj + offs, size);
00055 }
00056
00061 RTTIClassDescriptor* getDelcaringClass() {
00062 return declaringClass;
00063 }
00064
00069 int getOffset() {
00070 return offs;
00071 }
00072
00077 int getSize() {
00078 return size;
00079 }
00080
00085 RTTIType* getType() {
00086 return type;
00087 }
00088
00093 int getFlags() {
00094 return flags;
00095 }
00096
00097
00106 RTTIFieldDescriptor(char const* name, int offs, int size, int flags, RTTIType* type) {
00107 this->name = name;
00108 this->offs = offs;
00109 this->size = size;
00110 this->type = type;
00111 this->flags = flags;
00112 next = NULL;
00113 chain = &next;
00114 }
00115
00122 RTTIFieldDescriptor& operator, (RTTIFieldDescriptor& field) {
00123 *chain = &field;
00124 chain = &field.next;
00125 return *this;
00126 }
00127
00132 int getIndex() {
00133 return index;
00134 }
00135
00139 ~RTTIFieldDescriptor() {
00140 type->destroy();
00141 }
00142 protected:
00143 friend class RTTIType;
00144 friend class RTTIClassDescriptor;
00145 friend class RTTIBfdRepository;
00146
00147 int flags;
00148 int index;
00149 RTTIType* type;
00150 int offs;
00151 int size;
00152 char const* name;
00153
00154 RTTIClassDescriptor* declaringClass;
00155
00156 RTTIFieldDescriptor* next;
00157 RTTIFieldDescriptor** chain;
00158 };
00159
00160 #endif