00001 //////////////////////////////////////////////////////////////////////// 00002 /// 00003 /// $Id: TDbiRegistryItemXxx.hxx,v 1.1 2011/01/18 05:49:20 finch Exp $ 00004 /// 00005 /// \class TDbiRegistryItemXxx<T> 00006 /// 00007 /// \brief Encapsulates a value of type T (really!). 00008 /// 00009 /// Contact: A.Finch@lancaster.ac.uk bv@bnl.gov 00010 /// 00011 ///Created on: Wed Oct 25 17:11:44 2000 00012 /// 00013 //////////////////////////////////////////////////////////////////////// 00014 00015 #ifndef TDBIREGISTRYITEMXXX_H 00016 #define TDBIREGISTRYITEMXXX_H 00017 00018 #include <TBuffer.h> 00019 #include <TObject.h> 00020 00021 #include <TDbiRegistryItem.hxx> 00022 00023 #include <typeinfo> 00024 #include <iostream> 00025 00026 /// Encapsulates a value of type T 00027 class TDbiRegistry; 00028 template<class T> class TDbiRegistryItemXxx : public TDbiRegistryItem 00029 { 00030 public: 00031 // Only Want TDbiRegistry to call Get/Set/etc methods 00032 friend class TDbiRegistry; 00033 00034 TDbiRegistryItemXxx(); 00035 ~TDbiRegistryItemXxx(); 00036 00037 void Dump() const { std::cerr << *fData; } 00038 void Print(Option_t* /* option */ ="") const { std::cout << *fData; } 00039 00040 virtual std::ostream& PrintStream(std::ostream& os) const { 00041 return os << *fData; 00042 } 00043 virtual std::istream& ReadStream(std::istream& is) { 00044 if (!fData) fData = new T; 00045 return is >> *fData; 00046 } 00047 00048 virtual const type_info& GetType() const { return typeid(T); } 00049 virtual const char* GetTypeAsString() const { return "void"; } 00050 00051 private: 00052 00053 TDbiRegistryItemXxx(T* data); 00054 T* Get(void); // Only let TDbiRegistry call 00055 void Set(T* data); // these methods. 00056 TDbiRegistryItem* Dup(void) const; 00057 00058 T* fData; 00059 00060 ClassDefT(TDbiRegistryItemXxx<T>,1) 00061 }; 00062 ClassDefT2(TDbiRegistryItemXxx,T) 00063 00064 00065 00066 // Provide these so C++ base types act like ROOT types inside 00067 // a ROOT Streamer function. This lets the same template to be used. 00068 TBuffer& operator>>(TBuffer &buf, int*& xptr); 00069 TBuffer& operator>>(TBuffer &buf, double*& xptr); 00070 TBuffer& operator>>(TBuffer &buf, float*& xptr); 00071 //TBuffer& operator>>(TBuffer &buf, bool*& xptr); 00072 00073 TBuffer& operator<<(TBuffer &buf, int*& xptr); 00074 TBuffer& operator<<(TBuffer &buf, double*& xptr); 00075 TBuffer& operator<<(TBuffer &buf, float*& xptr); 00076 //TBuffer& operator<<(TBuffer &buf, bool*& xptr); 00077 00078 //TBuffer& operator<<(TBuffer &buf, char*& xptr); 00079 00080 #ifndef __CINT__ 00081 00082 #include <iostream> 00083 00084 ClassImpT(TDbiRegistryItemXxx,T) 00085 00086 template<class T> 00087 TDbiRegistryItemXxx<T>::TDbiRegistryItemXxx(void) : fData(0) 00088 { 00089 } 00090 00091 template<class T> 00092 TDbiRegistryItemXxx<T>::TDbiRegistryItemXxx(T* data) : fData(data) 00093 { 00094 } 00095 00096 template<class T> 00097 TDbiRegistryItemXxx<T>::~TDbiRegistryItemXxx() 00098 { 00099 if (fData) delete fData; 00100 } 00101 00102 template<class T> 00103 TDbiRegistryItem* TDbiRegistryItemXxx<T>::Dup(void) const 00104 { 00105 return new TDbiRegistryItemXxx<T>(new T (*fData)); 00106 } 00107 // see TDbiRegistryItemXxx.cxx for implementation 00108 template<> 00109 TDbiRegistryItem* TDbiRegistryItemXxx<const char*>::Dup(void) const; 00110 00111 00112 template<class T> 00113 T* TDbiRegistryItemXxx<T>::Get(void) 00114 { 00115 return fData; 00116 } 00117 00118 template<class T> 00119 void TDbiRegistryItemXxx<T>::Set(T* data) 00120 { 00121 if (fData) delete fData; 00122 fData = data; 00123 } 00124 00125 00126 // These specialized templates are in TDbiRegistryItemXxx.cxx 00127 // 00128 template<> 00129 void TDbiRegistryItemXxx<const char*>::Streamer(TBuffer &buf); 00130 template<> 00131 void TDbiRegistryItemXxx<char>::Streamer(TBuffer &buf); 00132 template<> 00133 TDbiRegistryItemXxx<const char*>::~TDbiRegistryItemXxx(); 00134 00135 template<> std::ostream& TDbiRegistryItemXxx<const char*>::PrintStream(std::ostream& os) const; 00136 template<> std::istream& TDbiRegistryItemXxx<const char*>::ReadStream(std::istream& is); 00137 template<> const char* TDbiRegistryItemXxx<char>::GetTypeAsString(void) const; 00138 template<> const char* TDbiRegistryItemXxx<int>::GetTypeAsString(void) const; 00139 template<> const char* TDbiRegistryItemXxx<double>::GetTypeAsString(void) const; 00140 template<> const char* TDbiRegistryItemXxx<const char*>::GetTypeAsString(void) const; 00141 template<> const char* TDbiRegistryItemXxx<TDbiRegistry>::GetTypeAsString(void) const; 00142 00143 00144 // Only for less than GCC 3.3 - see bug 3797: 00145 // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=3797 00146 #if (__GNUC__ == 3 && __GNUC_MINOR__ < 3) || __GNUC__ == 2 00147 00148 #include <TDbiRegistry.hxx> 00149 00150 template<> const char* TDbiRegistryItemXxx<char>::GetTypeAsString(void) const 00151 { return "char"; } 00152 00153 template<> const char* TDbiRegistryItemXxx<int>::GetTypeAsString(void) const 00154 { return "int"; } 00155 00156 template<> const char* TDbiRegistryItemXxx<double>::GetTypeAsString(void) const 00157 { return "double"; } 00158 00159 template<> const char* TDbiRegistryItemXxx<const char*>::GetTypeAsString(void) const 00160 { return "string"; } 00161 00162 template<> const char* TDbiRegistryItemXxx<TDbiRegistry>::GetTypeAsString(void) const 00163 { return "TDbiRegistry"; } 00164 00165 template<> std::ostream& TDbiRegistryItemXxx<TDbiRegistry>::PrintStream(std::ostream& os) const 00166 { return fData->PrintStream(os); } 00167 00168 template<> std::istream& TDbiRegistryItemXxx<TDbiRegistry>::ReadStream(std::istream& is) 00169 { if (!fData) fData = new TDbiRegistry(); return fData->ReadStream(is); } 00170 #endif 00171 00172 // This assumes that objects spring forth (like ROOT objects) 00173 template<class T> 00174 void TDbiRegistryItemXxx<T>::Streamer(TBuffer &buf) 00175 { 00176 if (buf.IsReading()) { 00177 Version_t v = buf.ReadVersion(); 00178 if (v) { } 00179 TDbiRegistryItem::Streamer(buf); 00180 00181 buf >> fData; 00182 } 00183 else { 00184 buf.WriteVersion(IsA()); 00185 TDbiRegistryItem::Streamer(buf); 00186 buf << fData; 00187 } 00188 } 00189 00190 00191 00192 #include <TDbiRegistry.hxx> 00193 00194 00195 template<> 00196 std::ostream& TDbiRegistryItemXxx<TDbiRegistry>::PrintStream(std::ostream& os) const; 00197 00198 template<> 00199 std::istream& TDbiRegistryItemXxx<TDbiRegistry>::ReadStream(std::istream& is); 00200 00201 00202 #endif // __CINT__ 00203 00204 00205 #endif // TDBIREGISTRYITEMXXX_H