Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef XMLCLASSFACTORY_H
00030 #define XMLCLASSFACTORY_H
00031
00032 #include <QtCore>
00033
00034 #include "CoreApplication.h"
00035 #include "QGpCoreToolsDLLExport.h"
00036
00037 namespace QGpCoreTools {
00038
00039 class XMLClass;
00040 class XMLClassCreator;
00041
00042 class QGPCORETOOLS_EXPORT XMLClassFactory
00043 {
00044 public:
00045 XMLClassFactory() {_nextId=0;}
00046 ~XMLClassFactory();
00047
00048 int id(const QString& tag) const;
00049 XMLClass * create(const QString& tag) const;
00050 XMLClass * create(int id) const;
00051 XMLClassCreator * creator(const QString& tag) const;
00052 XMLClassCreator * creator(int id) const;
00053
00054 QStringList registeredTags() const;
00055 QList<int> registeredIds() const;
00056
00057 int registerClass(const QString& tag, XMLClassCreator * creator);
00058 void registerTag(const QString& tag, int id);
00059 void registerTag(const QString& tag, const QString& destTag);
00060
00061 static void registerFactory(XMLClassFactory * f);
00062 static void clearFactories();
00063 protected:
00064 int newId() {return _nextId++;}
00065 private:
00066 QMap<int, XMLClassCreator *> _registeredClasses;
00067 QMap<QString, int> _registeredTags;
00068 int _nextId;
00069
00070 static QList<XMLClassFactory *> _factories;
00071 };
00072
00073 class QGPCORETOOLS_EXPORT XMLClassCreator
00074 {
00075 public:
00076 virtual ~XMLClassCreator() {}
00077
00078 virtual XMLClass * create() const=0;
00079 };
00080
00081 #define XMLREGISTER_HEAD(_factory_, _creator_, _className_, _tagName_) \
00082 class _className_##XMLClassCreator : public _creator_ \
00083 { \
00084 public: \
00085 _className_##XMLClassCreator() \
00086 { \
00087 _factory_::init(); \
00088 _factory_::instance()->registerClass(_tagName_, this); \
00089 }
00090
00091
00092 #define XMLREGISTER_TAIL(_className_) \
00093 private: \
00094 virtual XMLClass * create() const {return new _className_;} \
00095 }; \
00096 _className_##XMLClassCreator register##_className_;
00097
00098 #define XMLSYNONYM(_factory_, _synName_, _tagName_) \
00099 class _synName_##XMLClassSynonym \
00100 { \
00101 public: \
00102 _synName_##XMLClassSynonym() { \
00103 _factory_::instance()->registerTag(# _synName_, _tagName_); \
00104 } \
00105 }; \
00106 _synName_##XMLClassSynonym register##_synName_;
00107
00108 }
00109
00110 #endif // XMLCLASSFACTORY_H