FXObject.h
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
namespace FX {
00028
00029
00030
enum {
00031 MINKEY = 0,
00032 MAXKEY = 65535
00033 };
00034
00035
00036
00037
enum {
00038 MINTYPE = 0,
00039 MAXTYPE = 65535
00040 };
00041
00042
00043
00044
typedef FXuint FXSelector;
00045
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 FXuint namelen;
00061
private:
00062
static const FXMetaClass **metaClassTable;
00063
static FXuint nmetaClassTable;
00064
static FXuint nmetaClasses;
00065 private:
00066
static void resize(FXuint n);
00067
public:
00068 FXMetaClass(
const FXchar* name,
FXObject *(fac)(),
const FXMetaClass* base,
const void* ass,FXuint nass,FXuint assz,FXuint len);
00069
00070
00071 FXbool isSubClassOf(
const FXMetaClass* metaclass)
const;
00072
00073
00074
FXObject* makeInstance() const;
00075
00076
00077 const FXchar* getClassName()
const {
return className; }
00078
00079
00080 FXuint getClassNameLength()
const {
return namelen; }
00081
00082
00083
const FXMetaClass* getBaseClass()
const {
return baseClass; }
00084
00085
00086
static const FXMetaClass* getMetaClassFromName(
const FXchar* name);
00087
00088
00089
const void* search(FXSelector key)
const;
00090
00091 ~FXMetaClass();
00092 };
00093
00094
00095
00096
#define FXDECLARE(classname) \
00097
public: \
00098
struct FXMapEntry { FX::FXSelector keylo; FX::FXSelector keyhi; long (classname::* func)(FX::FXObject*,FX::FXSelector,void*); }; \
00099
static const FX::FXMetaClass metaClass; \
00100
static FX::FXObject* manufacture(); \
00101
virtual long handle(FX::FXObject* sender,FX::FXSelector sel,void* ptr); \
00102
virtual const FX::FXMetaClass* getMetaClass() const { return &metaClass; } \
00103
friend FX::FXStream& operator<<(FX::FXStream& store,const classname* obj){return store.saveObject((FX::FXObjectPtr)(obj));} \
00104
friend FX::FXStream& operator>>(FX::FXStream& store,classname*& obj){return store.loadObject((FX::FXObjectPtr&)(obj));} \
00105
private:
00106
00107
00108
00109
#define FXIMPLEMENT(classname,baseclassname,mapping,nmappings) \
00110
FX::FXObject* classname::manufacture(){return new classname;} \
00111
const FX::FXMetaClass classname::metaClass(#classname,classname::manufacture,&baseclassname::metaClass,mapping,nmappings,sizeof(classname::FXMapEntry),sizeof(#classname)); \
00112
long classname::handle(FX::FXObject* sender,FX::FXSelector sel,void* ptr){ \
00113
const FXMapEntry* me=(const FXMapEntry*)metaClass.search(sel); \
00114
return me ? (this->* me->func)(sender,sel,ptr) : baseclassname::handle(sender,sel,ptr); \
00115
}
00116
00117
00118
00119
#define FXDECLARE_ABSTRACT(classname) \
00120
public: \
00121
struct FXMapEntry { FX::FXSelector keylo; FX::FXSelector keyhi; long (classname::* func)(FX::FXObject*,FX::FXSelector,void*); }; \
00122
static const FX::FXMetaClass metaClass; \
00123
virtual long handle(FX::FXObject* sender,FX::FXSelector sel,void* ptr); \
00124
virtual const FX::FXMetaClass* getMetaClass() const { return &metaClass; } \
00125
friend FX::FXStream& operator<<(FX::FXStream& store,const classname* obj){return store.saveObject((FX::FXObjectPtr)(obj));} \
00126
friend FX::FXStream& operator>>(FX::FXStream& store,classname*& obj){return store.loadObject((FX::FXObjectPtr&)(obj));} \
00127
private:
00128
00129
00130
00131
#define FXIMPLEMENT_ABSTRACT(classname,baseclassname,mapping,nmappings) \
00132
const FX::FXMetaClass classname::metaClass(#classname,NULL,&baseclassname::metaClass,mapping,nmappings,sizeof(classname::FXMapEntry),sizeof(#classname)); \
00133
long classname::handle(FX::FXObject* sender,FX::FXSelector sel,void* ptr){ \
00134
const FXMapEntry* me=(const FXMapEntry*)metaClass.search(sel); \
00135
return me ? (this->* me->func)(sender,sel,ptr) : baseclassname::handle(sender,sel,ptr); \
00136
}
00137
00138
00139
00140
#define FXMETACLASS(classname) (&classname::metaClass)
00141
00142
00143
00144
#define FXDEFMAP(classname) static const classname::FXMapEntry
00145
00146
00147
#define FXMAPTYPES(typelo,typehi,func) {MKUINT(MINKEY,typelo),MKUINT(MAXKEY,typehi),&func}
00148
00149
00150
#define FXMAPTYPE(type,func) {MKUINT(MINKEY,type),MKUINT(MAXKEY,type),&func}
00151
00152
00153
#define FXMAPFUNCS(type,keylo,keyhi,func) {MKUINT(keylo,type),MKUINT(keyhi,type),&func}
00154
00155
00156
#define FXMAPFUNC(type,key,func) {MKUINT(key,type),MKUINT(key,type),&func}
00157
00158
00159
00160
class FXAPI FXObject {
00161 FXDECLARE(FXObject)
00162 public:
00163
00164
00165 virtual
long onDefault(FXObject*,FXSelector,
void*);
00166
00167 public:
00168
00169
00170 const FXchar* getClassName() const;
00171
00172
00173 FXbool isMemberOf(const FXMetaClass* metaclass) const;
00174
00175
00176 virtual
void save(
FXStream& store) const;
00177
00178
00179 virtual
void load(
FXStream& store);
00180
00181
00182 virtual ~FXObject();
00183 };
00184
00185 }
00186
00187 #endif