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