00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00037 #if !defined( _OESS_1__TLV__SCALAR_HPP_ )
00038 #define _OESS_1__TLV__SCALAR_HPP_
00039
00040 #include <oess_1/tlv/h/declspec.hpp>
00041
00042 #include <string>
00043
00044 #include <auto_ptr_3/h/vect_ptr.hpp>
00045
00046 #include <oess_1/defs/h/ex.hpp>
00047
00048 #include <oess_1/io/h/bin_data_size.hpp>
00049 #include <oess_1/io/h/subbinstream.hpp>
00050
00051 #include <oess_1/tlv/h/base.hpp>
00052 #include <oess_1/tlv/h/default_processors.hpp>
00053 #include <oess_1/tlv/h/errno.hpp>
00054
00055 namespace oess_1
00056 {
00057
00058 namespace tlv
00059 {
00060
00061
00062
00063
00064
00066
00070 template< class Tag_type,
00071 class Scalar,
00072 class Tag_processor = default_tag_processor_t< Tag_type >,
00073 class Length_processor = default_length_processor_t< Tag_type > >
00074 class scalar_tlv_t :
00075 public tlv_base_t
00076 {
00077 public :
00079 typedef Scalar value_type_t;
00080
00083 typedef scalar_tlv_t< Tag_type, Scalar,
00084 Tag_processor, Length_processor >
00085 self_t;
00086
00087 private :
00089 Tag_processor m_tag;
00090
00092 Length_processor m_length;
00093
00095 Scalar m_value;
00096
00097 public :
00099 scalar_tlv_t( Tag_type id )
00100 :
00101 m_tag( id ),
00102 m_value()
00103 {
00104 }
00105
00107 scalar_tlv_t(
00108 Tag_type id,
00109 const Scalar & value )
00110 :
00111 m_tag( id ),
00112 m_value( value )
00113 {
00114 }
00115
00117 scalar_tlv_t(
00118 const self_t & o )
00119 :
00120 m_tag( o.m_tag ),
00121 m_length( o.m_length ),
00122 m_value( o.m_value )
00123 {
00124 }
00125
00126 virtual ~scalar_tlv_t()
00127 {
00128 }
00129
00131 self_t &
00132 operator=( const self_t & o )
00133 {
00134 if( &o != this )
00135 {
00136 m_tag = o.m_tag;
00137 m_length = o.m_length;
00138 m_value = o.m_value;
00139 }
00140 return *this;
00141 }
00142
00144 const Scalar &
00145 query_value() const
00146 {
00147 return m_value;
00148 }
00149
00151 void
00152 set_value(
00154 const Scalar & value )
00155 {
00156 m_value = value;
00157 }
00158
00160 virtual default_tag_type_t
00161 tlv_tag() const
00162 {
00163 return m_tag.query_tag();
00164 }
00165
00169 virtual size_t
00170 tlv_size() const
00171 {
00172 size_t length = oess_1::io::bin_data_size_t<
00173 Scalar >::image_size;
00174 length += m_length.tlv_length_size( length );
00175 length += m_tag.tlv_tag_size();
00176
00177 return length;
00178 }
00179
00181
00189 virtual void
00190 tlv_unpack(
00193 oess_1::io::ibinstream_t & s,
00195 default_tag_type_t )
00196 {
00197 size_t length;
00198 m_length.tlv_unpack_length( s, length );
00199 if( length )
00200 {
00201 oess_1::io::isubbinstream_t substream( s, length );
00202 substream >> m_value;
00203 }
00204 else
00205 {
00206 OESS_THROW_PHYSIC( err::c_zero_length,
00207 "awaiting length: " << oess_1::io::bin_data_size_t<
00208 Scalar >::image_size )
00209 }
00210 }
00211
00213
00216 virtual void
00217 tlv_pack(
00220 oess_1::io::obinstream_t & s ) const
00221 {
00222 size_t length =
00223 oess_1::io::bin_data_size_t< Scalar >::image_size;
00224
00225 m_tag.tlv_pack_tag( s );
00226 m_length.tlv_pack_length( s, length );
00227 s << m_value;
00228 }
00229 };
00230
00231 }
00232
00233 }
00234
00235 #endif
00236