![]() |
![]() |
00001 #ifndef INCLUDE_ORA_HANDLE_H 00002 #define INCLUDE_ORA_HANDLE_H 00003 00004 #include "CondCore/ORA/interface/Exception.h" 00005 // 00006 #include <memory> 00007 #include <boost/shared_ptr.hpp> 00008 00009 00010 namespace ora { 00011 00012 template <typename T> class Holder { 00013 public: 00014 Holder(); 00015 Holder( T* p ); 00016 ~Holder(); 00017 std::auto_ptr<T> ptr; 00018 }; 00019 00020 template <typename T> class Handle { 00021 public: 00022 Handle(); 00023 00024 explicit Handle(T* ptr); 00025 00026 Handle(const Handle<T>& rhs); 00027 00028 ~Handle(); 00029 00030 Handle& operator=(const Handle<T>& rhs); 00031 00032 void reset( T* ptr ); 00033 00034 // dereference operator 00035 T* operator->() const; 00036 00037 // dereference operator 00038 T& operator*() const; 00039 00040 // implicit bool conversion 00041 operator bool () const; 00042 00043 // not operator 00044 bool operator!() const; 00045 00046 // return the real pointer 00047 T* get() const; 00048 00049 void clear(); 00050 private: 00051 void validate() const; 00052 00053 private: 00054 boost::shared_ptr< Holder<T> > m_holder; 00055 }; 00056 } 00057 00058 template <typename T> 00059 inline 00060 ora::Holder<T>::Holder(): 00061 ptr(){ 00062 } 00063 00064 template <typename T> 00065 inline 00066 ora::Holder<T>::Holder(T* p ): 00067 ptr(p){ 00068 } 00069 00070 template <typename T> 00071 inline 00072 ora::Holder<T>::~Holder(){ 00073 } 00074 00075 template <typename T> 00076 inline 00077 ora::Handle<T>::Handle(): 00078 m_holder( new Holder<T>() ){ 00079 } 00080 00081 template <typename T> 00082 inline 00083 ora::Handle<T>::Handle(T* ptr): 00084 m_holder( new Holder<T>( ptr ) ){ 00085 } 00086 00087 template <typename T> 00088 inline 00089 ora::Handle<T>::Handle( const Handle<T>& rhs ): 00090 m_holder( rhs.m_holder ){ 00091 } 00092 00093 template <typename T> 00094 inline 00095 ora::Handle<T>::~Handle(){ 00096 } 00097 00098 template <typename T> 00099 inline 00100 ora::Handle<T>& ora::Handle<T>::operator=( const Handle<T>& rhs ){ 00101 m_holder = rhs.m_holder; 00102 return *this; 00103 } 00104 00105 template <typename T> 00106 inline 00107 void ora::Handle<T>::reset( T* ptr ){ 00108 m_holder.reset( new Holder<T>( ptr ) ); 00109 } 00110 00111 template <typename T> 00112 inline 00113 void ora::Handle<T>::validate() const{ 00114 if(!m_holder->ptr.get()) { 00115 throwException( "Handle is not valid.",typeid(Handle<T>),"validate"); 00116 } 00117 } 00118 00119 template <typename T> 00120 inline 00121 T* ora::Handle<T>::operator->() const { 00122 validate(); 00123 return m_holder->ptr.get(); 00124 } 00125 00126 template <typename T> 00127 inline 00128 T& ora::Handle<T>::operator*() const { 00129 validate(); 00130 return *m_holder->ptr.get(); 00131 } 00132 00133 template <typename T> 00134 inline 00135 ora::Handle<T>::operator bool () const { 00136 return m_holder->ptr.get()!=0; 00137 } 00138 00139 template <typename T> 00140 inline 00141 bool ora::Handle<T>::operator!() const { 00142 return m_holder->ptr.get()==0; 00143 } 00144 00145 template <typename T> 00146 inline 00147 T* ora::Handle<T>::get() const { 00148 return m_holder->ptr.get(); 00149 } 00150 00151 template <typename T> 00152 inline 00153 void ora::Handle<T>::clear(){ 00154 if(m_holder.get()) m_holder->ptr.reset(); 00155 } 00156 00157 #endif 00158 00159