Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members
PHObjectHandle.h
Go to the documentation of this file.00001 #ifndef __PHOBJECTHANDLE_H__ 00002 #define __PHOBJECTHANDLE_H__ 00003 00004 #include "TClass.h" 00005 #include "PHObject.h" 00006 #include <iostream> 00007 00008 template<typename BASE> class PHObjectHandleImpl; 00009 00015 template<typename BASE> 00016 class PHObjectHandle : public PHObject 00017 { 00018 public: 00019 typedef BASE* pointer; 00020 typedef BASE& reference; 00021 00023 PHObjectHandle(); 00024 00026 PHObjectHandle(pointer ptr); 00027 00029 PHObjectHandle(const PHObjectHandle<BASE>&); 00030 00032 PHObjectHandle<BASE>& operator=(const PHObjectHandle<BASE>& other); 00033 00035 virtual ~PHObjectHandle(); 00036 00038 bool operator!() const { return fObject==0; } 00039 00041 bool operator()() const { return !(*this)(); } 00042 00044 pointer operator->() const; 00045 00047 reference operator*() const; 00048 00050 PHObjectHandle<BASE>* clone() const { return new PHObjectHandle<BASE>(*this); } 00051 00053 PHObjectHandle<BASE>* create() const { return new PHObjectHandle<BASE>(); } 00054 00056 pointer get() const; 00057 00058 virtual void identify(std::ostream& os = std::cout) const; 00059 00060 virtual int isValid() const { return fObject!=0; } 00061 00062 virtual void Reset(); 00063 00064 private: 00065 00066 void copyTo(PHObjectHandle<BASE>& other) const; 00067 00068 BASE* fObject; 00069 00070 ClassDefT(PHObjectHandle,1) 00071 }; 00072 00073 ClassDefT2(PHObjectHandle,BASE) 00074 ClassImpT(PHObjectHandle,BASE) 00075 00076 template<typename BASE> 00077 std::ostream& operator<<(std::ostream& os, const PHObjectHandle<BASE>& oh) 00078 { 00079 os << (*oh); 00080 return os; 00081 } 00082 00083 #ifndef __CINT__ 00084 00085 //_____________________________________________________________________________ 00086 template<typename BASE> 00087 PHObjectHandle<BASE>::PHObjectHandle() : fObject(0) 00088 { 00089 } 00090 00091 //_____________________________________________________________________________ 00092 template<typename BASE> 00093 PHObjectHandle<BASE>::PHObjectHandle(PHObjectHandle<BASE>::pointer ptr) 00094 : fObject(ptr) 00095 { 00096 } 00097 00098 //_____________________________________________________________________________ 00099 template<typename BASE> 00100 PHObjectHandle<BASE>::PHObjectHandle(const PHObjectHandle<BASE>& other) 00101 : PHObject(), 00102 fObject(0) 00103 { 00104 other.copyTo(*this); 00105 } 00106 00107 //_____________________________________________________________________________ 00108 template<typename BASE> 00109 PHObjectHandle<BASE>& 00110 PHObjectHandle<BASE>::operator=(const PHObjectHandle<BASE>& other) 00111 { 00112 if ( this != &other ) 00113 { 00114 other.copyTo(*this); 00115 } 00116 return *this; 00117 } 00118 00119 //_____________________________________________________________________________ 00120 template<typename BASE> 00121 void 00122 PHObjectHandle<BASE>::copyTo(PHObjectHandle<BASE>& other) const 00123 { 00124 delete other.fObject; 00125 other.fObject = static_cast<BASE*>(fObject->clone()); 00126 } 00127 00128 //_____________________________________________________________________________ 00129 template<typename BASE> 00130 PHObjectHandle<BASE>::~PHObjectHandle() 00131 { 00132 delete fObject; 00133 } 00134 00135 //_____________________________________________________________________________ 00136 template<typename BASE> 00137 typename PHObjectHandle<BASE>::pointer 00138 PHObjectHandle<BASE>::operator->() const 00139 { 00140 return fObject; 00141 } 00142 00143 //_____________________________________________________________________________ 00144 template<typename BASE> 00145 typename PHObjectHandle<BASE>::reference 00146 PHObjectHandle<BASE>::operator*() const 00147 { 00148 assert(fObject!=0); 00149 return *fObject; 00150 } 00151 00152 //_____________________________________________________________________________ 00153 template<typename BASE> 00154 typename PHObjectHandle<BASE>::pointer 00155 PHObjectHandle<BASE>::get() const 00156 { 00157 return fObject; 00158 } 00159 00160 //_____________________________________________________________________________ 00161 template<typename BASE> 00162 void 00163 PHObjectHandle<BASE>::identify(std::ostream& os) const 00164 { 00165 os << "PHObjectHandle<" << BASE::Class()->GetName() 00166 << ">::identify : fObject=" 00167 << std::hex << fObject 00168 << std::dec 00169 << std::endl; 00170 } 00171 00172 //_____________________________________________________________________________ 00173 template<typename BASE> 00174 void 00175 PHObjectHandle<BASE>::Reset() 00176 { 00177 delete fObject; 00178 fObject=0; 00179 } 00180 00181 #endif 00182 00183 #endif