Go to the documentation of this file.
35 #include <google/protobuf/wire_format.h>
41 #include <google/protobuf/stubs/logging.h>
42 #include <google/protobuf/stubs/common.h>
43 #include <google/protobuf/stubs/stringprintf.h>
44 #include <google/protobuf/descriptor.pb.h>
45 #include <google/protobuf/parse_context.h>
46 #include <google/protobuf/io/coded_stream.h>
47 #include <google/protobuf/io/zero_copy_stream.h>
48 #include <google/protobuf/io/zero_copy_stream_impl.h>
49 #include <google/protobuf/descriptor.h>
50 #include <google/protobuf/dynamic_message.h>
51 #include <google/protobuf/map_field.h>
52 #include <google/protobuf/map_field_inl.h>
53 #include <google/protobuf/message.h>
54 #include <google/protobuf/message_lite.h>
55 #include <google/protobuf/unknown_field_set.h>
58 #include <google/protobuf/port_def.inc>
68 const MapValueConstRef&
value);
89 if (
number == 0)
return false;
94 if (!
input->ReadVarint64(&
value))
return false;
95 if (unknown_fields !=
nullptr) unknown_fields->AddVarint(
number,
value);
100 if (!
input->ReadLittleEndian64(&
value))
return false;
101 if (unknown_fields !=
nullptr) unknown_fields->AddFixed64(
number,
value);
107 if (unknown_fields ==
nullptr) {
110 if (!
input->ReadString(unknown_fields->AddLengthDelimited(
number),
118 if (!
input->IncrementRecursionDepth())
return false;
121 : unknown_fields->AddGroup(
number))) {
124 input->DecrementRecursionDepth();
126 if (!
input->LastTagWas(
138 if (!
input->ReadLittleEndian32(&
value))
return false;
139 if (unknown_fields !=
nullptr) unknown_fields->AddFixed32(
number,
value);
170 bool (*is_valid)(
int),
176 while (
input->BytesUntilLimit() > 0) {
178 if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
182 if (is_valid ==
nullptr || is_valid(
value)) {
185 unknown_fields->AddVarint(field_number,
value);
188 input->PopLimit(limit);
194 io::EpsCopyOutputStream*
stream) {
195 for (
int i = 0;
i < unknown_fields.field_count();
i++) {
199 switch (
field.type()) {
232 io::EpsCopyOutputStream*
stream) {
233 for (
int i = 0;
i < unknown_fields.field_count();
i++) {
269 for (
int i = 0;
i < unknown_fields.field_count();
i++) {
272 switch (
field.type()) {
292 field.length_delimited().size());
311 for (
int i = 0;
i < unknown_fields.field_count();
i++) {
320 int field_size =
field.GetLengthDelimitedSize();
334 const Reflection* message_reflection =
message->GetReflection();
357 if (
input->GetExtensionPool() ==
nullptr) {
358 field = message_reflection->FindKnownExtensionByNumber(field_number);
360 field =
input->GetExtensionPool()->FindExtensionByNumber(
367 if (
field ==
nullptr &&
descriptor->options().message_set_wire_format() &&
387 return input->ReadString(unknown_fields->AddLengthDelimited(field_number),
395 const Reflection* message_reflection =
message->GetReflection();
396 if (
field ==
nullptr) {
399 input, field_number, message_reflection->MutableUnknownFields(
message));
400 }
else if (
field->is_repeated() ||
404 GOOGLE_LOG(
ERROR) <<
"Extensions of MessageSets must be optional messages.";
407 Message* sub_message = message_reflection->MutableMessage(
423 enum { UNKNOWN, NORMAL_FORMAT, PACKED_FORMAT } value_format;
425 if (
field ==
nullptr) {
426 value_format = UNKNOWN;
429 value_format = NORMAL_FORMAT;
430 }
else if (
field->is_packable() &&
433 value_format = PACKED_FORMAT;
440 if (value_format == UNKNOWN) {
443 }
else if (value_format == PACKED_FORMAT) {
448 switch (
field->type()) {
449 #define HANDLE_PACKED_TYPE(TYPE, CPPTYPE, CPPTYPE_METHOD) \
450 case FieldDescriptor::TYPE_##TYPE: { \
451 while (input->BytesUntilLimit() > 0) { \
453 if (!WireFormatLite::ReadPrimitive<CPPTYPE, \
454 WireFormatLite::TYPE_##TYPE>(input, \
457 message_reflection->Add##CPPTYPE_METHOD(message, field, value); \
478 #undef HANDLE_PACKED_TYPE
481 while (
input->BytesUntilLimit() > 0) {
483 if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
486 if (
message->GetDescriptor()->file()->syntax() ==
492 if (enum_value !=
nullptr) {
517 input->PopLimit(limit);
520 switch (
field->type()) {
521 #define HANDLE_TYPE(TYPE, CPPTYPE, CPPTYPE_METHOD) \
522 case FieldDescriptor::TYPE_##TYPE: { \
524 if (!WireFormatLite::ReadPrimitive<CPPTYPE, WireFormatLite::TYPE_##TYPE>( \
527 if (field->is_repeated()) { \
528 message_reflection->Add##CPPTYPE_METHOD(message, field, value); \
530 message_reflection->Set##CPPTYPE_METHOD(message, field, value); \
555 if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
558 if (
field->is_repeated()) {
571 if (strict_utf8_check) {
574 field->full_name().c_str())) {
579 field->full_name().c_str());
581 if (
field->is_repeated()) {
592 if (
field->is_repeated()) {
602 if (
field->is_repeated()) {
618 if (
field->is_repeated()) {
637 struct MSReflective {
648 const Reflection* message_reflection;
660 enum class State { kNoTag, kHasType, kHasPayload, kDone };
661 State
state = State::kNoTag;
665 while (!
ctx->Done(&
ptr)) {
673 if (
state == State::kNoTag) {
675 state = State::kHasType;
676 }
else if (
state == State::kHasPayload) {
679 if (
ctx->data().pool ==
nullptr) {
683 ctx->data().pool->FindExtensionByNumber(
descriptor, type_id);
685 if (
field ==
nullptr ||
field->message_type() ==
nullptr) {
694 ctx->data().factory);
704 state = State::kDone;
708 if (
state == State::kNoTag) {
713 state = State::kHasPayload;
714 }
else if (
state == State::kHasType) {
718 if (
ctx->data().pool ==
nullptr) {
722 ctx->data().pool->FindExtensionByNumber(
descriptor, type_id);
728 state = State::kDone;
752 while (!
ctx->Done(&
ptr)) {
755 if (PROTOBUF_PREDICT_FALSE(
ptr ==
nullptr))
return nullptr;
768 if (
ctx->data().pool ==
nullptr) {
778 if (PROTOBUF_PREDICT_FALSE(
ptr ==
nullptr))
return nullptr;
794 if (
descriptor->options().message_set_wire_format()) {
796 return message_set.ParseMessageSet(
ptr,
ctx);
798 while (!
ctx->Done(&
ptr)) {
801 if (PROTOBUF_PREDICT_FALSE(
ptr ==
nullptr))
return nullptr;
813 if (
ctx->data().pool ==
nullptr) {
817 ctx->data().pool->FindExtensionByNumber(
descriptor, field_number);
822 if (PROTOBUF_PREDICT_FALSE(
ptr ==
nullptr))
return nullptr;
830 if (
field ==
nullptr) {
840 switch (
field->type()) {
841 #define HANDLE_PACKED_TYPE(TYPE, CPPTYPE, CPPTYPE_METHOD) \
842 case FieldDescriptor::TYPE_##TYPE: { \
843 ptr = internal::Packed##CPPTYPE_METHOD##Parser( \
844 reflection->MutableRepeatedFieldInternal<CPPTYPE>(msg, field), ptr, \
865 #undef HANDLE_PACKED_TYPE
870 bool open_enum =
false;
875 return ctx->ReadPackedVarint(
877 if (
field->enum_type()->FindValueByNumber(val) !=
nullptr) {
880 WriteVarint(field->number(), val,
881 reflection->MutableUnknownFields(msg));
903 bool utf8_check =
false;
904 bool strict_utf8_check =
false;
905 switch (
field->type()) {
906 #define HANDLE_TYPE(TYPE, CPPTYPE, CPPTYPE_METHOD) \
907 case FieldDescriptor::TYPE_##TYPE: { \
909 ptr = VarintParse(ptr, &value); \
910 if (ptr == nullptr) return nullptr; \
911 if (field->is_repeated()) { \
912 reflection->Add##CPPTYPE_METHOD(msg, field, value); \
914 reflection->Set##CPPTYPE_METHOD(msg, field, value); \
927 if (
ptr ==
nullptr)
return nullptr;
928 if (
field->is_repeated()) {
937 if (
ptr ==
nullptr)
return nullptr;
938 if (
field->is_repeated()) {
946 #define HANDLE_TYPE(TYPE, CPPTYPE, CPPTYPE_METHOD) \
947 case FieldDescriptor::TYPE_##TYPE: { \
949 value = UnalignedLoad<CPPTYPE>(ptr); \
950 ptr += sizeof(CPPTYPE); \
951 if (field->is_repeated()) { \
952 reflection->Add##CPPTYPE_METHOD(msg, field, value); \
954 reflection->Set##CPPTYPE_METHOD(msg, field, value); \
972 if (
ptr ==
nullptr)
return nullptr;
973 if (
field->is_repeated()) {
985 PROTOBUF_FALLTHROUGH_INTENDED;
988 if (
ptr ==
nullptr)
return nullptr;
991 if (
ptr ==
nullptr)
return nullptr;
993 if (strict_utf8_check) {
996 field->full_name().c_str())) {
1001 field->full_name().c_str());
1004 if (
field->is_repeated()) {
1014 if (
field->is_repeated()) {
1021 return ctx->ParseGroup(sub_message,
ptr,
tag);
1026 if (
field->is_repeated()) {
1032 return ctx->ParseMessage(sub_message,
ptr);
1048 std::vector<const FieldDescriptor*>
fields;
1063 if (
descriptor->options().message_set_wire_format()) {
1076 switch (
field->type()) {
1085 #define CASE_TYPE(FieldType, CamelFieldType, CamelCppType) \
1086 case FieldDescriptor::TYPE_##FieldType: \
1087 target = WireFormatLite::Write##CamelFieldType##ToArray( \
1088 1, value.Get##CamelCppType##Value(), target); \
1113 switch (
field->type()) {
1114 #define CASE_TYPE(FieldType, CamelFieldType, CamelCppType) \
1115 case FieldDescriptor::TYPE_##FieldType: \
1116 target = WireFormatLite::Write##CamelFieldType##ToArray( \
1117 2, value.Get##CamelCppType##Value(), target); \
1150 class MapKeySorter {
1155 std::vector<MapKey> sorted_key_list;
1160 sorted_key_list.push_back(
it.GetKey());
1163 std::sort(sorted_key_list.begin(), sorted_key_list.end(), comparator);
1164 return sorted_key_list;
1168 class MapKeyComparator {
1173 #define CASE_TYPE(CppType, CamelCppType) \
1174 case FieldDescriptor::CPPTYPE_##CppType: { \
1175 return a.Get##CamelCppType##Value() < b.Get##CamelCppType##Value(); \
1186 GOOGLE_LOG(DFATAL) <<
"Invalid key for map field.";
1220 if (
field->is_extension() &&
1221 field->containing_type()->options().message_set_wire_format() &&
1223 !
field->is_repeated()) {
1241 if (
field->is_map()) {
1242 const MapFieldBase* map_field =
1244 if (map_field->IsMapValid()) {
1245 if (
stream->IsSerializationDeterministic()) {
1246 std::vector<MapKey> sorted_key_list =
1249 it != sorted_key_list.end(); ++
it) {
1250 MapValueConstRef map_value;
1256 for (MapIterator
it = message_reflection->
MapBegin(
1271 if (
field->is_repeated()) {
1273 }
else if (
field->containing_type()->options().map_entry()) {
1281 std::vector<const Message*> map_entries;
1282 if (
count > 1 &&
field->is_map() &&
stream->IsSerializationDeterministic()) {
1287 if (
field->is_packed()) {
1290 switch (
field->type()) {
1291 #define HANDLE_PRIMITIVE_TYPE(TYPE, CPPTYPE, TYPE_METHOD, CPPTYPE_METHOD) \
1292 case FieldDescriptor::TYPE_##TYPE: { \
1294 message_reflection->GetRepeatedFieldInternal<CPPTYPE>(message, field); \
1295 target = stream->Write##TYPE_METHOD##Packed( \
1296 field->number(), r, FieldDataOnlyByteSize(field, message), target); \
1308 #undef HANDLE_PRIMITIVE_TYPE
1309 #define HANDLE_PRIMITIVE_TYPE(TYPE, CPPTYPE, TYPE_METHOD, CPPTYPE_METHOD) \
1310 case FieldDescriptor::TYPE_##TYPE: { \
1312 message_reflection->GetRepeatedFieldInternal<CPPTYPE>(message, field); \
1313 target = stream->WriteFixedPacked(field->number(), r, target); \
1326 #undef HANDLE_PRIMITIVE_TYPE
1333 for (
int j = 0;
j <
count;
j++) {
1335 switch (
field->type()) {
1336 #define HANDLE_PRIMITIVE_TYPE(TYPE, CPPTYPE, TYPE_METHOD, CPPTYPE_METHOD) \
1337 case FieldDescriptor::TYPE_##TYPE: { \
1338 const CPPTYPE value = \
1339 field->is_repeated() \
1340 ? message_reflection->GetRepeated##CPPTYPE_METHOD(message, field, \
1342 : message_reflection->Get##CPPTYPE_METHOD(message, field); \
1343 target = WireFormatLite::Write##TYPE_METHOD##ToArray(field->number(), \
1364 #undef HANDLE_PRIMITIVE_TYPE
1366 #define HANDLE_TYPE(TYPE, TYPE_METHOD, CPPTYPE_METHOD) \
1367 case FieldDescriptor::TYPE_##TYPE: \
1368 target = WireFormatLite::InternalWrite##TYPE_METHOD( \
1370 field->is_repeated() \
1371 ? (map_entries.empty() \
1372 ? message_reflection->GetRepeated##CPPTYPE_METHOD(message, \
1374 : *map_entries[j]) \
1375 : message_reflection->Get##CPPTYPE_METHOD(message, field), \
1385 field->is_repeated()
1399 field->is_repeated()
1404 if (strict_utf8_check) {
1407 field->full_name().c_str());
1410 field->full_name().c_str());
1419 field->is_repeated()
1434 io::EpsCopyOutputStream*
stream) {
1435 const Reflection* message_reflection =
message.GetReflection();
1459 const Reflection* message_reflection =
message.GetReflection();
1461 size_t our_size = 0;
1463 std::vector<const FieldDescriptor*>
fields;
1478 if (
descriptor->options().message_set_wire_format()) {
1480 message_reflection->GetUnknownFields(
message));
1491 const Reflection* message_reflection =
message.GetReflection();
1493 if (
field->is_extension() &&
1494 field->containing_type()->options().message_set_wire_format() &&
1496 !
field->is_repeated()) {
1501 if (
field->is_repeated()) {
1502 if (
field->is_map()) {
1503 const MapFieldBase* map_field =
1505 if (map_field->IsMapValid()) {
1513 }
else if (
field->containing_type()->options().map_entry()) {
1516 }
else if (message_reflection->HasField(
message,
field)) {
1521 size_t our_size = data_size;
1522 if (
field->is_packed()) {
1523 if (data_size > 0) {
1537 const MapKey&
value) {
1539 switch (
field->type()) {
1548 #define CASE_TYPE(FieldType, CamelFieldType, CamelCppType) \
1549 case FieldDescriptor::TYPE_##FieldType: \
1550 return WireFormatLite::CamelFieldType##Size( \
1551 value.Get##CamelCppType##Value());
1553 #define FIXED_CASE_TYPE(FieldType, CamelFieldType) \
1554 case FieldDescriptor::TYPE_##FieldType: \
1555 return WireFormatLite::k##CamelFieldType##Size;
1571 #undef FIXED_CASE_TYPE
1579 switch (
field->type()) {
1583 #define CASE_TYPE(FieldType, CamelFieldType, CamelCppType) \
1584 case FieldDescriptor::TYPE_##FieldType: \
1585 return WireFormatLite::CamelFieldType##Size( \
1586 value.Get##CamelCppType##Value());
1588 #define FIXED_CASE_TYPE(FieldType, CamelFieldType) \
1589 case FieldDescriptor::TYPE_##FieldType: \
1590 return WireFormatLite::k##CamelFieldType##Size;
1611 #undef FIXED_CASE_TYPE
1621 size_t data_size = 0;
1623 if (
field->is_map()) {
1624 const MapFieldBase* map_field =
1626 if (map_field->IsMapValid()) {
1631 for (map_field->MapBegin(&
iter), map_field->MapEnd(&
end);
iter !=
end;
1643 if (
field->is_repeated()) {
1646 }
else if (
field->containing_type()->options().map_entry()) {
1653 switch (
field->type()) {
1654 #define HANDLE_TYPE(TYPE, TYPE_METHOD, CPPTYPE_METHOD) \
1655 case FieldDescriptor::TYPE_##TYPE: \
1656 if (field->is_repeated()) { \
1657 for (size_t j = 0; j < count; j++) { \
1658 data_size += WireFormatLite::TYPE_METHOD##Size( \
1659 message_reflection->GetRepeated##CPPTYPE_METHOD(message, field, \
1663 data_size += WireFormatLite::TYPE_METHOD##Size( \
1664 message_reflection->Get##CPPTYPE_METHOD(message, field)); \
1668 #define HANDLE_FIXED_TYPE(TYPE, TYPE_METHOD) \
1669 case FieldDescriptor::TYPE_##TYPE: \
1670 data_size += count * WireFormatLite::k##TYPE_METHOD##Size; \
1693 #undef HANDLE_FIXED_TYPE
1696 if (
field->is_repeated()) {
1697 for (
size_t j = 0;
j <
count;
j++) {
1712 for (
size_t j = 0;
j <
count;
j++) {
1715 field->is_repeated()
1730 const Reflection* message_reflection =
message.GetReflection();
1739 size_t message_size = sub_message.ByteSizeLong();
1742 our_size += message_size;
1749 size_t total_size,
CachedSize* cached_size) {
1761 #include <google/protobuf/port_undef.inc>
int64 ReadVarintZigZag64(const char **p)
const char * ReadTag(const char *p, uint32 *out, uint32 max_tag=0)
const std::string & GetStringReference(const Message &message, const FieldDescriptor *field, std::string *scratch) const
static const char MESSAGE[]
const Descriptor::ReservedRange value
uint32 ReadSize(const char **pp)
bool IsExtensionNumber(int number) const
TypeWithSize< 4 >::Int Int32
TypeAndValue Group(UnknownFields nested)
static size_t VarintSize64(uint64 value)
static size_t MapKeyDataOnlyByteSize(const FieldDescriptor *field, const MapKey &value)
static uint8 * SerializeMapKeyWithCachedSizes(const FieldDescriptor *field, const MapKey &value, uint8 *target, io::EpsCopyOutputStream *stream)
const std::string & GetRepeatedStringReference(const Message &message, const FieldDescriptor *field, int index, std::string *scratch) const
const FieldDescriptor * FindKnownExtensionByNumber(int number) const
const char * UnknownFieldParse(uint32 tag, std::string *unknown, const char *ptr, ParseContext *ctx)
static std::vector< const Message * > Sort(const Message &message, int map_size, const Reflection *reflection, const FieldDescriptor *field)
internal::InternalMetadata * MutableInternalMetadata(Message *message) const
TypeWithSize< 8 >::UInt UInt64
void AddInt32(Message *message, const FieldDescriptor *field, int32 value) const
size_t FromIntSize(int size)
void SetInt64(Message *message, const FieldDescriptor *field, int64 value) const
const EnumValueDescriptor * GetRepeatedEnum(const Message &message, const FieldDescriptor *field, int index) const
bool SkipMessage(io::CodedInputStream *input) override
TypeWithSize< 4 >::UInt UInt32
const typedef MCPhysReg * iterator
bool HasField(const Message &message, const FieldDescriptor *field) const
HANDLE_TYPE(int32, FieldDescriptor::CPPTYPE_INT32, -1)
static PyObject * UnknownFieldSet(CMessage *self)
static uint8 * SerializeMapValueRefWithCachedSizes(const FieldDescriptor *field, const MapValueRef &value, uint8 *target, io::EpsCopyOutputStream *stream)
bool operator()(const MapKey &a, const MapKey &b) const
static bool StrictUtf8Check(const FieldDescriptor *field)
static const UnknownFieldSet * default_instance()
const char * ParseBigVarint(const char *p, uint64 *out)
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
const char * PackedEnumParser(void *object, const char *ptr, ParseContext *ctx)
static void * tag(intptr_t t)
UnknownFieldSet * MutableUnknownFields(Message *message) const
void AddEnum(Message *message, const FieldDescriptor *field, const EnumValueDescriptor *value) const
#define GOOGLE_PROTOBUF_PARSER_ASSERT(predicate)
const PROTOBUF_MUST_USE_RESULT char * VarintParse(const char *p, T *out)
FloatingPoint< float > Float
void WriteLengthDelimited(uint32 num, StringPiece val, std::string *s)
unsigned __int64 uint64_t
bool ParseMessageSetItemImpl(io::CodedInputStream *input, MS ms)
GRPC_CUSTOM_CODEDINPUTSTREAM CodedInputStream
static size_t VarintSize32(uint32 value)
void AddVarint(int number, uint64 value)
bool SkipField(io::CodedInputStream *input, uint32 tag) override
const UnknownFieldSet & GetUnknownFields(const Message &message) const
void SetInt32(Message *message, const FieldDescriptor *field, int32 value) const
void AddEnumValue(Message *message, const FieldDescriptor *field, int value) const
static PROTOBUF_ALWAYS_INLINE uint8 * WriteTagToArray(uint32 value, uint8 *target)
void SkipUnknownEnum(int field_number, int value) override
const EnumValueDescriptor * GetEnum(const Message &message, const FieldDescriptor *field) const
MapIterator MapBegin(Message *message, const FieldDescriptor *field) const
void SetString(Message *message, const FieldDescriptor *field, std::string value) const
static uint8 * InternalSerializeMapEntry(const FieldDescriptor *field, const MapKey &key, const MapValueRef &value, uint8 *target, io::EpsCopyOutputStream *stream)
TypeAndValue Fixed64(uint64_t val)
static size_t MapValueRefDataOnlyByteSize(const FieldDescriptor *field, const MapValueRef &value)
int FieldSize(const Message &message, const FieldDescriptor *field) const
static const LogLevel ERROR
Message * MutableMessage(Message *message, const FieldDescriptor *field, MessageFactory *factory=nullptr) const
const FieldDescriptor * field
int ToCachedSize(size_t size)
void SetEnumValue(Message *message, const FieldDescriptor *field, int value) const
FloatingPoint< double > Double
std::array< int64_t, Size > values
UnknownFieldSet * unknown_fields_
void AddInt64(Message *message, const FieldDescriptor *field, int64 value) const
void AddString(Message *message, const FieldDescriptor *field, std::string value) const
int32 ReadVarintZigZag32(const char **p)
static uint8 * WriteVarint32ToArray(uint32 value, uint8 *target)
RepeatedField< T > * MutableRepeatedFieldInternal(Message *message, const FieldDescriptor *field) const
TypeWithSize< 8 >::Int Int64
size_t ComputeUnknownFieldsSize(const InternalMetadataWithArena &metadata, size_t total_size, CachedSize *cached_size)
const internal::MapFieldBase * GetMapData(const Message &message, const FieldDescriptor *field) const
TypeAndValue Fixed32(uint32_t val)
Message * AddMessage(Message *message, const FieldDescriptor *field, MessageFactory *factory=nullptr) const
static CppType TypeToCppType(Type type)
const DescriptorPool * pool
#define GOOGLE_LOG(LEVEL)
static const char descriptor[1336]
void ListFields(const Message &message, std::vector< const FieldDescriptor * > *output) const
bool LookupMapValue(const Message &message, const FieldDescriptor *field, const MapKey &key, MapValueConstRef *val) const
static std::vector< MapKey > SortKey(const Message &message, const Reflection *reflection, const FieldDescriptor *field)
MapIterator MapEnd(Message *message, const FieldDescriptor *field) const
grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:53