#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 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_