00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef __SIM_DataUtils_h__
00015 #define __SIM_DataUtils_h__
00016
00017 #include "SIM_Data.h"
00018 #include "SIM_DataFactory.h"
00019 #include "SIM_Utils.h"
00020
00021
00022
00023 #define DECLARE_CLASSNAME(DataClass, SuperClass) \
00024 private: \
00025 typedef SuperClass BaseClass; \
00026 typedef DataClass ThisClass; \
00027 static const char *classname() { return #DataClass; } \
00028 virtual const UT_String &getDataTypeSubclass() const \
00029 { \
00030 static UT_String theType(classname()); \
00031 return theType; \
00032 }
00033
00034
00035
00036
00037
00038
00039 #define DECLARE_STANDARD_GETCASTTOTYPE() \
00040 protected: \
00041 virtual void *getCastToType(const char *totype) const \
00042 { \
00043 if( strcmp(classname(), totype) == 0 ) \
00044 return (void *)this; \
00045 return BaseClass::getCastToType(totype); \
00046 }
00047
00048
00049
00050
00051 #define DECLARE_DATAFACTORY(DataClass, SuperClass, Description, DopParms) \
00052 public: \
00053 class DataClass##Factory : public SIM_DataFactory \
00054 { \
00055 public: \
00056 DataClass##Factory(SIM_Engine *engine) \
00057 : SIM_DataFactory(#DataClass, \
00058 Description, \
00059 DataClass::constructor, \
00060 DataClass::destructor, \
00061 DataClass::DopParms, \
00062 engine) \
00063 { } \
00064 virtual ~DataClass##Factory() \
00065 { } \
00066 }; \
00067 static void createDataFactory(SIM_Engine *engine) \
00068 { \
00069 SIM_DataFactory *factory; \
00070 factory = new DataClass##Factory( \
00071 engine); \
00072 SIM_DataFactoryCreator::addDataFactory \
00073 (engine, factory); \
00074 } \
00075 friend class DataClass##Factory; \
00076 private: \
00077 DECLARE_CLASSNAME(DataClass, SuperClass); \
00078 static SIM_Data *constructor(const SIM_DataFactory *factory) \
00079 { return (BaseClass *)new \
00080 DataClass(factory); } \
00081 static void destructor(SIM_Data *data) \
00082 { delete (DataClass *)data-> \
00083 getPointerToType(#DataClass); }
00084
00085
00086
00087 #define IMPLEMENT_DATAFACTORY(DataClass) \
00088 static SIM_DataFactoryCreator \
00089 DataClass##Creator(DataClass::createDataFactory);
00090
00091 #endif
00092