31 #ifndef GOOGLE_PROTOBUF_GENERATED_MESSAGE_TCTABLE_IMPL_H__
32 #define GOOGLE_PROTOBUF_GENERATED_MESSAGE_TCTABLE_IMPL_H__
35 #include <type_traits>
37 #include <google/protobuf/parse_context.h>
38 #include <google/protobuf/extension_set.h>
40 #include <google/protobuf/message_lite.h>
41 #include <google/protobuf/metadata_lite.h>
42 #include <google/protobuf/port.h>
43 #include <google/protobuf/wire_format_lite.h>
46 #include <google/protobuf/port_def.inc>
64 #define PROTOBUF_TC_PARAM_PASS msg, ptr, ctx, table, hasbits, data
68 #if PROTOBUF_TC_STATIC_PARSE_SINGULAR1
69 #define PROTOBUF_TC_PARSE_SINGULAR1(MESSAGE) MESSAGE::Tct_ParseS1
71 #define PROTOBUF_TC_PARSE_SINGULAR1(MESSAGE) \
72 ::google::protobuf::internal::TcParser::SingularParseMessage<MESSAGE, uint8_t>
73 #endif // PROTOBUF_TC_STATIC_PARSE_SINGULAR1
75 #if PROTOBUF_TC_STATIC_PARSE_SINGULAR2
76 #define PROTOBUF_TC_PARSE_SINGULAR2(MESSAGE) MESSAGE::Tct_ParseS2
78 #define PROTOBUF_TC_PARSE_SINGULAR2(MESSAGE) \
79 ::google::protobuf::internal::TcParser::SingularParseMessage<MESSAGE, uint16_t>
80 #endif // PROTOBUF_TC_STATIC_PARSE_SINGULAR2
82 #if PROTOBUF_TC_STATIC_PARSE_REPEATED1
83 #define PROTOBUF_TC_PARSE_REPEATED1(MESSAGE) MESSAGE::Tct_ParseR1
85 #define PROTOBUF_TC_PARSE_REPEATED1(MESSAGE) \
86 ::google::protobuf::internal::TcParser::RepeatedParseMessage<MESSAGE, uint8_t>
87 #endif // PROTOBUF_TC_STATIC_PARSE_REPEATED1
89 #if PROTOBUF_TC_STATIC_PARSE_REPEATED2
90 #define PROTOBUF_TC_PARSE_REPEATED2(MESSAGE) MESSAGE::Tct_ParseR2
92 #define PROTOBUF_TC_PARSE_REPEATED2(MESSAGE) \
93 ::google::protobuf::internal::TcParser::RepeatedParseMessage<MESSAGE, uint16_t>
94 #endif // PROTOBUF_TC_STATIC_PARSE_REPEATED2
97 template <
size_t align>
112 static const char* GenericFallback(PROTOBUF_TC_PARAM_DECL);
113 static const char* GenericFallbackLite(PROTOBUF_TC_PARAM_DECL);
117 PROTOBUF_TC_PARAM_DECL) {
118 const auto coded_tag = UnalignedLoad<uint16_t>(
ptr);
119 const size_t idx = coded_tag &
table->fast_idx_mask;
120 PROTOBUF_ASSUME((
idx & 7) == 0);
121 auto* fast_entry =
table->fast_entry(
idx >> 3);
122 data = fast_entry->bits;
123 data.data ^= coded_tag;
133 constexpr
bool always_return = !PROTOBUF_TAILCALL;
134 if (always_return || !
ctx->DataAvailable(
ptr)) {
145 while (!
ctx->Done(&
ptr)) {
147 if (has_bits_offset) hasbits = RefAt<uint32_t>(
msg, has_bits_offset);
149 if (
ptr ==
nullptr)
break;
150 if (
ctx->LastTag() != 1)
break;
155 template <
typename FieldType,
typename TagType>
157 PROTOBUF_TC_PARAM_DECL) {
158 if (PROTOBUF_PREDICT_FALSE(
data.coded_tag<TagType>() != 0)) {
161 ptr +=
sizeof(TagType);
164 if (
field ==
nullptr) {
167 field = Arena::CreateMessage<FieldType>(
arena);
176 template <
typename FieldType,
typename TagType>
178 PROTOBUF_TC_PARAM_DECL) {
179 if (PROTOBUF_PREDICT_FALSE(
data.coded_tag<TagType>() != 0)) {
182 ptr +=
sizeof(TagType);
183 auto&
field = RefAt<RepeatedPtrField<FieldType>>(
msg,
data.offset());
189 template <
typename LayoutType,
typename TagType>
190 static const char* SingularFixed(PROTOBUF_TC_PARAM_DECL);
191 template <
typename LayoutType,
typename TagType>
192 static const char* RepeatedFixed(PROTOBUF_TC_PARAM_DECL);
193 template <
typename LayoutType,
typename TagType>
194 static const char* PackedFixed(PROTOBUF_TC_PARAM_DECL);
197 template <
typename FieldType,
typename TagType, Var
intDecode zigzag>
198 static const char* SingularVarint(PROTOBUF_TC_PARAM_DECL);
199 template <
typename FieldType,
typename TagType, Var
intDecode zigzag>
200 static const char* RepeatedVarint(PROTOBUF_TC_PARAM_DECL);
201 template <
typename FieldType,
typename TagType, Var
intDecode zigzag>
202 static const char* PackedVarint(PROTOBUF_TC_PARAM_DECL);
204 enum Utf8Type { kNoUtf8 = 0, kUtf8 = 1, kUtf8ValidateOnly = 2 };
205 template <
typename TagType, Utf8Type utf8>
206 static const char* SingularString(PROTOBUF_TC_PARAM_DECL);
207 template <
typename TagType, Utf8Type utf8>
208 static const char* RepeatedString(PROTOBUF_TC_PARAM_DECL);
210 template <
typename T>
214 if (PROTOBUF_PREDICT_FALSE(
225 if (has_bits_offset) {
228 RefAt<uint32_t>(
msg, has_bits_offset) =
static_cast<uint32_t>(hasbits);
234 PROTOBUF_TC_PARAM_DECL) {
241 static inline PROTOBUF_ALWAYS_INLINE
const char*
Error(
242 PROTOBUF_TC_PARAM_DECL) {
254 ctx_->data().arena =
msg->GetArenaForAllocation();
264 template <
class MessageBaseT,
class UnknownFieldsT>
267 if (PROTOBUF_PREDICT_FALSE(!(x))) return nullptr
279 if (
table->extension_range_low <=
num &&
280 num <= table->extension_range_high) {
281 return RefAt<ExtensionSet>(
msg,
table->extension_offset)
283 static_cast<const MessageBaseT*
>(
table->default_instance),
284 &
msg->_internal_metadata_,
ctx);
287 tag,
msg->_internal_metadata_.mutable_unknown_fields<UnknownFieldsT>(),
294 #include <google/protobuf/generated_message_tctable_impl.inc>
300 #include <google/protobuf/port_undef.inc>
302 #endif // GOOGLE_PROTOBUF_GENERATED_MESSAGE_TCTABLE_IMPL_H__