![]() |
Main Page Class Hierarchy Alphabetical List Compound List File List Compound Members
![]() |
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