31 #ifndef GOOGLE_PROTOBUF_GENERATED_MESSAGE_TABLE_DRIVEN_LITE_H__
32 #define GOOGLE_PROTOBUF_GENERATED_MESSAGE_TABLE_DRIVEN_LITE_H__
43 #include <type_traits>
46 #include <google/protobuf/port_def.inc>
74 template <
typename Type>
79 template <
typename Type>
81 return reinterpret_cast<const Type*
>(
reinterpret_cast<const uint8*
>(msg) +
85 template <
typename InternalMetadata>
87 if (PROTOBUF_PREDICT_FALSE(arena_offset == -1)) {
91 return Raw<InternalMetadata>(msg, arena_offset)->arena();
95 if (extension_offset == -1) {
99 return Raw<ExtensionSet>(msg, extension_offset);
102 template <
typename Type>
109 return repeated->
Add();
115 Raw<RepeatedPtrField<std::string>>(msg,
offset);
116 return repeated->
Add();
120 template <
typename Type>
131 has_bits[has_bit_index / 32u] |=
mask;
134 template <
typename Type>
137 SetBit(has_bits, has_bit_index);
138 return Raw<Type>(msg,
offset);
141 template <
typename Type>
146 *MutableField<Type>(msg, has_bits, has_bit_index,
offset) =
value;
149 template <
typename Type>
153 oneof_case[oneof_case_index] = field_number;
164 delete *Raw<MessageLite*>(msg,
field.offset);
170 Raw<ArenaStringPtr>(msg,
field.offset)
176 Raw<InlinedStringField>(msg,
field.offset)->DestroyNoArena(
NULL);
191 template <ProcessingType field_type>
195 if (*oneof_case == field_number) {
201 if (*oneof_case != 0) {
204 *oneof_case = field_number;
208 Raw<ArenaStringPtr>(msg,
offset)
209 ->UnsafeSetDefault(
static_cast<const std::string*
>(default_ptr));
212 new (Raw<InlinedStringField>(msg,
offset))
218 table.aux[field_number].messages.default_message();
219 *submessage = prototype->
New(arena);
224 template <
typename UnknownFieldHandler,
Cardinality cardinality,
227 Arena* arena,
uint32* has_bits,
229 const void* default_ptr,
230 const char* field_name) {
232 #ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
233 constexpr
bool kValidateUtf8 = is_string_type;
235 constexpr
bool kValidateUtf8 =
false;
236 #endif // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
241 switch (cardinality) {
244 s = MutableField<InlinedStringField>(msg, has_bits, has_bit_index,
248 s = AddField<InlinedStringField>(msg,
offset);
251 s = Raw<InlinedStringField>(msg,
offset);
259 utf8_string_data = *
value;
263 switch (cardinality) {
266 msg, has_bits, has_bit_index,
offset);
268 static_cast<const std::string*
>(default_ptr), arena);
269 if (PROTOBUF_PREDICT_FALSE(
273 utf8_string_data =
field->Get();
277 if (PROTOBUF_PREDICT_FALSE(
281 utf8_string_data = *
value;
286 static_cast<const std::string*
>(default_ptr), arena);
287 if (PROTOBUF_PREDICT_FALSE(
291 utf8_string_data =
field->Get();
301 utf8_string_data.
length(),
307 template <
typename UnknownFieldHandler,
typename InternalMetadata,
314 if (PROTOBUF_PREDICT_FALSE(
315 (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
321 table.aux[field_number].enums.validator;
322 if (validator ==
nullptr || validator(
value)) {
323 switch (cardinality) {
332 GetArena<InternalMetadata>(msg,
table.arena_offset),
339 UnknownFieldHandler::Varint(msg,
table, tag,
value);
356 Arena* arena =
NULL) {
357 return prototype->
New(arena);
375 template <
typename UnknownFieldHandler,
typename InternalMetadata,
385 uint32* has_bits = Raw<uint32>(msg,
table.has_bits_offset);
389 uint32 tag =
input->ReadTagWithCutoffNoLastTag(kMaxTag).first;
394 if (PROTOBUF_PREDICT_FALSE(field_number >
table.max_field_number)) {
396 if (UnknownFieldHandler::ParseExtension(msg,
table,
input, tag)) {
401 if (PROTOBUF_PREDICT_FALSE(
417 const int64 presence_index =
data->presence_index;
419 const unsigned char processing_type =
data->processing_type;
421 if (
data->normal_wiretype ==
static_cast<unsigned char>(wire_type)) {
425 switch (processing_type) {
426 #define HANDLE_TYPE(TYPE, CPPTYPE) \
427 case (WireFormatLite::TYPE_##TYPE): { \
429 if (PROTOBUF_PREDICT_FALSE( \
430 (!WireFormatLite::ReadPrimitive< \
431 CPPTYPE, WireFormatLite::TYPE_##TYPE>(input, &value)))) { \
434 SetField(msg, has_bits, presence_index, offset, value); \
437 case (WireFormatLite::TYPE_##TYPE) | kRepeatedMask: { \
438 RepeatedField<CPPTYPE>* values = Raw<RepeatedField<CPPTYPE>>(msg, offset); \
439 if (PROTOBUF_PREDICT_FALSE((!WireFormatLite::ReadRepeatedPrimitive< \
440 CPPTYPE, WireFormatLite::TYPE_##TYPE>( \
441 data->tag_size, tag, input, values)))) { \
446 case (WireFormatLite::TYPE_##TYPE) | kOneofMask: { \
447 uint32* oneof_case = Raw<uint32>(msg, table.oneof_case_offset); \
449 if (PROTOBUF_PREDICT_FALSE( \
450 (!WireFormatLite::ReadPrimitive< \
451 CPPTYPE, WireFormatLite::TYPE_##TYPE>(input, &value)))) { \
454 ClearOneofField(table.fields[oneof_case[presence_index]], \
455 GetArena<InternalMetadata>(msg, table.arena_offset), msg); \
456 SetOneofField(msg, oneof_case, presence_index, offset, field_number, \
479 #ifndef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
481 #endif // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
484 GetArena<InternalMetadata>(msg,
table.arena_offset);
485 const void* default_ptr =
table.aux[field_number].strings.default_ptr;
487 if (PROTOBUF_PREDICT_FALSE(
490 input, msg, arena, has_bits, presence_index,
offset,
491 default_ptr,
nullptr)))) {
497 #ifndef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
499 #endif // !GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
502 GetArena<InternalMetadata>(msg,
table.arena_offset);
503 const void* default_ptr =
table.aux[field_number].strings.default_ptr;
505 if (PROTOBUF_PREDICT_FALSE(
508 input, msg, arena, has_bits, presence_index,
offset,
509 default_ptr,
nullptr)))) {
515 #ifndef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
517 #endif // !GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
520 GetArena<InternalMetadata>(msg,
table.arena_offset);
521 uint32* oneof_case = Raw<uint32>(msg,
table.oneof_case_offset);
522 const void* default_ptr =
table.aux[field_number].strings.default_ptr;
524 ResetOneofField<ProcessingType_STRING>(
525 table, field_number, arena, msg, oneof_case + presence_index,
528 if (PROTOBUF_PREDICT_FALSE(
532 default_ptr,
nullptr)))) {
539 #ifndef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
542 #endif // !GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
545 GetArena<InternalMetadata>(msg,
table.arena_offset);
546 const void* default_ptr =
table.aux[field_number].strings.default_ptr;
548 if (PROTOBUF_PREDICT_FALSE(
551 input, msg, arena, has_bits, presence_index,
offset,
552 default_ptr,
nullptr)))) {
557 #ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
560 GetArena<InternalMetadata>(msg,
table.arena_offset);
561 const void* default_ptr =
table.aux[field_number].strings.default_ptr;
562 const char* field_name =
table.aux[field_number].strings.field_name;
564 if (PROTOBUF_PREDICT_FALSE(
567 input, msg, arena, has_bits, presence_index,
offset,
568 default_ptr, field_name)))) {
576 GetArena<InternalMetadata>(msg,
table.arena_offset);
577 const void* default_ptr =
table.aux[field_number].strings.default_ptr;
578 const char* field_name =
table.aux[field_number].strings.field_name;
580 if (PROTOBUF_PREDICT_FALSE(
583 input, msg, arena, has_bits, presence_index,
offset,
584 default_ptr, field_name)))) {
591 GetArena<InternalMetadata>(msg,
table.arena_offset);
592 uint32* oneof_case = Raw<uint32>(msg,
table.oneof_case_offset);
593 const void* default_ptr =
table.aux[field_number].strings.default_ptr;
594 const char* field_name =
table.aux[field_number].strings.field_name;
596 ResetOneofField<ProcessingType_STRING>(
597 table, field_number, arena, msg, oneof_case + presence_index,
600 if (PROTOBUF_PREDICT_FALSE(
603 input, msg, arena, has_bits, presence_index,
offset,
604 default_ptr, field_name)))) {
609 #endif // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
611 if (PROTOBUF_PREDICT_FALSE(
612 (!
HandleEnum<UnknownFieldHandler, InternalMetadata,
621 if (PROTOBUF_PREDICT_FALSE(
622 (!
HandleEnum<UnknownFieldHandler, InternalMetadata,
631 uint32* oneof_case = Raw<uint32>(msg,
table.oneof_case_offset);
632 if (PROTOBUF_PREDICT_FALSE(
633 (!
HandleEnum<UnknownFieldHandler, InternalMetadata,
635 presence_index,
offset, tag,
643 MutableField<MessageLite*>(msg, has_bits, presence_index,
offset);
646 if (submsg ==
NULL) {
648 GetArena<InternalMetadata>(msg,
table.arena_offset);
650 table.aux[field_number].messages.default_message();
651 submsg = prototype->
New(arena);
652 *submsg_holder = submsg;
655 if (PROTOBUF_PREDICT_FALSE(
665 table.aux[field_number].messages.default_message();
671 if (PROTOBUF_PREDICT_FALSE(
680 MutableField<MessageLite*>(msg, has_bits, presence_index,
offset);
683 if (submsg ==
NULL) {
685 GetArena<InternalMetadata>(msg,
table.arena_offset);
687 table.aux[field_number].messages.default_message();
688 if (prototype ==
NULL) {
691 submsg = prototype->
New(arena);
692 *submsg_holder = submsg;
695 if (PROTOBUF_PREDICT_FALSE(
707 table.aux[field_number].messages.default_message();
708 if (prototype ==
NULL) {
715 if (PROTOBUF_PREDICT_FALSE(
724 GetArena<InternalMetadata>(msg,
table.arena_offset);
725 uint32* oneof_case = Raw<uint32>(msg,
table.oneof_case_offset);
727 ResetOneofField<ProcessingType_MESSAGE>(
728 table, field_number, arena, msg, oneof_case + presence_index,
732 if (PROTOBUF_PREDICT_FALSE(
739 #ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
742 GetArena<InternalMetadata>(msg,
table.arena_offset);
743 const void* default_ptr =
table.aux[field_number].strings.default_ptr;
744 const char* field_name =
table.aux[field_number].strings.field_name;
746 if (PROTOBUF_PREDICT_FALSE(
749 input, msg, arena, has_bits, presence_index,
offset,
750 default_ptr, field_name)))) {
755 #endif // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
757 if (PROTOBUF_PREDICT_FALSE(!(*
table.aux[field_number].maps.parse_map)(
765 input->SetLastTag(tag);
771 }
else if (
data->packed_wiretype ==
static_cast<unsigned char>(wire_type)) {
786 #define HANDLE_PACKED_TYPE(TYPE, CPPTYPE, CPPTYPE_METHOD) \
787 case WireFormatLite::TYPE_##TYPE: { \
788 RepeatedField<CPPTYPE>* values = Raw<RepeatedField<CPPTYPE>>(msg, offset); \
789 if (PROTOBUF_PREDICT_FALSE( \
790 (!WireFormatLite::ReadPackedPrimitive< \
791 CPPTYPE, WireFormatLite::TYPE_##TYPE>(input, values)))) { \
813 #undef HANDLE_PACKED_TYPE
820 if (PROTOBUF_PREDICT_FALSE(!
input->ReadVarint32(&
length))) {
825 table.aux[field_number].enums.validator;
829 while (
input->BytesUntilLimit() > 0) {
831 if (PROTOBUF_PREDICT_FALSE(
837 if (validator ==
nullptr || validator(
value)) {
841 UnknownFieldHandler::Varint(msg,
table, tag,
value);
844 input->PopLimit(limit);
860 input->SetLastTag(tag);
865 if (UnknownFieldHandler::ParseExtension(msg,
table,
input, tag)) {
871 if (PROTOBUF_PREDICT_FALSE(
879 template <
typename UnknownFieldHandler,
typename InternalMetadata>
884 if (
table.max_field_number <= (0x7F >> 3)) {
886 InternalMetadata, 0x7F>(
888 }
else if (
table.max_field_number <= (0x3FFF >> 3)) {
890 InternalMetadata, 0x3FFF>(
894 UnknownFieldHandler, InternalMetadata,
895 std::numeric_limits<uint32>::max()>(msg,
table,
input);
903 #include <google/protobuf/port_undef.inc>
905 #endif // GOOGLE_PROTOBUF_GENERATED_MESSAGE_TABLE_DRIVEN_LITE_H__