22 #ifndef DCCLFIELDCODECDEFAULTMESSAGE20110510H
23 #define DCCLFIELDCODECDEFAULTMESSAGE20110510H
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)
54 bool check_field(
const google::protobuf::FieldDescriptor* field);
58 static void repeated(boost::shared_ptr<FieldCodecBase> codec,
59 unsigned* return_value,
60 const std::vector<boost::any>& field_values,
61 const google::protobuf::FieldDescriptor* field_desc)
63 codec->field_size_repeated(return_value, field_values, field_desc);
66 static void single(boost::shared_ptr<FieldCodecBase> codec,
67 unsigned* return_value,
68 const boost::any& field_value,
69 const google::protobuf::FieldDescriptor* field_desc)
71 codec->field_size(return_value, field_value, field_desc);
78 static void repeated(boost::shared_ptr<FieldCodecBase> codec,
80 const std::vector<boost::any>& field_values,
81 const google::protobuf::FieldDescriptor* field_desc)
83 codec->field_encode_repeated(return_value, field_values, field_desc);
86 static void single(boost::shared_ptr<FieldCodecBase> codec,
88 const boost::any& field_value,
89 const google::protobuf::FieldDescriptor* field_desc)
91 codec->field_encode(return_value, field_value, field_desc);
97 static void field(boost::shared_ptr<FieldCodecBase> codec,
98 unsigned* return_value,
99 const google::protobuf::FieldDescriptor* field_desc)
101 codec->field_max_size(return_value, field_desc);
107 static void field(boost::shared_ptr<FieldCodecBase> codec,
108 unsigned* return_value,
109 const google::protobuf::FieldDescriptor* field_desc)
111 codec->field_min_size(return_value, field_desc);
118 static void field(boost::shared_ptr<FieldCodecBase> codec,
120 const google::protobuf::FieldDescriptor* field_desc)
122 codec->field_validate(return_value, field_desc);
128 static void field(boost::shared_ptr<FieldCodecBase> codec,
129 std::stringstream* return_value,
130 const google::protobuf::FieldDescriptor* field_desc)
132 codec->field_info(return_value, field_desc);
137 template<
typename Action,
typename ReturnType>
138 void traverse_descriptor(ReturnType* return_value)
140 const google::protobuf::Descriptor* desc =
142 for(
int i = 0, n = desc->field_count(); i < n; ++i)
144 const google::protobuf::FieldDescriptor* field_desc = desc->field(i);
146 if(!check_field(field_desc))
149 Action::field(find(field_desc), return_value, field_desc);
154 template<
typename Action,
typename ReturnType>
155 ReturnType traverse_const_message(
const boost::any& wire_value)
159 ReturnType return_value = ReturnType();
162 const google::protobuf::Descriptor* desc = msg->GetDescriptor();
163 const google::protobuf::Reflection* refl = msg->GetReflection();
164 for(
int i = 0, n = desc->field_count(); i < n; ++i)
166 const google::protobuf::FieldDescriptor* field_desc = desc->field(i);
168 if(!check_field(field_desc))
171 boost::shared_ptr<FieldCodecBase> codec = find(field_desc);
172 boost::shared_ptr<internal::FromProtoCppTypeBase> helper =
173 internal::TypeHelper::find(field_desc);
176 if(field_desc->is_repeated())
178 std::vector<boost::any> field_values;
179 for(
int j = 0, m = refl->FieldSize(*msg, field_desc); j < m; ++j)
180 field_values.push_back(helper->get_repeated_value(field_desc, *msg, j));
182 Action::repeated(codec, &return_value, field_values, field_desc);
186 Action::single(codec, &return_value, helper->get_value(field_desc, *msg), field_desc);
191 catch(boost::bad_any_cast& e)
193 throw(
Exception(
"Bad type given to traverse const, expecting const google::protobuf::Message*, got " + std::string(wire_value.type().name())));