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