1 #include "field_codec_var_bytes.h"
2 #include "dccl/field_codec_manager.h"
3 #include "dccl/codecs3/field_codec_default.h"
6 using namespace dccl::logger;
14 dccl::Bitset dccl::v3::VarBytesCodec::encode(
const std::string& wire_value)
16 std::string s = wire_value;
17 if(s.size() > dccl_field_options().max_length())
22 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"Bytes " << s <<
" exceeds `dccl.max_length`, truncating" << std::endl;
23 s.resize(dccl_field_options().max_length());
29 dccl::Bitset length_bits(presence_size() + prefix_size(), s.length());
37 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"dccl::v3::VarBytesCodec value_bits: " << value_bits << std::endl;
40 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"dccl::v3::VarBytesCodec length_bits: " << length_bits << std::endl;
43 for(
int i = 0, n = value_bits.size(); i < n; ++i)
44 length_bits.push_back(value_bits[i]);
46 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"dccl::v3::VarBytesCodec created: " << length_bits << std::endl;
51 std::string dccl::v3::VarBytesCodec::decode(
dccl::Bitset* bits)
67 unsigned value_length = bits->
to_ulong();
68 unsigned header_length = presence_size() + prefix_size();
70 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"Length of string is = " << value_length << std::endl;
72 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"bits before get_more_bits " << *bits << std::endl;
77 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"bits after get_more_bits " << *bits << std::endl;
79 string_body_bits >>= header_length;
80 string_body_bits.resize(bits->size() - header_length);
82 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"string_body_bits " << string_body_bits << std::endl;
88 unsigned dccl::v3::VarBytesCodec::size()
93 unsigned dccl::v3::VarBytesCodec::size(
const std::string& wire_value)
95 return std::min(presence_size() + prefix_size() +
static_cast<unsigned>(wire_value.length()*dccl::BITS_IN_BYTE), max_size());
99 unsigned dccl::v3::VarBytesCodec::max_size()
101 return presence_size() + prefix_size() + dccl_field_options().max_length() * dccl::BITS_IN_BYTE;
104 unsigned dccl::v3::VarBytesCodec::min_size()
107 return prefix_size();
109 return presence_size();
113 void dccl::v3::VarBytesCodec::validate()
115 require(dccl_field_options().has_max_length(),
"missing (dccl.field).max_length");