CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/CondCore/ORA/interface/Handle.h

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