00001 #ifndef _Q_GLOBAL_WRITER_HH_ 00002 #define _Q_GLOBAL_WRITER_HH_ 00003 00027 #include "QCuore.hh" 00028 #include "QNamed.hh" 00029 #include "QError.hh" 00030 #include "QMessage.hh" 00031 #include "QGeneralFactory.hh" 00032 #include <string> 00033 00034 00035 namespace Cuore {class QObject;} 00036 using namespace Cuore; 00037 00038 00039 class QGlobalWriter : public QNamed 00040 { 00041 public: 00043 QGlobalWriter(const std::string& name) : QNamed(name) {} 00044 00046 virtual ~QGlobalWriter() {} 00047 00049 virtual void SetQObject(const std::string& name, const QObject* obj); 00050 00052 virtual void SetTObject(const std::string& name, TObject* obj); 00053 00055 virtual void SetDouble(const std::string& name, double obj); 00056 00058 virtual void SetInt(const std::string& name, int obj); 00059 00061 virtual void SetFloat(const std::string& name, float obj); 00062 00064 virtual void SetBool(const std::string& name, bool obj ); 00065 00067 virtual void SetString(const std::string& name, const std::string& obj); 00068 00069 protected: 00070 00072 virtual QError Open(const std::string& filename, const std::string& opt = "") = 0; 00073 00075 virtual QError Close() = 0; 00076 00077 friend class QGlobalWriterDispatcher; 00078 }; 00079 00085 class QGlobalWriterFactory { 00086 public: 00087 QGlobalWriterFactory(const std::string& name, const std::string& ext) {fName = name; fExt = ext;} 00088 const std::string& GetName() const { return fName;} 00089 const std::string& GetExt() const { return fExt;} 00090 virtual ~QGlobalWriterFactory() {}; 00091 private: 00092 virtual QGlobalWriter* Create() = 0; 00093 std::string fName; 00094 std::string fExt; 00095 friend class QGeneralFactory; 00096 }; 00097 00098 00099 #define CREATE_GOLBAL_WRITER_IMPL(clazz, ext) \ 00100 class clazz ## Factory: public QGlobalWriterFactory{\ 00101 public:\ 00102 clazz ## Factory() : QGlobalWriterFactory(#clazz,ext) {}\ 00103 QGlobalWriter *Create(){ return new clazz; }\ 00104 }; 00105 00106 #define REGISTER_GLOBAL_WRITER(clazz, ext) \ 00107 CREATE_GOLBAL_WRITER_IMPL(clazz, ext);\ 00108 extern "C" void registerInFactory ## clazz() {\ 00109 QGlobalWriterFactory* pt = new clazz ## Factory;\ 00110 QGeneralFactory::GetInstance().RegisterGlobalWriter(pt);\ 00111 } 00112 00113 #endif