ADD: added new version of protobuf
This commit is contained in:
64
libs/protobuf/benchmarks/util/data_proto2_to_proto3_util.h
Normal file
64
libs/protobuf/benchmarks/util/data_proto2_to_proto3_util.h
Normal file
@@ -0,0 +1,64 @@
|
||||
#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_
|
||||
Reference in New Issue
Block a user