TDbiRegistryItemXxx.hxx

Go to the documentation of this file.
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

Generated on 11 Aug 2013 for SKDatabase by  doxygen 1.6.1