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