it_bus/var.h

00001 #ifndef _IT_BUS_VAR_H_
00002 #define _IT_BUS_VAR_H_
00003 
00004 // @Copyright 2004 IONA Technologies, Plc. All Rights Reserved.
00005 //
00006 
00007 #include <it_cal/cal.h>
00008 
00009 namespace IT_Bus
00010 {
00017     template <class T>
00018     class Var
00019     {
00020       public:
00026         Var(
00027             T* ptr
00028         ) throw(()) :
00029             m_ptr(ptr)
00030         {}
00031 
00038         Var(
00039             const Var<T>& ptr
00040         ) throw(()) :
00041             m_ptr(ptr.m_ptr)
00042         {
00043             if (m_ptr != 0)
00044             {
00045                 m_ptr->_add_ref();
00046             }
00047         }
00048 
00052         Var()
00053             throw(()) :
00054                 m_ptr(0)
00055         {}
00056 
00062         ~Var()
00063             throw(())
00064         {
00065             if (m_ptr != 0)
00066             {
00067                 m_ptr->_remove_ref();
00068             }
00069         }
00070 
00076         T*
00077         operator->() const
00078             throw(())
00079         {
00080             return m_ptr;
00081         }
00082 
00088         T&
00089         operator*() const
00090             throw(())
00091         {
00092             return *m_ptr;
00093         }
00094 
00101         T*
00102         get() const
00103             throw(())
00104         {
00105             return m_ptr;
00106         }
00107 
00116         T*
00117         release() 
00118             throw(())
00119         {
00120             T* tmp = m_ptr;
00121             m_ptr = 0;
00122             return tmp;
00123         }
00124 
00131         Var<T>&
00132         operator=(
00133             const Var<T>& ptr
00134         ) throw(())
00135         {
00136             if (m_ptr != ptr.m_ptr)
00137             {
00138                 if (m_ptr != 0)
00139                 {
00140                     m_ptr->_remove_ref();
00141                 }
00142                 m_ptr = ptr.m_ptr;
00143                 if (m_ptr != 0)
00144                 {
00145                     m_ptr->_add_ref();
00146                 }
00147             }
00148             return *this;
00149         }
00150 
00157         Var<T>&
00158         operator=(
00159             T* ptr
00160         ) throw(())
00161         {
00162             if (m_ptr != 0)
00163             {
00164                 m_ptr->_remove_ref();
00165             }
00166 
00167             m_ptr = ptr;
00168             return *this;
00169         }
00170 
00176         operator T*() const
00177         {
00178             return get();
00179         }
00180 
00181       private:
00182         T* m_ptr;
00183     };
00184 
00189     template <class T, class U>
00190     T*
00191     dynamic_cast_var(
00192         Var<U>& var
00193     )
00194     {
00195         T* t_ptr = IT_DYNAMIC_CAST(T*, var.get());
00196         if (t_ptr != 0)
00197         {
00198             t_ptr->_add_ref();
00199         }
00200         return t_ptr;
00201     }
00202 
00207     template <class T, class U>
00208     T*
00209     static_cast_var(
00210         Var<U>& var
00211     )
00212     {
00213         T* t_ptr = IT_STATIC_CAST(T*, var.get());
00214         if (t_ptr != 0)
00215         {
00216             t_ptr->_add_ref();
00217         }
00218         return t_ptr;
00219     }
00220     
00225     template <class T, class U>
00226     T*
00227     const_cast_var(
00228         Var<U>& var
00229     )
00230     {
00231         T* t_ptr = IT_STATIC_CAST(T*, var.get());
00232         if (t_ptr != 0)
00233         {
00234             t_ptr->_add_ref();
00235         }
00236         return t_ptr;
00237     }
00238     
00242     template <class T, class U>
00243     T*
00244     dynamic_cast_var(
00245         U* ptr
00246     )
00247     {
00248         Var<U> u(ptr);          // Take ownership
00249         return dynamic_cast_var<T>(u);
00250     }
00251 
00253     template <class T, class U>
00254     T*
00255     static_cast_var(
00256         U* ptr
00257     )
00258     {
00259         return IT_STATIC_CAST(T*, ptr);
00260     }
00261     
00263     template <class T, class U>
00264     T*
00265     const_cast_var(
00266         U* ptr
00267     )
00268     {
00269         return IT_CONST_CAST(T*, ptr);
00270     }
00271 }
00272 
00273 #endif  

Generated on Tue Mar 20 15:27:44 2007 for Artix by  doxygen 1.5.1-p1