00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #if !defined(__INCLUDE_MetaClassh_INCLUDE__)
00022 #define __INCLUDE_MetaClassh_INCLUDE__
00023
00024 #include <string>
00025 #include <map>
00026
00027 #define REGISTER_CLASS_HEADER(x) \
00028 \
00029 class METAFACTORY_##x : public MetaClassFactory \
00030 { \
00031 virtual MetaClass *getClassCopy() { return new x ; } \
00032 }; \
00033 virtual const char *getClassName() { return #x ; } \
00034 virtual unsigned int getMetaClassId() \
00035 { \
00036 static unsigned int metaClassID = nextMetaClassId_++; return metaClassID; \
00037 }
00038
00039 #define REGISTER_CLASS_SOURCE(x) \
00040 struct META_##x { META_##x() { MetaClassRegistration::addMap(#x , new x::METAFACTORY_##x ); } }; \
00041 static META_##x META_IMPL_##x ;
00042
00043 class MetaClass
00044 {
00045 public:
00046 MetaClass();
00047 virtual ~MetaClass();
00048
00049
00050
00051
00052 virtual unsigned int getMetaClassId() = 0;
00053 virtual const char *getClassName() = 0;
00054 protected:
00055 static unsigned int nextMetaClassId_;
00056 };
00057
00058 class MetaClassFactory
00059 {
00060 public:
00061 MetaClassFactory();
00062 virtual ~MetaClassFactory();
00063
00064
00065
00066
00067 virtual MetaClass *getClassCopy() = 0;
00068 };
00069
00070 class MetaClassRegistration
00071 {
00072 public:
00073 static void addMap(const char *name, MetaClassFactory *mclass);
00074 static std::map<std::string, MetaClassFactory *> *classMap;
00075 static MetaClass *getNewClass(const char *name);
00076 static MetaClassFactory *getFactory(const char *name);
00077 };
00078
00079 #endif // __INCLUDE_MetaClassh_INCLUDE__