22 #ifndef DCCLFIELDCODECDEFAULTMESSAGEV320140421H
23 #define DCCLFIELDCODECDEFAULTMESSAGEV320140421H
25 #include "dccl/field_codec.h"
26 #include "dccl/field_codec_manager.h"
28 #include "dccl/option_extensions.pb.h"
39 void any_encode(
Bitset* bits,
const boost::any& wire_value);
40 void any_decode(
Bitset* bits, boost::any* wire_value);
43 unsigned any_size(
const boost::any& wire_value);
46 boost::shared_ptr<FieldCodecBase> find(
const google::protobuf::FieldDescriptor* field_desc)
57 bool check_field(
const google::protobuf::FieldDescriptor* field);
61 static void repeated(boost::shared_ptr<FieldCodecBase> codec,
62 unsigned* return_value,
63 const std::vector<boost::any>& field_values,
64 const google::protobuf::FieldDescriptor* field_desc)
66 codec->field_size_repeated(return_value, field_values, field_desc);
69 static void single(boost::shared_ptr<FieldCodecBase> codec,
70 unsigned* return_value,
71 const boost::any& field_value,
72 const google::protobuf::FieldDescriptor* field_desc)
74 codec->field_size(return_value, field_value, field_desc);
81 static void repeated(boost::shared_ptr<FieldCodecBase> codec,
83 const std::vector<boost::any>& field_values,
84 const google::protobuf::FieldDescriptor* field_desc)
86 codec->field_encode_repeated(return_value, field_values, field_desc);
89 static void single(boost::shared_ptr<FieldCodecBase> codec,
91 const boost::any& field_value,
92 const google::protobuf::FieldDescriptor* field_desc)
94 codec->field_encode(return_value, field_value, field_desc);
100 static void field(boost::shared_ptr<FieldCodecBase> codec,
101 unsigned* return_value,
102 const google::protobuf::FieldDescriptor* field_desc)
104 codec->field_max_size(return_value, field_desc);
110 static void field(boost::shared_ptr<FieldCodecBase> codec,
111 unsigned* return_value,
112 const google::protobuf::FieldDescriptor* field_desc)
114 codec->field_min_size(return_value, field_desc);
121 static void field(boost::shared_ptr<FieldCodecBase> codec,
123 const google::protobuf::FieldDescriptor* field_desc)
125 codec->field_validate(return_value, field_desc);
131 static void field(boost::shared_ptr<FieldCodecBase> codec,
132 std::stringstream* return_value,
133 const google::protobuf::FieldDescriptor* field_desc)
135 codec->field_info(return_value, field_desc);
140 template<
typename Action,
typename ReturnType>
141 void traverse_descriptor(ReturnType* return_value)
143 const google::protobuf::Descriptor* desc =
146 for(
int i = 0, n = desc->field_count(); i < n; ++i)
148 const google::protobuf::FieldDescriptor* field_desc = desc->field(i);
150 if(!check_field(field_desc))
153 Action::field(find(field_desc), return_value, field_desc);
158 template<
typename Action,
typename ReturnType>
159 ReturnType traverse_const_message(
const boost::any& wire_value)
163 ReturnType return_value = ReturnType();
166 const google::protobuf::Descriptor* desc = msg->GetDescriptor();
167 const google::protobuf::Reflection* refl = msg->GetReflection();
168 for(
int i = 0, n = desc->field_count(); i < n; ++i)
170 const google::protobuf::FieldDescriptor* field_desc = desc->field(i);
172 if(!check_field(field_desc))
175 boost::shared_ptr<FieldCodecBase> codec = find(field_desc);
176 boost::shared_ptr<internal::FromProtoCppTypeBase> helper =
177 internal::TypeHelper::find(field_desc);
180 if(field_desc->is_repeated())
182 std::vector<boost::any> field_values;
183 for(
int j = 0, m = refl->FieldSize(*msg, field_desc); j < m; ++j)
184 field_values.push_back(helper->get_repeated_value(field_desc, *msg, j));
186 Action::repeated(codec, &return_value, field_values, field_desc);
190 Action::single(codec, &return_value, helper->get_value(field_desc, *msg), field_desc);
195 catch(boost::bad_any_cast& e)
197 throw(
Exception(
"Bad type given to traverse const, expecting const google::protobuf::Message*, got " + std::string(wire_value.type().name())));