Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members

FXObject.h

00001 /********************************************************************************
00002 *                                                                               *
00003 *                         T o p l e v el   O b j e c t                          *
00004 *                                                                               *
00005 *********************************************************************************
00006 * Copyright (C) 1997,2002 by Jeroen van der Zijp.   All Rights Reserved.        *
00007 *********************************************************************************
00008 * This library is free software; you can redistribute it and/or                 *
00009 * modify it under the terms of the GNU Lesser General Public                    *
00010 * License as published by the Free Software Foundation; either                  *
00011 * version 2.1 of the License, or (at your option) any later version.            *
00012 *                                                                               *
00013 * This library is distributed in the hope that it will be useful,               *
00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of                *
00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU             *
00016 * Lesser General Public License for more details.                               *
00017 *                                                                               *
00018 * You should have received a copy of the GNU Lesser General Public              *
00019 * License along with this library; if not, write to the Free Software           *
00020 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.    *
00021 *********************************************************************************
00022 * $Id: FXObject.h,v 1.16 2002/01/18 22:42:54 jeroen Exp $                       *
00023 ********************************************************************************/
00024 #ifndef FXOBJECT_H
00025 #define FXOBJECT_H
00026 
00027 
00028 // Minimum and maximum keys
00029 #define MINKEY    0
00030 #define MAXKEY    65535
00031 
00032 
00033 // Minimum and maximum types
00034 #define MINTYPE   0
00035 #define MAXTYPE   65535
00036 
00037 
00038 // Association key
00039 typedef FXuint FXSelector;
00040 
00041 
00042 // Forward
00043 class FXObject;
00044 
00045 
00046 
00047 /// Describes a FOX object
00048 struct FXAPI FXMetaClass {
00049   const FXchar       *className;
00050   FXObject*         (*manufacture)();
00051   const FXMetaClass  *baseClass;
00052   const void         *assoc;
00053   FXuint              nassocs;
00054   FXuint              assocsz;
00055   FXuint              namelen;
00056 
00057   /// Check if metaclass is subclass of some other metaclass
00058   FXbool isSubClassOf(const FXMetaClass* metaclass) const;
00059 
00060   /// Make instance of some object
00061   FXObject* makeInstance() const;
00062 
00063   /// Ask class name
00064   const FXchar* getClassName() const { return className; }
00065 
00066   /// Ask base class
00067   const FXMetaClass* getBaseClass() const { return baseClass; }
00068 
00069   /// Find metaclass object
00070   static const FXMetaClass* getMetaClassFromName(const FXchar* name);
00071 
00072   /// Search message map
00073   const void* search(FXSelector key) const;
00074   };
00075 
00076 
00077 // Pre-runtime initializer
00078 class FXAPI __FXMETACLASSINITIALIZER__ {
00079 public:
00080   __FXMETACLASSINITIALIZER__(const FXMetaClass* meta);
00081   };
00082 
00083 
00084 /// Macro to set up class declaration
00085 #define FXDECLARE(classname) \
00086   public: \
00087    struct FXMapEntry { FXSelector keylo; FXSelector keyhi; long (classname::* func)(FXObject*,FXSelector,void*); }; \
00088    static const FXMetaClass metaClass; \
00089    static FXObject* manufacture(); \
00090    virtual long handle(FXObject* sender,FXSelector sel,void* ptr); \
00091    virtual const FXMetaClass* getMetaClass() const { return &metaClass; } \
00092    friend FXStream& operator<<(FXStream& store,const classname* obj){return store.saveObject((FXObjectPtr)(obj));} \
00093    friend FXStream& operator>>(FXStream& store,classname*& obj){return store.loadObject((FXObjectPtr&)(obj));} \
00094   private:
00095 
00096 
00097 /// Macro to set up class implementation
00098 #define FXIMPLEMENT(classname,baseclassname,mapping,nmappings) \
00099   FXObject* classname::manufacture(){return new classname;} \
00100   const FXMetaClass classname::metaClass={#classname,classname::manufacture,&baseclassname::metaClass,mapping,nmappings,sizeof(classname::FXMapEntry),sizeof(#classname)}; \
00101   __FXMETACLASSINITIALIZER__ classname##Initializer(&classname::metaClass); \
00102   long classname::handle(FXObject* sender,FXSelector sel,void* ptr){ \
00103     const FXMapEntry* me=(const FXMapEntry*)metaClass.search(sel); \
00104     return me ? (this->* me->func)(sender,sel,ptr) : baseclassname::handle(sender,sel,ptr); \
00105     }
00106 
00107 
00108 /// Macro to set up abstract class declaration
00109 #define FXDECLARE_ABSTRACT(classname) \
00110   public: \
00111    struct FXMapEntry { FXSelector keylo; FXSelector keyhi; long (classname::* func)(FXObject*,FXSelector,void*); }; \
00112    static const FXMetaClass metaClass; \
00113    virtual long handle(FXObject* sender,FXSelector sel,void* ptr); \
00114    virtual const FXMetaClass* getMetaClass() const { return &metaClass; } \
00115    friend FXStream& operator<<(FXStream& store,const classname* obj){return store.saveObject((FXObjectPtr)(obj));} \
00116    friend FXStream& operator>>(FXStream& store,classname*& obj){return store.loadObject((FXObjectPtr&)(obj));} \
00117   private:
00118 
00119 
00120 /// Macro to set up abstract class implementation
00121 #define FXIMPLEMENT_ABSTRACT(classname,baseclassname,mapping,nmappings) \
00122   const FXMetaClass classname::metaClass={#classname,NULL,&baseclassname::metaClass,mapping,nmappings,sizeof(classname::FXMapEntry),sizeof(#classname)}; \
00123   __FXMETACLASSINITIALIZER__ classname##Initializer(&classname::metaClass); \
00124   long classname::handle(FXObject* sender,FXSelector sel,void* ptr){ \
00125     const FXMapEntry* me=(const FXMapEntry*)metaClass.search(sel); \
00126     return me ? (this->* me->func)(sender,sel,ptr) : baseclassname::handle(sender,sel,ptr); \
00127     }
00128 
00129 
00130 /// MetaClass of a class
00131 #define FXMETACLASS(classname) (&classname::metaClass)
00132 
00133 
00134 /// Set up map type
00135 #define FXDEFMAP(classname) static const classname::FXMapEntry
00136 
00137 /// Define range of function types
00138 #define FXMAPTYPES(typelo,typehi,func) {MKUINT(MINKEY,typelo),MKUINT(MAXKEY,typehi),&func}
00139 
00140 /// Define range of function types
00141 #define FXMAPTYPE(type,func) {MKUINT(MINKEY,type),MKUINT(MAXKEY,type),&func}
00142 
00143 /// Define range of functions
00144 #define FXMAPFUNCS(type,keylo,keyhi,func) {MKUINT(keylo,type),MKUINT(keyhi,type),&func}
00145 
00146 /// Define one function
00147 #define FXMAPFUNC(type,key,func) {MKUINT(key,type),MKUINT(key,type),&func}
00148 
00149 
00150 /// Base of all FOX object
00151 class FXAPI FXObject {
00152   FXDECLARE(FXObject)
00153 public:
00154 
00155   /// Called for unhandled messages
00156   virtual long onDefault(FXObject*,FXSelector,void*);
00157 
00158 public:
00159 
00160   /// Get class name of some object
00161   const FXchar* getClassName() const;
00162 
00163   /// Check if object is member of metaclass
00164   FXbool isMemberOf(const FXMetaClass* metaclass) const;
00165 
00166   /// Save object to stream
00167   virtual void save(FXStream& store) const;
00168 
00169   /// Load object from stream
00170   virtual void load(FXStream& store);
00171 
00172   /// Virtual destructor
00173   virtual ~FXObject();
00174   };
00175 
00176 
00177 #endif