29 #include "field_codec_default.h"
31 using namespace dccl::logger;
37 dccl::Bitset dccl::v2::DefaultBoolCodec::encode() {
return Bitset(size()); }
39 dccl::Bitset dccl::v2::DefaultBoolCodec::encode(
const bool& wire_value)
41 return Bitset(size(), use_required() ? wire_value : wire_value + 1);
44 bool dccl::v2::DefaultBoolCodec::decode(Bitset* bits)
46 unsigned long t = bits->to_ulong();
58 throw NullValueException();
62 unsigned dccl::v2::DefaultBoolCodec::size()
65 const unsigned BOOL_VALUES = 2;
67 const unsigned NULL_VALUE = use_required() ? 0 : 1;
72 void dccl::v2::DefaultBoolCodec::validate() {}
78 dccl::Bitset dccl::v2::DefaultStringCodec::encode() {
return Bitset(min_size()); }
80 dccl::Bitset dccl::v2::DefaultStringCodec::encode(
const std::string& wire_value)
82 std::string s = wire_value;
83 if (s.size() > dccl_field_options().max_length())
88 this->this_field(), this->this_descriptor()));
90 dccl::dlog.
is(DEBUG2) &&
91 dccl::dlog <<
"String " << s <<
" exceeds `dccl.max_length`, truncating" << std::endl;
92 s.resize(dccl_field_options().max_length());
96 value_bits.from_byte_string(s);
98 Bitset length_bits(min_size(), s.length());
100 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"DefaultStringCodec value_bits: " << value_bits
103 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"DefaultStringCodec length_bits: " << length_bits
107 for (
int i = 0, n = value_bits.size(); i < n; ++i) length_bits.push_back(value_bits[i]);
109 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"DefaultStringCodec created: " << length_bits
115 std::string dccl::v2::DefaultStringCodec::decode(Bitset* bits)
117 unsigned value_length = bits->to_ulong();
121 unsigned header_length = min_size();
123 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"Length of string is = " << value_length
126 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"bits before get_more_bits " << *bits << std::endl;
129 bits->get_more_bits(value_length * BITS_IN_BYTE);
131 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"bits after get_more_bits " << *bits << std::endl;
132 Bitset string_body_bits = *bits;
133 string_body_bits >>= header_length;
134 string_body_bits.resize(bits->size() - header_length);
136 return string_body_bits.to_byte_string();
140 throw NullValueException();
144 unsigned dccl::v2::DefaultStringCodec::size() {
return min_size(); }
146 unsigned dccl::v2::DefaultStringCodec::size(
const std::string& wire_value)
148 return std::min(min_size() +
static_cast<unsigned>(wire_value.length() * BITS_IN_BYTE),
152 unsigned dccl::v2::DefaultStringCodec::max_size()
155 return min_size() + dccl_field_options().max_length() * BITS_IN_BYTE;
158 unsigned dccl::v2::DefaultStringCodec::min_size() {
return dccl::ceil_log2(MAX_STRING_LENGTH + 1); }
160 void dccl::v2::DefaultStringCodec::validate()
162 require(dccl_field_options().has_max_length(),
"missing (dccl.field).max_length");
163 require(dccl_field_options().max_length() <= MAX_STRING_LENGTH,
164 "(dccl.field).max_length must be <= " +
165 std::to_string(
static_cast<int>(MAX_STRING_LENGTH)));
171 dccl::Bitset dccl::v2::DefaultBytesCodec::encode() {
return Bitset(min_size(), 0); }
173 dccl::Bitset dccl::v2::DefaultBytesCodec::encode(
const std::string& wire_value)
178 if (bits.size() > max_size() && this->strict())
181 this->this_field(), this->this_descriptor()));
183 bits.resize(max_size());
194 unsigned dccl::v2::DefaultBytesCodec::size() {
return min_size(); }
196 unsigned dccl::v2::DefaultBytesCodec::size(
const std::string& ) {
return max_size(); }
198 std::string dccl::v2::DefaultBytesCodec::decode(Bitset* bits)
202 if (bits->to_ulong())
205 bits->get_more_bits(max_size() - min_size());
207 Bitset bytes_body_bits = *bits;
208 bytes_body_bits >>= min_size();
209 bytes_body_bits.resize(bits->size() - min_size());
211 return bytes_body_bits.to_byte_string();
215 throw NullValueException();
220 return bits->to_byte_string();
224 unsigned dccl::v2::DefaultBytesCodec::max_size()
226 return dccl_field_options().max_length() * BITS_IN_BYTE +
227 (use_required() ? 0 : 1);
230 unsigned dccl::v2::DefaultBytesCodec::min_size()
238 void dccl::v2::DefaultBytesCodec::validate()
240 require(dccl_field_options().has_max_length(),
"missing (dccl.field).max_length");
247 const google::protobuf::EnumValueDescriptor*
const& field_value)
249 return field_value->index();
252 const google::protobuf::EnumValueDescriptor*
255 const google::protobuf::EnumDescriptor* e = this_field()->enum_type();
257 if (wire_value < e->value_count())
259 const google::protobuf::EnumValueDescriptor* return_value = e->value(wire_value);