00001 #ifndef guard_object_reference_sequence_element_hpp 00002 #define guard_object_reference_sequence_element_hpp 00003 /** 00004 * @file 00005 * 00006 * @brief Implement the type returned by operator[] in object_reference 00007 * sequences. 00008 * 00009 * $Id: Object_Reference_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 object_reference_sequence_element 00026 { 00027 public: 00028 typedef typename obj_ref_traits::object_type object_reference_type; 00029 typedef object_reference_type * value_type; 00030 typedef object_reference_type const * const_value_type; 00031 typedef typename obj_ref_traits::object_type_var object_reference_var; 00032 00033 private: 00034 inline object_reference_sequence_element<obj_ref_traits> & pseudo_copy_swap( 00035 object_reference_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 object_reference_sequence_element( 00047 value_type & e, CORBA::Boolean release) 00048 : element_(&e) 00049 , release_(release) 00050 { 00051 } 00052 00053 object_reference_sequence_element( 00054 object_reference_sequence_element const & rhs) 00055 : element_(rhs.element_) 00056 , release_(rhs.release_) 00057 { 00058 } 00059 00060 ~object_reference_sequence_element() 00061 { 00062 } 00063 00064 object_reference_sequence_element & operator=( 00065 object_reference_var const & rhs) 00066 { 00067 object_reference_var tmp(rhs); 00068 return pseudo_copy_swap(tmp); 00069 } 00070 00071 object_reference_sequence_element & operator=( 00072 object_reference_sequence_element const & rhs) 00073 { 00074 object_reference_var tmp(obj_ref_traits::duplicate(*rhs.element_)); 00075 return pseudo_copy_swap(tmp); 00076 } 00077 00078 object_reference_sequence_element & operator=(value_type rhs) 00079 { 00080 object_reference_var tmp(rhs); 00081 return pseudo_copy_swap(tmp); 00082 } 00083 00084 inline operator value_type() 00085 { 00086 return *this->element_; 00087 } 00088 00089 inline operator const_value_type() const 00090 { 00091 return *this->element_; 00092 } 00093 00094 inline object_reference_type *in (void) const { 00095 return *this->element_; 00096 } 00097 00098 inline object_reference_type *&inout (void) const { 00099 return *this->element_; 00100 } 00101 00102 inline value_type operator->() 00103 { 00104 return *this->element_; 00105 } 00106 00107 inline value_type operator->() const 00108 { 00109 return *this->element_; 00110 } 00111 00112 void swap(object_reference_sequence_element & rhs) 00113 { 00114 std::swap(this->element_, rhs.element_); 00115 std::swap(this->release_, rhs.release_); 00116 } 00117 00118 inline CORBA::Boolean release() const 00119 { 00120 return this->release_; 00121 } 00122 00123 private: 00124 // This function is not implemented 00125 object_reference_sequence_element(); 00126 00127 private: 00128 value_type * element_; 00129 CORBA::Boolean release_; 00130 }; 00131 00132 } // namespace details 00133 } // namespace CORBA 00134 00135 TAO_END_VERSIONED_NAMESPACE_DECL 00136 00137 #endif // guard_object_reference_sequence_element_hpp