00001
00025 #ifndef __DYNAMIC_H__
00026 #define __DYNAMIC_H__
00027
00028 #ifndef BEGIN_NAMESPACE
00029 #define BEGIN_NAMESPACE(ns) namespace ns {
00030 #ifdef QT_VERSION
00031 #define END_NAMESPACE }
00032 #else
00033 #define END_NAMESPACE } using namespace MagiC;
00034 #endif
00035 #endif
00036
00037 BEGIN_NAMESPACE(MagiC);
00038
00039 class Object;
00040
00043 class GetClassInstance {
00044 public:
00045 virtual Object* getInstance ()=0;
00046 };
00047
00048 #define CLONEMETHOD(cls) cls* clone () const {return new cls (*this);}
00049 #define decl_clonable(classname) public: CLONEMETHOD (classname) private:
00050
00055 #define decl_dynamic(classname) \
00056 static Class class_##classname;\
00057 public:\
00058 virtual const Class& getclass () const {return class_##classname;}\
00059 protected:
00060
00061
00062
00067 #define impl_dynamic(classname,bases) \
00068 class GetInstance_##classname : public GetClassInstance {\
00069 public: Object* getInstance(){return new classname();}\
00070 };\
00071 Class classname::class_##classname (#classname, #bases, new GetInstance_##classname());\
00072
00073
00074
00075
00076
00079 #define impl_abstract(classname,bases) \
00080 Class classname::class_##classname (#classname, #bases, NULL);\
00081
00082
00083
00084
00085
00086
00089 #define newobj(classname) \
00090 ((classname*) & ClassLib::getinstance(#classname))
00091
00094 #define dyncreate(classname) \
00095 (&ClassLib::getinstance(classname))
00096
00097
00098
00099
00100 END_NAMESPACE;
00101
00102 #endif
00103