00001 // $Id: Value_VarOut_T.cpp 72138 2006-04-19 09:23:57Z jwillemsen $ 00002 00003 #ifndef TAO_VALUE_VAROUT_T_CPP 00004 #define TAO_VALUE_VAROUT_T_CPP 00005 00006 #include "tao/Valuetype/Value_VarOut_T.h" 00007 #include "tao/Valuetype/Value_CORBA_methods.h" 00008 00009 #include <algorithm> /* For std::swap<>() */ 00010 00011 TAO_BEGIN_VERSIONED_NAMESPACE_DECL 00012 00013 template <typename T> 00014 TAO_Value_Var_T<T>::TAO_Value_Var_T (void) 00015 : ptr_ (0) 00016 {} 00017 00018 template <typename T> 00019 TAO_Value_Var_T<T>::TAO_Value_Var_T (T * p) 00020 : ptr_ (p) 00021 {} 00022 00023 template <typename T> 00024 TAO_Value_Var_T<T>::TAO_Value_Var_T (const T * p) 00025 : ptr_ (const_cast<T *> (p)) 00026 {} 00027 00028 template <typename T> 00029 TAO_Value_Var_T<T>::TAO_Value_Var_T (const TAO_Value_Var_T<T> & p) 00030 : TAO_Base_var () 00031 { 00032 TAO::Value_Traits<T>::add_ref (p.ptr ()); 00033 this->ptr_ = p.ptr (); 00034 } 00035 00036 template <typename T> 00037 TAO_Value_Var_T<T>::~TAO_Value_Var_T (void) 00038 { 00039 TAO::Value_Traits<T>::remove_ref (this->ptr_); 00040 } 00041 00042 template <typename T> 00043 TAO_Value_Var_T<T> & 00044 TAO_Value_Var_T<T>::operator= (T * p) 00045 { 00046 if (this->ptr_ != p) 00047 { 00048 // This constructor doesn't increase the reference count so we 00049 // we must check for self-assignment. Otherwise the reference 00050 // count would be prematurely decremented upon exiting this 00051 // scope. 00052 TAO_Value_Var_T<T> tmp (p); 00053 std::swap (this->ptr_, tmp.ptr_); 00054 } 00055 00056 return *this; 00057 } 00058 00059 template <typename T> 00060 TAO_Value_Var_T<T> & 00061 TAO_Value_Var_T<T>::operator= (const TAO_Value_Var_T<T> & p) 00062 { 00063 TAO_Value_Var_T<T> tmp (p); 00064 std::swap (this->ptr_, tmp.ptr_); 00065 00066 return *this; 00067 } 00068 00069 template <typename T> 00070 TAO_Value_Var_T<T>::operator const T * () const 00071 { 00072 return this->ptr_; 00073 } 00074 00075 template <typename T> 00076 TAO_Value_Var_T<T>::operator T *& () 00077 { 00078 return this->ptr_; 00079 } 00080 00081 template <typename T> 00082 T * 00083 TAO_Value_Var_T<T>::operator-> (void) const 00084 { 00085 return this->ptr_; 00086 } 00087 00088 template <typename T> 00089 T * 00090 TAO_Value_Var_T<T>::in (void) const 00091 { 00092 return this->ptr_; 00093 } 00094 00095 template <typename T> 00096 T *& 00097 TAO_Value_Var_T<T>::inout (void) 00098 { 00099 return this->ptr_; 00100 } 00101 00102 template <typename T> 00103 T *& 00104 TAO_Value_Var_T<T>::out (void) 00105 { 00106 TAO::Value_Traits<T>::remove_ref (this->ptr_); 00107 this->ptr_ = 0; 00108 return this->ptr_; 00109 } 00110 00111 template <typename T> 00112 T * 00113 TAO_Value_Var_T<T>::_retn (void) 00114 { 00115 T * tmp = this->ptr_; 00116 this->ptr_ = 0; 00117 return tmp; 00118 } 00119 00120 template <typename T> 00121 T * 00122 TAO_Value_Var_T<T>::ptr (void) const 00123 { 00124 return this->ptr_; 00125 } 00126 00127 // ************************************************************* 00128 00129 template <typename T> 00130 TAO_Value_Out_T<T>::TAO_Value_Out_T (T *& p) 00131 : ptr_ (p) 00132 { 00133 this->ptr_ = 0; 00134 } 00135 00136 template <typename T> 00137 TAO_Value_Out_T<T>::TAO_Value_Out_T (TAO_Value_Var_T<T> & p) 00138 : ptr_ (p.out ()) 00139 { 00140 TAO::Value_Traits<T>::remove_ref (this->ptr_); 00141 this->ptr_ = 0; 00142 } 00143 00144 template <typename T> 00145 TAO_Value_Out_T<T>::TAO_Value_Out_T (const TAO_Value_Out_T<T> & p) 00146 : ptr_ (const_cast<TAO_Value_Out_T<T> &> (p).ptr_) 00147 {} 00148 00149 template <typename T> 00150 TAO_Value_Out_T<T> & 00151 TAO_Value_Out_T<T>::operator= (const TAO_Value_Out_T<T> & p) 00152 { 00153 this->ptr_ = const_cast<TAO_Value_Out_T<T> &> (p).ptr_; 00154 return *this; 00155 } 00156 00157 template <typename T> 00158 TAO_Value_Out_T<T> & 00159 TAO_Value_Out_T<T>::operator= (T * p) 00160 { 00161 this->ptr_ = p; 00162 return *this; 00163 } 00164 00165 template <typename T> 00166 TAO_Value_Out_T<T>::operator T *& () 00167 { 00168 return this->ptr_; 00169 } 00170 00171 template <typename T> 00172 T *& 00173 TAO_Value_Out_T<T>::ptr (void) 00174 { 00175 return this->ptr_; 00176 } 00177 00178 template <typename T> 00179 T * 00180 TAO_Value_Out_T<T>::operator-> (void) 00181 { 00182 return this->ptr_; 00183 } 00184 00185 TAO_END_VERSIONED_NAMESPACE_DECL 00186 00187 #endif /* TAO_VALUE_VAROUT_T_CPP */