00001 #ifndef _IT_BUS_VAR_H_
00002 #define _IT_BUS_VAR_H_
00003
00004
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);
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