25 #include "dccl/codecs2/field_codec_default.h"
26 #include "dccl/codec.h"
28 using namespace dccl::logger;
37 return Bitset(size());
40 dccl::Bitset dccl::v2::DefaultBoolCodec::encode(
const bool& wire_value)
42 return Bitset(size(), use_required() ? wire_value : wire_value + 1);
45 bool dccl::v2::DefaultBoolCodec::decode(Bitset* bits)
47 unsigned long t = bits->to_ulong();
59 throw NullValueException();
64 unsigned dccl::v2::DefaultBoolCodec::size()
67 const unsigned BOOL_VALUES = 2;
69 const unsigned NULL_VALUE = use_required() ? 0 : 1;
74 void dccl::v2::DefaultBoolCodec::validate()
83 return Bitset(min_size());
86 dccl::Bitset dccl::v2::DefaultStringCodec::encode(
const std::string& wire_value)
88 std::string s = wire_value;
89 if(s.size() > dccl_field_options().max_length())
94 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"String " << s <<
" exceeds `dccl.max_length`, truncating" << std::endl;
95 s.resize(dccl_field_options().max_length());
100 value_bits.from_byte_string(s);
102 Bitset length_bits(min_size(), s.length());
104 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"DefaultStringCodec value_bits: " << value_bits << std::endl;
107 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"DefaultStringCodec length_bits: " << length_bits << std::endl;
110 for(
int i = 0, n = value_bits.size(); i < n; ++i)
111 length_bits.push_back(value_bits[i]);
113 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"DefaultStringCodec created: " << length_bits << std::endl;
119 std::string dccl::v2::DefaultStringCodec::decode(Bitset* bits)
121 unsigned value_length = bits->to_ulong();
126 unsigned header_length = min_size();
128 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"Length of string is = " << value_length << std::endl;
130 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"bits before get_more_bits " << *bits << std::endl;
133 bits->get_more_bits(value_length*BITS_IN_BYTE);
136 dccl::dlog.
is(DEBUG2) && dccl::dlog <<
"bits after get_more_bits " << *bits << std::endl;
137 Bitset string_body_bits = *bits;
138 string_body_bits >>= header_length;
139 string_body_bits.resize(bits->size() - header_length);
141 return string_body_bits.to_byte_string();
145 throw NullValueException();
150 unsigned dccl::v2::DefaultStringCodec::size()
155 unsigned dccl::v2::DefaultStringCodec::size(
const std::string& wire_value)
157 return std::min(min_size() +
static_cast<unsigned>(wire_value.length()*BITS_IN_BYTE), max_size());
161 unsigned dccl::v2::DefaultStringCodec::max_size()
164 return min_size() + dccl_field_options().max_length() * BITS_IN_BYTE;
167 unsigned dccl::v2::DefaultStringCodec::min_size()
173 void dccl::v2::DefaultStringCodec::validate()
175 require(dccl_field_options().has_max_length(),
"missing (dccl.field).max_length");
176 require(dccl_field_options().max_length() <= MAX_STRING_LENGTH,
177 "(dccl.field).max_length must be <= " + boost::lexical_cast<std::string>(
static_cast<int>(MAX_STRING_LENGTH)));
185 return Bitset(min_size(), 0);
189 dccl::Bitset dccl::v2::DefaultBytesCodec::encode(
const std::string& wire_value)
194 if(bits.size() > max_size() && this->strict())
197 bits.resize(max_size());
208 unsigned dccl::v2::DefaultBytesCodec::size()
214 unsigned dccl::v2::DefaultBytesCodec::size(
const std::string& wire_value)
220 std::string dccl::v2::DefaultBytesCodec::decode(Bitset* bits)
227 bits->get_more_bits(max_size()- min_size());
229 Bitset bytes_body_bits = *bits;
230 bytes_body_bits >>= min_size();
231 bytes_body_bits.resize(bits->size() - min_size());
233 return bytes_body_bits.to_byte_string();
237 throw NullValueException();
242 return bits->to_byte_string();
246 unsigned dccl::v2::DefaultBytesCodec::max_size()
248 return dccl_field_options().max_length() * BITS_IN_BYTE +
249 (use_required() ? 0 : 1);
252 unsigned dccl::v2::DefaultBytesCodec::min_size()
260 void dccl::v2::DefaultBytesCodec::validate()
262 require(dccl_field_options().has_max_length(),
"missing (dccl.field).max_length");
270 return field_value->index();
275 const google::protobuf::EnumDescriptor* e = this_field()->enum_type();
277 if(wire_value < e->value_count())
279 const google::protobuf::EnumValueDescriptor* return_value = e->value(wire_value);