22 #include "dccl/codecs3/field_codec_default.h"
24 using namespace dccl::logger;
32 return Bitset(min_size());
35 dccl::Bitset dccl::v3::DefaultStringCodec::encode(
const std::string& wire_value)
37 std::string s = wire_value;
38 if(s.size() > dccl_field_options().max_length())
43 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"String " << s <<
" exceeds `dccl.max_length`, truncating" << std::endl;
44 s.resize(dccl_field_options().max_length());
49 value_bits.from_byte_string(s);
51 Bitset length_bits(min_size(), s.length());
53 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"DefaultStringCodec value_bits: " << value_bits << std::endl;
56 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"DefaultStringCodec length_bits: " << length_bits << std::endl;
59 for(
int i = 0, n = value_bits.size(); i < n; ++i)
60 length_bits.push_back(value_bits[i]);
62 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"DefaultStringCodec created: " << length_bits << std::endl;
68 std::string dccl::v3::DefaultStringCodec::decode(Bitset* bits)
70 unsigned value_length = bits->to_ulong();
75 unsigned header_length = min_size();
77 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"Length of string is = " << value_length << std::endl;
79 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"bits before get_more_bits " << *bits << std::endl;
82 bits->get_more_bits(value_length*BITS_IN_BYTE);
85 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"bits after get_more_bits " << *bits << std::endl;
86 Bitset string_body_bits = *bits;
87 string_body_bits >>= header_length;
88 string_body_bits.resize(bits->size() - header_length);
90 return string_body_bits.to_byte_string();
94 throw NullValueException();
99 unsigned dccl::v3::DefaultStringCodec::size()
104 unsigned dccl::v3::DefaultStringCodec::size(
const std::string& wire_value)
106 return std::min(min_size() +
static_cast<unsigned>(wire_value.length()*BITS_IN_BYTE), max_size());
110 unsigned dccl::v3::DefaultStringCodec::max_size()
113 return min_size() + dccl_field_options().max_length() * BITS_IN_BYTE;
116 unsigned dccl::v3::DefaultStringCodec::min_size()
122 void dccl::v3::DefaultStringCodec::validate()
124 require(dccl_field_options().has_max_length(),
"missing (dccl.field).max_length");
130 double dccl::v3::DefaultEnumCodec::max()
132 const google::protobuf::EnumDescriptor* e = this_field()->enum_type();
134 if (dccl_field_options().packed_enum()) {
135 return e->value_count()-1;
137 const google::protobuf::EnumValueDescriptor* value = e->value(0);
138 int32 maxVal = value->number();
139 for (
int i=1; i < e->value_count(); ++i) {
141 if (value->number() > maxVal) { maxVal = value->number(); }
147 double dccl::v3::DefaultEnumCodec::min()
149 if (dccl_field_options().packed_enum()) {
152 const google::protobuf::EnumDescriptor* e = this_field()->enum_type();
153 const google::protobuf::EnumValueDescriptor* value = e->value(0);
154 int32 minVal = value->number();
155 for (
int i=1; i < e->value_count(); ++i) {
157 if (value->number() < minVal) { minVal = value->number(); }
165 if (dccl_field_options().packed_enum())
166 return field_value->index();
168 return field_value->number();
173 const google::protobuf::EnumDescriptor* e = this_field()->enum_type();
175 if (dccl_field_options().packed_enum()) {
176 if(wire_value < e->value_count()) {
177 const google::protobuf::EnumValueDescriptor* return_value = e->value(wire_value);
183 const google::protobuf::EnumValueDescriptor* return_value = e->FindValueByNumber(wire_value);
184 if(return_value != NULL)