00001 #ifndef guard_valuetype_sequence_element_hpp 00002 #define guard_valuetype_sequence_element_hpp 00003 /** 00004 * @file 00005 * 00006 * @brief Implement the type returned by operator[] in valuetype 00007 * sequences. 00008 * 00009 * $Id: Valuetype_Sequence_Element_T.h 90386 2010-06-02 13:52:08Z vzykov $ 00010 * 00011 * @author Carlos O'Ryan 00012 */ 00013 #include "tao/Basic_Types.h" 00014 00015 #include <algorithm> 00016 00017 TAO_BEGIN_VERSIONED_NAMESPACE_DECL 00018 00019 namespace TAO 00020 { 00021 namespace details 00022 { 00023 00024 template<typename obj_ref_traits> 00025 class valuetype_sequence_element 00026 { 00027 public: 00028 typedef typename obj_ref_traits::object_type valuetype_type; 00029 typedef valuetype_type * value_type; 00030 typedef valuetype_type const * const_value_type; 00031 typedef typename obj_ref_traits::object_type_var valuetype_var; 00032 00033 private: 00034 inline valuetype_sequence_element<obj_ref_traits> & pseudo_copy_swap( 00035 valuetype_var & rhs) 00036 { 00037 if (release()) 00038 { 00039 obj_ref_traits::release(*element_); 00040 } 00041 *element_ = rhs._retn(); 00042 return *this; 00043 } 00044 00045 public: 00046 valuetype_sequence_element( 00047 value_type & e, CORBA::Boolean release) 00048 : element_(&e) 00049 , release_(release) 00050 { 00051 } 00052 00053 valuetype_sequence_element( 00054 valuetype_sequence_element const & rhs) 00055 : element_(rhs.element_) 00056 , release_(rhs.release_) 00057 { 00058 } 00059 00060 ~valuetype_sequence_element() 00061 { 00062 } 00063 00064 valuetype_sequence_element & operator=( 00065 valuetype_var const & rhs) 00066 { 00067 valuetype_var tmp(rhs); 00068 return pseudo_copy_swap(tmp); 00069 } 00070 00071 valuetype_sequence_element & operator=( 00072 valuetype_sequence_element const & rhs) 00073 { 00074 valuetype_var tmp(obj_ref_traits::duplicate(*rhs.element_)); 00075 return pseudo_copy_swap(tmp); 00076 } 00077 00078 valuetype_sequence_element & operator=(value_type rhs) 00079 { 00080 valuetype_var tmp(rhs); 00081 return pseudo_copy_swap(tmp); 00082 } 00083 00084 inline operator value_type() 00085 { 00086 return *element_; 00087 } 00088 00089 inline operator const_value_type() const 00090 { 00091 return *element_; 00092 } 00093 00094 inline value_type operator->() 00095 { 00096 return *element_; 00097 } 00098 00099 inline value_type operator->() const 00100 { 00101 return *element_; 00102 } 00103 00104 void swap(valuetype_sequence_element & rhs) 00105 { 00106 std::swap(element_, rhs.element_); 00107 std::swap(release_, rhs.release_); 00108 } 00109 00110 inline CORBA::Boolean release() const 00111 { 00112 return release_; 00113 } 00114 00115 private: 00116 // This function is not implemented 00117 valuetype_sequence_element(); 00118 00119 private: 00120 value_type * element_; 00121 CORBA::Boolean release_; 00122 }; 00123 00124 } // namespace details 00125 } // namespace CORBA 00126 00127 TAO_END_VERSIONED_NAMESPACE_DECL 00128 00129 #endif // guard_valuetype_sequence_element_hpp