12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- #ifndef PROTOBUF_BENCHMARKS_UTIL_DATA_PROTO2_TO_PROTO3_UTIL_H_
- #define PROTOBUF_BENCHMARKS_UTIL_DATA_PROTO2_TO_PROTO3_UTIL_H_
- #include "google/protobuf/message.h"
- #include "google/protobuf/descriptor.h"
- using google::protobuf::FieldDescriptor;
- using google::protobuf::Message;
- using google::protobuf::Reflection;
- namespace google {
- namespace protobuf {
- namespace util {
- class DataStripper {
- public:
- void StripMessage(Message *message) {
- std::vector<const FieldDescriptor*> set_fields;
- const Reflection* reflection = message->GetReflection();
- reflection->ListFields(*message, &set_fields);
- for (size_t i = 0; i < set_fields.size(); i++) {
- const FieldDescriptor* field = set_fields[i];
- if (ShouldBeClear(field)) {
- reflection->ClearField(message, field);
- continue;
- }
- if (field->type() == FieldDescriptor::TYPE_MESSAGE) {
- if (field->is_repeated()) {
- for (int j = 0; j < reflection->FieldSize(*message, field); j++) {
- StripMessage(reflection->MutableRepeatedMessage(message, field, j));
- }
- } else {
- StripMessage(reflection->MutableMessage(message, field));
- }
- }
- }
- reflection->MutableUnknownFields(message)->Clear();
- }
- private:
- virtual bool ShouldBeClear(const FieldDescriptor *field) = 0;
- };
- class GogoDataStripper : public DataStripper {
- private:
- virtual bool ShouldBeClear(const FieldDescriptor *field) {
- return field->type() == FieldDescriptor::TYPE_GROUP;
- }
- };
- class Proto3DataStripper : public DataStripper {
- private:
- virtual bool ShouldBeClear(const FieldDescriptor *field) {
- return field->type() == FieldDescriptor::TYPE_GROUP ||
- field->is_extension();
- }
- };
- } // namespace util
- } // namespace protobuf
- } // namespace google
- #endif // PROTOBUF_BENCHMARKS_UTIL_DATA_PROTO2_TO_PROTO3_UTIL_H_
|