Protocol Buffers - Google's data interchange format (grpc依赖)
https://developers.google.com/protocol-buffers/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.8 KiB
64 lines
1.8 KiB
#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_
|
|
|