00001 #ifndef dds_DCPS_SafetyProfileSequencVar_h 00002 #define dds_DCPS_SafetyProfileSequencVar_h 00003 00004 00005 namespace OpenDDS { 00006 namespace SafetyProfile { 00007 00008 /** 00009 * @class SequenceVar 00010 * 00011 * @brief Parametrized implementation of var class for sequences. 00012 * 00013 */ 00014 template <typename T> 00015 class SequenceVar { 00016 public: 00017 typedef typename T::subscript_type T_elem; 00018 typedef typename T::const_subscript_type T_const_elem; 00019 00020 SequenceVar() 00021 : ptr_(0) 00022 { 00023 } 00024 00025 SequenceVar(T* p) 00026 : ptr_(p) 00027 { 00028 } 00029 00030 SequenceVar(const SequenceVar<T>& p) 00031 : ptr_(p.ptr_ ? new T(*p.ptr_) : 0) 00032 { 00033 } 00034 00035 ~SequenceVar() 00036 { 00037 delete ptr_; 00038 } 00039 00040 00041 SequenceVar& operator=(T* p); 00042 SequenceVar& operator=(const SequenceVar<T>& p); 00043 00044 T* operator->() 00045 { 00046 return ptr_; 00047 } 00048 00049 const T* operator->() const 00050 { 00051 return ptr_; 00052 } 00053 00054 00055 typedef const T& _in_type; 00056 typedef T& _inout_type; 00057 typedef T*& _out_type; 00058 typedef T* _retn_type; 00059 00060 _in_type in() const 00061 { 00062 return *ptr_; 00063 } 00064 00065 _inout_type inout() 00066 { 00067 return *ptr_; 00068 } 00069 00070 _out_type out(); 00071 _retn_type _retn(); 00072 00073 _retn_type ptr() const 00074 { 00075 return ptr_; 00076 } 00077 00078 operator _in_type() const 00079 { 00080 return in(); 00081 } 00082 00083 operator _inout_type() 00084 { 00085 return inout(); 00086 } 00087 00088 operator _out_type() 00089 { 00090 return out(); 00091 } 00092 00093 00094 T_elem operator[](CORBA::ULong index) 00095 { 00096 return (*ptr_)[index]; 00097 } 00098 00099 T_const_elem operator[](CORBA::ULong index) const 00100 { 00101 return (*ptr_)[index]; 00102 } 00103 00104 private: 00105 T* ptr_; 00106 }; 00107 00108 template<typename T> 00109 inline 00110 SequenceVar<T>& 00111 SequenceVar<T>::operator=(T* p) 00112 { 00113 delete ptr_; 00114 ptr_ = p; 00115 return *this; 00116 } 00117 00118 template<typename T> 00119 inline 00120 SequenceVar<T>& 00121 SequenceVar<T>::operator=( 00122 const SequenceVar<T>& p) 00123 { 00124 SequenceVar<T> tmp(p); 00125 00126 T* old_ptr = ptr_; 00127 ptr_ = tmp.ptr_; 00128 tmp.ptr_ = old_ptr; 00129 00130 return *this; 00131 } 00132 00133 template<typename T> 00134 inline 00135 T*& 00136 SequenceVar<T>::out() 00137 { 00138 delete ptr_; 00139 ptr_ = 0; 00140 return ptr_; 00141 } 00142 00143 template<typename T> 00144 inline 00145 T* 00146 SequenceVar<T>::_retn() 00147 { 00148 T* tmp = ptr_; 00149 ptr_ = 0; 00150 return tmp; 00151 } 00152 } 00153 } 00154 00155 #endif /* dds_DCPS_SafetyProfileSequencVar_h */