24#ifndef DCCLPROTOBUFCPPTYPEHELPERS20110323H
25#define DCCLPROTOBUFCPPTYPEHELPERS20110323H
29#include <google/protobuf/descriptor.h>
30#include <google/protobuf/descriptor.pb.h>
31#include <google/protobuf/message.h>
43 virtual std::string
as_str() {
return "TYPE_UNKNOWN"; }
51 return google::protobuf::FieldDescriptorProto::Type_Name(
52 static_cast<google::protobuf::FieldDescriptorProto::Type
>(t));
63 virtual std::string
as_str() {
return "CPPTYPE_UNKNOWN"; }
70 dccl::any
get_value(
const google::protobuf::FieldDescriptor* field,
71 const google::protobuf::Message& msg)
76 if (!field->has_presence())
77 return _get_value(field, msg);
78 const google::protobuf::Reflection* refl = msg.GetReflection();
79 if (!refl->HasField(msg, field))
82 return _get_value(field, msg);
86 dccl::any
get_value(
const google::protobuf::Message& msg) {
return _get_value(
nullptr, msg); }
95 const google::protobuf::Message& msg,
int index)
97 return _get_repeated_value(field, msg, index);
105 void set_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
111 _set_value(field, msg, value);
115 void set_value(google::protobuf::Message* msg, dccl::any value)
120 _set_value(
nullptr, msg, value);
127 void add_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
133 _add_value(field, msg, value);
136 virtual void _set_value(
const google::protobuf::FieldDescriptor* ,
137 google::protobuf::Message* , dccl::any )
142 virtual void _add_value(
const google::protobuf::FieldDescriptor* ,
143 google::protobuf::Message* , dccl::any )
148 virtual dccl::any _get_repeated_value(
const google::protobuf::FieldDescriptor* ,
149 const google::protobuf::Message& ,
int )
154 virtual dccl::any _get_value(
const google::protobuf::FieldDescriptor* ,
155 const google::protobuf::Message& )
170 std::string
as_str()
override {
return "CPPTYPE_DOUBLE"; }
173 dccl::any _get_value(
const google::protobuf::FieldDescriptor* field,
174 const google::protobuf::Message& msg)
override
176 return msg.GetReflection()->GetDouble(msg, field);
178 dccl::any _get_repeated_value(
const google::protobuf::FieldDescriptor* field,
179 const google::protobuf::Message& msg,
int index)
override
181 return msg.GetReflection()->GetRepeatedDouble(msg, field, index);
183 void _set_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
184 dccl::any value)
override
186 msg->GetReflection()->SetDouble(msg, field, dccl::any_cast<type>(value));
188 void _add_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
189 dccl::any value)
override
191 msg->GetReflection()->AddDouble(msg, field, dccl::any_cast<type>(value));
201 std::string
as_str()
override {
return "CPPTYPE_FLOAT"; }
204 dccl::any _get_value(
const google::protobuf::FieldDescriptor* field,
205 const google::protobuf::Message& msg)
override
207 return msg.GetReflection()->GetFloat(msg, field);
209 dccl::any _get_repeated_value(
const google::protobuf::FieldDescriptor* field,
210 const google::protobuf::Message& msg,
int index)
override
212 return msg.GetReflection()->GetRepeatedFloat(msg, field, index);
214 void _set_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
215 dccl::any value)
override
217 msg->GetReflection()->SetFloat(msg, field, dccl::any_cast<type>(value));
219 void _add_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
220 dccl::any value)
override
222 msg->GetReflection()->AddFloat(msg, field, dccl::any_cast<type>(value));
230 using type = google::protobuf::int32;
231 std::string
as_str()
override {
return "CPPTYPE_INT32"; }
234 dccl::any _get_value(
const google::protobuf::FieldDescriptor* field,
235 const google::protobuf::Message& msg)
override
237 return msg.GetReflection()->GetInt32(msg, field);
239 dccl::any _get_repeated_value(
const google::protobuf::FieldDescriptor* field,
240 const google::protobuf::Message& msg,
int index)
override
242 return msg.GetReflection()->GetRepeatedInt32(msg, field, index);
244 void _set_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
245 dccl::any value)
override
247 msg->GetReflection()->SetInt32(msg, field, dccl::any_cast<type>(value));
249 void _add_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
250 dccl::any value)
override
252 msg->GetReflection()->AddInt32(msg, field, dccl::any_cast<type>(value));
260 using type = google::protobuf::int64;
261 std::string
as_str()
override {
return "CPPTYPE_INT64"; }
264 dccl::any _get_value(
const google::protobuf::FieldDescriptor* field,
265 const google::protobuf::Message& msg)
override
267 return msg.GetReflection()->GetInt64(msg, field);
269 dccl::any _get_repeated_value(
const google::protobuf::FieldDescriptor* field,
270 const google::protobuf::Message& msg,
int index)
override
272 return msg.GetReflection()->GetRepeatedInt64(msg, field, index);
274 void _set_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
275 dccl::any value)
override
277 msg->GetReflection()->SetInt64(msg, field, dccl::any_cast<type>(value));
279 void _add_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
280 dccl::any value)
override
282 msg->GetReflection()->AddInt64(msg, field, dccl::any_cast<type>(value));
290 using type = google::protobuf::uint32;
291 std::string
as_str()
override {
return "CPPTYPE_UINT32"; }
294 dccl::any _get_value(
const google::protobuf::FieldDescriptor* field,
295 const google::protobuf::Message& msg)
override
297 return msg.GetReflection()->GetUInt32(msg, field);
299 dccl::any _get_repeated_value(
const google::protobuf::FieldDescriptor* field,
300 const google::protobuf::Message& msg,
int index)
override
302 return msg.GetReflection()->GetRepeatedUInt32(msg, field, index);
304 void _set_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
305 dccl::any value)
override
307 msg->GetReflection()->SetUInt32(msg, field, dccl::any_cast<type>(value));
309 void _add_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
310 dccl::any value)
override
312 msg->GetReflection()->AddUInt32(msg, field, dccl::any_cast<type>(value));
320 using type = google::protobuf::uint64;
322 std::string
as_str()
override {
return "CPPTYPE_UINT64"; }
325 dccl::any _get_value(
const google::protobuf::FieldDescriptor* field,
326 const google::protobuf::Message& msg)
override
328 return msg.GetReflection()->GetUInt64(msg, field);
330 dccl::any _get_repeated_value(
const google::protobuf::FieldDescriptor* field,
331 const google::protobuf::Message& msg,
int index)
override
333 return msg.GetReflection()->GetRepeatedUInt64(msg, field, index);
335 void _set_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
336 dccl::any value)
override
338 msg->GetReflection()->SetUInt64(msg, field, dccl::any_cast<type>(value));
340 void _add_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
341 dccl::any value)
override
343 msg->GetReflection()->AddUInt64(msg, field, dccl::any_cast<type>(value));
352 std::string
as_str()
override {
return "CPPTYPE_BOOL"; }
355 dccl::any _get_value(
const google::protobuf::FieldDescriptor* field,
356 const google::protobuf::Message& msg)
override
358 return msg.GetReflection()->GetBool(msg, field);
360 dccl::any _get_repeated_value(
const google::protobuf::FieldDescriptor* field,
361 const google::protobuf::Message& msg,
int index)
override
363 return msg.GetReflection()->GetRepeatedBool(msg, field, index);
365 void _set_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
366 dccl::any value)
override
368 msg->GetReflection()->SetBool(msg, field, dccl::any_cast<type>(value));
370 void _add_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
371 dccl::any value)
override
373 msg->GetReflection()->AddBool(msg, field, dccl::any_cast<type>(value));
381 using type = std::string;
382 std::string
as_str()
override {
return "CPPTYPE_STRING"; }
385 dccl::any _get_value(
const google::protobuf::FieldDescriptor* field,
386 const google::protobuf::Message& msg)
override
388 return msg.GetReflection()->GetString(msg, field);
390 dccl::any _get_repeated_value(
const google::protobuf::FieldDescriptor* field,
391 const google::protobuf::Message& msg,
int index)
override
393 return msg.GetReflection()->GetRepeatedString(msg, field, index);
395 void _set_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
396 dccl::any value)
override
398 msg->GetReflection()->SetString(msg, field, dccl::any_cast<type>(value));
400 void _add_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
401 dccl::any value)
override
403 msg->GetReflection()->AddString(msg, field, dccl::any_cast<type>(value));
412 using const_type =
const google::protobuf::EnumValueDescriptor*;
413 using mutable_type = google::protobuf::EnumValueDescriptor*;
415 std::string
as_str()
override {
return "CPPTYPE_ENUM"; }
418 dccl::any _get_value(
const google::protobuf::FieldDescriptor* field,
419 const google::protobuf::Message& msg)
override
421 return msg.GetReflection()->GetEnum(msg, field);
423 dccl::any _get_repeated_value(
const google::protobuf::FieldDescriptor* field,
424 const google::protobuf::Message& msg,
int index)
override
426 return msg.GetReflection()->GetRepeatedEnum(msg, field, index);
428 void _set_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
429 dccl::any value)
override
431 msg->GetReflection()->SetEnum(msg, field, dccl::any_cast<const_type>(value));
433 void _add_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
434 dccl::any value)
override
436 msg->GetReflection()->AddEnum(msg, field, dccl::any_cast<const_type>(value));
446 using const_type =
const google::protobuf::Message*;
447 using mutable_type = google::protobuf::Message*;
448 std::string
as_str()
override {
return "CPPTYPE_MESSAGE"; }
451 dccl::any _get_value(
const google::protobuf::FieldDescriptor* field,
452 const google::protobuf::Message& msg)
override
455 return &(msg.GetReflection()->GetMessage(msg, field));
460 dccl::any _get_repeated_value(
const google::protobuf::FieldDescriptor* field,
461 const google::protobuf::Message& msg,
int index)
override
463 return &(msg.GetReflection()->GetRepeatedMessage(msg, field, index));
466 void _set_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
467 dccl::any value)
override
471 auto p = dccl::any_cast<const_type>(value);
474 msg->GetReflection()->MutableMessage(msg, field)->MergeFrom(*p);
478 catch (dccl::bad_any_cast& e)
480 auto p = dccl::any_cast<mutable_type>(value);
482 msg->GetReflection()->MutableMessage(msg, field)->MergeFrom(*p);
487 void _add_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
488 dccl::any value)
override
492 auto p = dccl::any_cast<const_type>(value);
493 msg->GetReflection()->AddMessage(msg, field)->MergeFrom(*p);
495 catch (dccl::bad_any_cast& e)
497 auto p = dccl::any_cast<mutable_type>(value);
498 msg->GetReflection()->AddMessage(msg, field)->MergeFrom(*p);
504template <
typename CustomMessage>
506 :
public FromProtoCppType<google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE>
509 using type = CustomMessage;
514 dccl::any _get_value(
const google::protobuf::FieldDescriptor* field,
515 const google::protobuf::Message& msg)
override
517 auto p = dccl::any_cast<Parent::const_type>(Parent::_get_value(field, msg));
523 dccl::any _get_repeated_value(
const google::protobuf::FieldDescriptor* field,
524 const google::protobuf::Message& msg,
int index)
override
526 auto p = dccl::any_cast<Parent::const_type>(Parent::_get_repeated_value(field, msg, index));
532 void _set_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
533 dccl::any value)
override
535 type v = dccl::any_cast<type>(value);
536 Parent::const_type p = &v;
537 Parent::_set_value(field, msg, p);
539 void _add_value(
const google::protobuf::FieldDescriptor* field, google::protobuf::Message* msg,
540 dccl::any value)
override
542 type v = dccl::any_cast<type>(value);
543 Parent::const_type p = &v;
544 Parent::_add_value(field, msg, p);
554 static constexpr google::protobuf::FieldDescriptor::CppType as_enum()
556 return google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE;
562 static constexpr google::protobuf::FieldDescriptor::CppType as_enum()
564 return google::protobuf::FieldDescriptor::CPPTYPE_FLOAT;
570 static constexpr google::protobuf::FieldDescriptor::CppType as_enum()
572 return google::protobuf::FieldDescriptor::CPPTYPE_INT32;
578 static constexpr google::protobuf::FieldDescriptor::CppType as_enum()
580 return google::protobuf::FieldDescriptor::CPPTYPE_UINT32;
586 static constexpr google::protobuf::FieldDescriptor::CppType as_enum()
588 return google::protobuf::FieldDescriptor::CPPTYPE_INT64;
594 static constexpr google::protobuf::FieldDescriptor::CppType as_enum()
596 return google::protobuf::FieldDescriptor::CPPTYPE_UINT64;
602 static constexpr google::protobuf::FieldDescriptor::CppType as_enum()
604 return google::protobuf::FieldDescriptor::CPPTYPE_STRING;
610 static constexpr google::protobuf::FieldDescriptor::CppType as_enum()
612 return google::protobuf::FieldDescriptor::CPPTYPE_ENUM;
619 static constexpr google::protobuf::FieldDescriptor::CppType as_enum()
621 return google::protobuf::FieldDescriptor::CPPTYPE_BOOL;
628 static constexpr google::protobuf::FieldDescriptor::CppType as_enum()
630 return google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE;
Provides various representations of a google::protobuf::FieldDescriptor::CppType enumeration,...
dccl::any get_value(const google::protobuf::Message &msg)
Get the value of the entire base message (only works for CPPTYPE_MESSAGE)
dccl::any get_value(const google::protobuf::FieldDescriptor *field, const google::protobuf::Message &msg)
Get a given field's value from the provided message.
virtual std::string as_str()
string representation
void set_value(const google::protobuf::FieldDescriptor *field, google::protobuf::Message *msg, dccl::any value)
Set a given field's value in the provided message.
void set_value(google::protobuf::Message *msg, dccl::any value)
Set the value of the entire base message (only works for CPPTYPE_MESSAGE)
dccl::any get_repeated_value(const google::protobuf::FieldDescriptor *field, const google::protobuf::Message &msg, int index)
Get the value of a repeated field at a given index.
void add_value(const google::protobuf::FieldDescriptor *field, google::protobuf::Message *msg, dccl::any value)
Add a new entry for a repeated field to the back.
std::string as_str() override
string representation
std::string as_str() override
string representation
std::string as_str() override
string representation
std::string as_str() override
string representation
std::string as_str() override
string representation
std::string as_str() override
string representation
Implements FromProtoCppTypeBase for CPPTYPE_MESSAGE using the dynamic google::protobuf::Message as th...
std::string as_str() override
string representation
std::string as_str() override
string representation
std::string as_str() override
string representation
std::string as_str() override
string representation
Implements FromProtoCppTypeBase for CPPTYPE_MESSAGE using a specific statically generated Protobuf cl...
Provides various representations of a google::protobuf::FieldDescriptor::Type enumeration....
virtual std::string as_str()
string representation of the google::protobuf::FieldDescriptor::Type.
std::string as_str() override
string representation of the google::protobuf::FieldDescriptor::Type.
Dynamic Compact Control Language namespace.