00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef FXOBJECT_H
00025 #define FXOBJECT_H
00026
00027
00028 namespace FX {
00029
00030
00031 enum {
00032 MINKEY = 0,
00033 MAXKEY = 65535
00034 };
00035
00036
00037
00038 enum {
00039 MINTYPE = 0,
00040 MAXTYPE = 65535
00041 };
00042
00043
00044
00045 typedef FXuint FXSelector;
00046
00047
00048 class FXObject;
00049
00050
00051
00052 class FXAPI FXMetaClass {
00053 private:
00054 const FXchar *className;
00055 FXObject* (*manufacture)();
00056 const FXMetaClass *baseClass;
00057 const void *assoc;
00058 FXuint nassocs;
00059 FXuint assocsz;
00060 private:
00061 static const FXMetaClass **metaClassTable;
00062 static FXuint nmetaClassTable;
00063 static FXuint nmetaClasses;
00064 private:
00065 static void resize(FXuint n);
00066 public:
00067 FXMetaClass(const FXchar* name,FXObject *(fac)(),const FXMetaClass* base,const void* ass,FXuint nass,FXuint assz);
00068
00069
00070 bool isSubClassOf(const FXMetaClass* metaclass) const;
00071
00072
00073 FXObject* makeInstance() const;
00074
00075
00076 const FXchar* getClassName() const { return className; }
00077
00078
00079 const FXMetaClass* getBaseClass() const { return baseClass; }
00080
00081
00082 static const FXMetaClass* getMetaClassFromName(const FXchar* name);
00083
00084
00085 const void* search(FXSelector key) const;
00086
00087 ~FXMetaClass();
00088 };
00089
00090
00091
00092 #define FXDECLARE(classname) \
00093 public: \
00094 struct FXMapEntry { FX::FXSelector keylo; FX::FXSelector keyhi; long (classname::* func)(FX::FXObject*,FX::FXSelector,void*); }; \
00095 static const FX::FXMetaClass metaClass; \
00096 static FX::FXObject* manufacture(); \
00097 virtual long handle(FX::FXObject* sender,FX::FXSelector sel,void* ptr); \
00098 virtual const FX::FXMetaClass* getMetaClass() const { return &metaClass; } \
00099 friend FX::FXStream& operator<<(FX::FXStream& store,const classname* obj){return store.saveObject((FX::FXObjectPtr)(obj));} \
00100 friend FX::FXStream& operator>>(FX::FXStream& store,classname*& obj){return store.loadObject((FX::FXObjectPtr&)(obj));} \
00101 private:
00102
00103
00104
00105 #define FXIMPLEMENT(classname,baseclassname,mapping,nmappings) \
00106 FX::FXObject* classname::manufacture(){return new classname;} \
00107 const FX::FXMetaClass classname::metaClass(#classname,classname::manufacture,&baseclassname::metaClass,mapping,nmappings,sizeof(classname::FXMapEntry)); \
00108 long classname::handle(FX::FXObject* sender,FX::FXSelector sel,void* ptr){ \
00109 const FXMapEntry* me=(const FXMapEntry*)metaClass.search(sel); \
00110 return me ? (this->* me->func)(sender,sel,ptr) : baseclassname::handle(sender,sel,ptr); \
00111 }
00112
00113
00114
00115 #define FXDECLARE_ABSTRACT(classname) \
00116 public: \
00117 struct FXMapEntry { FX::FXSelector keylo; FX::FXSelector keyhi; long (classname::* func)(FX::FXObject*,FX::FXSelector,void*); }; \
00118 static const FX::FXMetaClass metaClass; \
00119 virtual long handle(FX::FXObject* sender,FX::FXSelector sel,void* ptr); \
00120 virtual const FX::FXMetaClass* getMetaClass() const { return &metaClass; } \
00121 friend FX::FXStream& operator<<(FX::FXStream& store,const classname* obj){return store.saveObject((FX::FXObjectPtr)(obj));} \
00122 friend FX::FXStream& operator>>(FX::FXStream& store,classname*& obj){return store.loadObject((FX::FXObjectPtr&)(obj));} \
00123 private:
00124
00125
00126
00127 #define FXIMPLEMENT_ABSTRACT(classname,baseclassname,mapping,nmappings) \
00128 const FX::FXMetaClass classname::metaClass(#classname,NULL,&baseclassname::metaClass,mapping,nmappings,sizeof(classname::FXMapEntry)); \
00129 long classname::handle(FX::FXObject* sender,FX::FXSelector sel,void* ptr){ \
00130 const FXMapEntry* me=(const FXMapEntry*)metaClass.search(sel); \
00131 return me ? (this->* me->func)(sender,sel,ptr) : baseclassname::handle(sender,sel,ptr); \
00132 }
00133
00134
00135
00136 #define FXMETACLASS(classname) (&classname::metaClass)
00137
00138
00139
00140 #define FXDEFMAP(classname) static const classname::FXMapEntry
00141
00142
00143 #define FXMAPTYPES(typelo,typehi,func) {MKUINT(MINKEY,typelo),MKUINT(MAXKEY,typehi),&func}
00144
00145
00146 #define FXMAPTYPE(type,func) {MKUINT(MINKEY,type),MKUINT(MAXKEY,type),&func}
00147
00148
00149 #define FXMAPFUNCS(type,keylo,keyhi,func) {MKUINT(keylo,type),MKUINT(keyhi,type),&func}
00150
00151
00152 #define FXMAPFUNC(type,key,func) {MKUINT(key,type),MKUINT(key,type),&func}
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164 class FXAPI FXObject {
00165 FXDECLARE(FXObject)
00166 public:
00167
00168
00169 virtual long onDefault(FXObject*,FXSelector,void*);
00170
00171 public:
00172
00173
00174 const FXchar* getClassName() const;
00175
00176
00177 bool isMemberOf(const FXMetaClass* metaclass) const;
00178
00179
00180 virtual long tryHandle(FXObject* sender,FXSelector sel,void* ptr);
00181
00182
00183 virtual void save(FXStream& store) const;
00184
00185
00186 virtual void load(FXStream& store);
00187
00188
00189 virtual ~FXObject();
00190 };
00191
00192 }
00193
00194 #endif