35 #include <google/protobuf/extension_set.h>
38 #include <unordered_set>
41 #include <google/protobuf/stubs/common.h>
42 #include <google/protobuf/extension_set_inl.h>
43 #include <google/protobuf/parse_context.h>
44 #include <google/protobuf/io/coded_stream.h>
45 #include <google/protobuf/io/zero_copy_stream_impl_lite.h>
46 #include <google/protobuf/arena.h>
47 #include <google/protobuf/message_lite.h>
48 #include <google/protobuf/metadata_lite.h>
49 #include <google/protobuf/repeated_field.h>
50 #include <google/protobuf/stubs/map_util.h>
51 #include <google/protobuf/stubs/hash.h>
54 #include <google/protobuf/port_def.inc>
94 bool operator()(
const ExtensionInfo& lhs,
const ExtensionInfo& rhs)
const {
95 return lhs.message == rhs.message && lhs.number == rhs.number;
99 struct ExtensionHasher {
100 std::size_t operator()(
const ExtensionInfo& info)
const {
101 return std::hash<const MessageLite*>{}(info.message) ^
102 std::hash<int>{}(info.number);
106 using ExtensionRegistry =
107 std::unordered_set<ExtensionInfo, ExtensionHasher, ExtensionEq>;
109 static const ExtensionRegistry* global_registry =
nullptr;
113 void Register(
const ExtensionInfo& info) {
114 static auto local_static_registry =
OnShutdownDelete(
new ExtensionRegistry);
115 global_registry = local_static_registry;
118 << info.message->GetTypeName() <<
"\", field number "
119 << info.number <<
".";
123 const ExtensionInfo* FindRegisteredExtension(
const MessageLite* extendee,
125 if (!global_registry)
return nullptr;
128 info.message = extendee;
131 auto it = global_registry->find(info);
132 if (
it == global_registry->end()) {
159 ExtensionInfo info(extendee,
number,
type, is_repeated, is_packed);
178 bool is_repeated,
bool is_packed,
181 ExtensionInfo info(extendee,
number,
type, is_repeated, is_packed);
184 info.enum_validity_check.arg = (
void*)is_valid;
190 bool is_repeated,
bool is_packed,
194 ExtensionInfo info(extendee,
number,
type, is_repeated, is_packed);
195 info.message_info = {prototype};
206 map_{flat_capacity_ == 0
208 : Arena::CreateArray<KeyValue>(
arena_, flat_capacity_)} {}
214 if (PROTOBUF_PREDICT_FALSE(
is_large())) {
224 #ifdef __cpp_sized_deallocation
228 "CreateArray requires a trivially destructible type");
231 ::operator
delete[](
const_cast<ExtensionSet::KeyValue*
>(flat),
232 sizeof(*flat) * flat_capacity);
233 #else // !__cpp_sized_deallocation
235 #endif // !__cpp_sized_deallocation
245 if (
ext ==
nullptr)
return false;
247 return !
ext->is_cleared;
257 if (!
ext.is_cleared) {
266 return ext ==
nullptr ? 0 :
ext->GetSize();
271 if (
ext ==
nullptr) {
272 GOOGLE_LOG(DFATAL) <<
"Don't lookup extension types if they aren't present (1). ";
275 if (
ext->is_cleared) {
276 GOOGLE_LOG(DFATAL) <<
"Don't lookup extension types if they aren't present (2). ";
283 if (
ext ==
nullptr)
return;
292 enum { REPEATED_FIELD, OPTIONAL_FIELD };
296 #define GOOGLE_DCHECK_TYPE(EXTENSION, LABEL, CPPTYPE) \
297 GOOGLE_DCHECK_EQ((EXTENSION).is_repeated ? REPEATED_FIELD : OPTIONAL_FIELD, LABEL); \
298 GOOGLE_DCHECK_EQ(cpp_type((EXTENSION).type), WireFormatLite::CPPTYPE_##CPPTYPE)
303 #define PRIMITIVE_ACCESSORS(UPPERCASE, LOWERCASE, CAMELCASE) \
305 LOWERCASE ExtensionSet::Get##CAMELCASE(int number, LOWERCASE default_value) \
307 const Extension* extension = FindOrNull(number); \
308 if (extension == nullptr || extension->is_cleared) { \
309 return default_value; \
311 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL_FIELD, UPPERCASE); \
312 return extension->LOWERCASE##_value; \
316 const LOWERCASE& ExtensionSet::GetRef##CAMELCASE( \
317 int number, const LOWERCASE& default_value) const { \
318 const Extension* extension = FindOrNull(number); \
319 if (extension == nullptr || extension->is_cleared) { \
320 return default_value; \
322 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL_FIELD, UPPERCASE); \
323 return extension->LOWERCASE##_value; \
327 void ExtensionSet::Set##CAMELCASE(int number, FieldType type, \
329 const FieldDescriptor* descriptor) { \
330 Extension* extension; \
331 if (MaybeNewExtension(number, descriptor, &extension)) { \
332 extension->type = type; \
333 GOOGLE_DCHECK_EQ(cpp_type(extension->type), \
334 WireFormatLite::CPPTYPE_##UPPERCASE); \
335 extension->is_repeated = false; \
337 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL_FIELD, UPPERCASE); \
339 extension->is_cleared = false; \
340 extension->LOWERCASE##_value = value; \
343 LOWERCASE ExtensionSet::GetRepeated##CAMELCASE(int number, int index) \
345 const Extension* extension = FindOrNull(number); \
346 GOOGLE_CHECK(extension != nullptr) << "Index out-of-bounds (field is empty)."; \
347 GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, UPPERCASE); \
348 return extension->repeated_##LOWERCASE##_value->Get(index); \
351 const LOWERCASE& ExtensionSet::GetRefRepeated##CAMELCASE(int number, \
353 const Extension* extension = FindOrNull(number); \
354 GOOGLE_CHECK(extension != nullptr) << "Index out-of-bounds (field is empty)."; \
355 GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, UPPERCASE); \
356 return extension->repeated_##LOWERCASE##_value->Get(index); \
359 void ExtensionSet::SetRepeated##CAMELCASE(int number, int index, \
361 Extension* extension = FindOrNull(number); \
362 GOOGLE_CHECK(extension != nullptr) << "Index out-of-bounds (field is empty)."; \
363 GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, UPPERCASE); \
364 extension->repeated_##LOWERCASE##_value->Set(index, value); \
367 void ExtensionSet::Add##CAMELCASE(int number, FieldType type, bool packed, \
369 const FieldDescriptor* descriptor) { \
370 Extension* extension; \
371 if (MaybeNewExtension(number, descriptor, &extension)) { \
372 extension->type = type; \
373 GOOGLE_DCHECK_EQ(cpp_type(extension->type), \
374 WireFormatLite::CPPTYPE_##UPPERCASE); \
375 extension->is_repeated = true; \
376 extension->is_packed = packed; \
377 extension->repeated_##LOWERCASE##_value = \
378 Arena::CreateMessage<RepeatedField<LOWERCASE>>(arena_); \
380 GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, UPPERCASE); \
381 GOOGLE_DCHECK_EQ(extension->is_packed, packed); \
383 extension->repeated_##LOWERCASE##_value->Add(value); \
394 #undef PRIMITIVE_ACCESSORS
397 const void* default_value)
const {
400 return default_value;
404 return extension->repeated_int32_t_value;
423 Arena::CreateMessage<RepeatedField<int32_t>>(
arena_);
427 Arena::CreateMessage<RepeatedField<int64_t>>(
arena_);
431 Arena::CreateMessage<RepeatedField<uint32_t>>(
arena_);
435 Arena::CreateMessage<RepeatedField<uint64_t>>(
arena_);
439 Arena::CreateMessage<RepeatedField<double>>(
arena_);
443 Arena::CreateMessage<RepeatedField<float>>(
arena_);
447 Arena::CreateMessage<RepeatedField<bool>>(
arena_);
451 Arena::CreateMessage<RepeatedField<int>>(
arena_);
455 Arena::CreateMessage<RepeatedPtrField<std::string>>(
arena_);
459 Arena::CreateMessage<RepeatedPtrField<MessageLite>>(
arena_);
466 return extension->repeated_int32_t_value;
476 return extension->repeated_int32_t_value;
486 return default_value;
494 const int& default_value)
const {
498 return default_value;
549 Arena::CreateMessage<RepeatedField<int>>(
arena_);
565 return default_value;
611 Arena::CreateMessage<RepeatedPtrField<std::string>>(
arena_);
615 return extension->repeated_string_value->Add();
626 return default_value;
630 return extension->lazymessage_value->GetMessage(default_value,
arena_);
658 return extension->lazymessage_value->MutableMessage(prototype,
arena_);
686 if (message_arena ==
arena_) {
688 }
else if (message_arena ==
nullptr) {
703 if (message_arena ==
arena_) {
705 }
else if (message_arena ==
nullptr) {
785 ret =
extension->lazymessage_value->UnsafeArenaReleaseMessage(prototype,
826 Arena::CreateMessage<RepeatedPtrField<MessageLite>>(
arena_);
835 ->AddFromCleared<GenericTypeHandler<MessageLite>>();
848 #undef GOOGLE_DCHECK_TYPE
857 extension->repeated_int32_t_value->RemoveLast();
860 extension->repeated_int64_t_value->RemoveLast();
863 extension->repeated_uint32_t_value->RemoveLast();
866 extension->repeated_uint64_t_value->RemoveLast();
869 extension->repeated_float_value->RemoveLast();
872 extension->repeated_double_value->RemoveLast();
875 extension->repeated_bool_value->RemoveLast();
878 extension->repeated_enum_value->RemoveLast();
881 extension->repeated_string_value->RemoveLast();
884 extension->repeated_message_value->RemoveLast();
894 return extension->repeated_message_value->ReleaseLast();
902 return extension->repeated_message_value->UnsafeArenaReleaseLast();
912 extension->repeated_int32_t_value->SwapElements(index1, index2);
915 extension->repeated_int64_t_value->SwapElements(index1, index2);
918 extension->repeated_uint32_t_value->SwapElements(index1, index2);
921 extension->repeated_uint64_t_value->SwapElements(index1, index2);
924 extension->repeated_float_value->SwapElements(index1, index2);
927 extension->repeated_double_value->SwapElements(index1, index2);
930 extension->repeated_bool_value->SwapElements(index1, index2);
933 extension->repeated_enum_value->SwapElements(index1, index2);
936 extension->repeated_string_value->SwapElements(index1, index2);
939 extension->repeated_message_value->SwapElements(index1, index2);
952 template <
typename ItX,
typename ItY>
953 size_t SizeOfUnion(ItX it_xs, ItX end_xs, ItY it_ys, ItY end_ys) {
955 while (it_xs != end_xs && it_ys != end_ys) {
957 if (it_xs->first < it_ys->first) {
959 }
else if (it_xs->first == it_ys->first) {
966 result += std::distance(it_xs, end_xs);
967 result += std::distance(it_ys, end_ys);
974 if (PROTOBUF_PREDICT_TRUE(!
is_large())) {
975 if (PROTOBUF_PREDICT_TRUE(!other.
is_large())) {
992 Arena* other_arena) {
1009 #define HANDLE_TYPE(UPPERCASE, LOWERCASE, REPEATED_TYPE) \
1010 case WireFormatLite::CPPTYPE_##UPPERCASE: \
1012 extension->repeated_##LOWERCASE##_value = \
1013 Arena::CreateMessage<REPEATED_TYPE>(arena_); \
1015 extension->repeated_##LOWERCASE##_value->MergeFrom( \
1016 *other_extension.repeated_##LOWERCASE##_value); \
1033 Arena::CreateMessage<RepeatedPtrField<MessageLite>>(
arena_);
1039 for (
int i = 0;
i < other_repeated_message->
size();
i++) {
1049 target->CheckTypeAndMergeFrom(other_message);
1056 #define HANDLE_TYPE(UPPERCASE, LOWERCASE, CAMELCASE) \
1057 case WireFormatLite::CPPTYPE_##UPPERCASE: \
1058 Set##CAMELCASE(number, other_extension.type, \
1059 other_extension.LOWERCASE##_value, \
1060 other_extension.descriptor); \
1084 if (other_extension.
is_lazy) {
1088 extension->lazymessage_value->MergeFrom(
1095 extension->message_value->CheckTypeAndMergeFrom(
1102 if (other_extension.
is_lazy) {
1104 extension->lazymessage_value->MergeFrom(
1108 extension->message_value->CheckTypeAndMergeFrom(
1110 *
extension->message_value, other_arena));
1118 extension->message_value->CheckTypeAndMergeFrom(
1132 #ifdef PROTOBUF_FORCE_COPY_IN_SWAP
1134 #else // PROTOBUF_FORCE_COPY_IN_SWAP
1136 #endif // !PROTOBUF_FORCE_COPY_IN_SWAP
1143 extension_set.
MergeFrom(extendee, *other);
1161 if (
this == other)
return;
1171 if (this_ext == other_ext)
return;
1173 if (this_ext !=
nullptr && other_ext !=
nullptr) {
1180 temp.InternalExtensionMergeFrom(extendee,
number, *other_ext,
1189 }
else if (this_ext ==
nullptr) {
1202 if (
this == other)
return;
1207 if (this_ext == other_ext)
return;
1211 if (this_ext !=
nullptr && other_ext !=
nullptr) {
1213 }
else if (this_ext ==
nullptr) {
1225 if (PROTOBUF_PREDICT_FALSE(
is_large())) {
1227 if (!kv.second.IsInitialized())
return false;
1232 if (!
it->second.IsInitialized())
return false;
1238 ExtensionFinder* extension_finder,
1241 bool* was_packed_on_wire) {
1246 was_packed_on_wire);
1260 *was_packed_on_wire =
false;
1263 is_packable(expected_wire_type)) {
1264 *was_packed_on_wire =
true;
1268 return expected_wire_type == wire_type;
1275 bool was_packed_on_wire;
1278 &was_packed_on_wire)) {
1282 input, field_skipper);
1292 bool was_packed_on_wire;
1295 &was_packed_on_wire)) {
1299 return ParseFieldWithExtensionInfo<std::string>(
1306 return ParseMessageSetItemTmpl<MessageLite, std::string>(
ptr, extendee,
1311 bool was_packed_on_wire,
1317 if (was_packed_on_wire) {
1319 if (!
input->ReadVarint32(&
size))
return false;
1323 #define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE) \
1324 case WireFormatLite::TYPE_##UPPERCASE: \
1325 while (input->BytesUntilLimit() > 0) { \
1326 CPP_LOWERCASE value; \
1327 if (!WireFormatLite::ReadPrimitive<CPP_LOWERCASE, \
1328 WireFormatLite::TYPE_##UPPERCASE>( \
1331 Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, \
1332 extension.is_packed, value, extension.descriptor); \
1352 while (
input->BytesUntilLimit() > 0) {
1354 if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
1376 input->PopLimit(limit);
1379 #define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE) \
1380 case WireFormatLite::TYPE_##UPPERCASE: { \
1381 CPP_LOWERCASE value; \
1382 if (!WireFormatLite::ReadPrimitive<CPP_LOWERCASE, \
1383 WireFormatLite::TYPE_##UPPERCASE>( \
1386 if (extension.is_repeated) { \
1387 Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, \
1388 extension.is_packed, value, extension.descriptor); \
1390 Set##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, value, \
1391 extension.descriptor); \
1412 if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
1416 if (!
extension.enum_validity_check.func(
1485 FieldSkipper skipper;
1486 GeneratedExtensionFinder finder(extendee);
1493 CodedOutputStreamFieldSkipper skipper(unknown_fields);
1494 GeneratedExtensionFinder finder(extendee);
1499 ExtensionFinder* extension_finder,
1500 FieldSkipper* field_skipper) {
1521 ExtensionFinder* extension_finder,
1522 FieldSkipper* field_skipper) {
1525 return me->ParseField(
1527 extension_finder, field_skipper);
1531 return field_skipper->SkipField(
input,
tag);
1535 ExtensionFinder* extension_finder;
1536 FieldSkipper* field_skipper;
1540 MSLite{
this, extension_finder, field_skipper});
1548 CodedOutputStreamFieldSkipper skipper(&
output);
1549 GeneratedExtensionFinder finder(extendee);
1554 const MessageLite* extendee,
int start_field_number,
int end_field_number,
1556 if (PROTOBUF_PREDICT_FALSE(
is_large())) {
1558 for (
auto it =
map_.
large->lower_bound(start_field_number);
1559 it !=
end &&
it->first < end_field_number; ++
it) {
1560 target =
it->second.InternalSerializeFieldWithCachedSizesToArray(
1568 it !=
end &&
it->first < end_field_number; ++
it) {
1569 target =
it->second.InternalSerializeFieldWithCachedSizesToArray(
1581 target =
ext.InternalSerializeMessageSetItemWithCachedSizesToArray(
1588 size_t total_size = 0;
1601 bool extension_is_new =
false;
1604 return extension_is_new;
1613 #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \
1614 case WireFormatLite::CPPTYPE_##UPPERCASE: \
1615 repeated_##LOWERCASE##_value->Clear(); \
1634 string_value->clear();
1638 lazymessage_value->Clear();
1640 message_value->Clear();
1661 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
1662 case WireFormatLite::TYPE_##UPPERCASE: \
1663 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
1664 result += WireFormatLite::CAMELCASE##Size( \
1665 repeated_##LOWERCASE##_value->Get(i)); \
1679 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
1680 case WireFormatLite::TYPE_##UPPERCASE: \
1681 result += WireFormatLite::k##CAMELCASE##Size * \
1682 FromIntSize(repeated_##LOWERCASE##_value->size()); \
1711 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
1712 case WireFormatLite::TYPE_##UPPERCASE: \
1713 result += tag_size * FromIntSize(repeated_##LOWERCASE##_value->size()); \
1714 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
1715 result += WireFormatLite::CAMELCASE##Size( \
1716 repeated_##LOWERCASE##_value->Get(i)); \
1734 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
1735 case WireFormatLite::TYPE_##UPPERCASE: \
1736 result += (tag_size + WireFormatLite::k##CAMELCASE##Size) * \
1737 FromIntSize(repeated_##LOWERCASE##_value->size()); \
1749 }
else if (!is_cleared) {
1752 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
1753 case WireFormatLite::TYPE_##UPPERCASE: \
1754 result += WireFormatLite::CAMELCASE##Size(LOWERCASE); \
1770 size_t size = lazymessage_value->ByteSizeLong();
1779 #define HANDLE_TYPE(UPPERCASE, CAMELCASE) \
1780 case WireFormatLite::TYPE_##UPPERCASE: \
1781 result += WireFormatLite::k##CAMELCASE##Size; \
1800 #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \
1801 case WireFormatLite::CPPTYPE_##UPPERCASE: \
1802 return repeated_##LOWERCASE##_value->size()
1826 #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \
1827 case WireFormatLite::CPPTYPE_##UPPERCASE: \
1828 delete repeated_##LOWERCASE##_value; \
1846 delete string_value;
1850 delete lazymessage_value;
1852 delete message_value;
1867 for (
int i = 0;
i < repeated_message_value->size();
i++) {
1868 if (!repeated_message_value->Get(i).IsInitialized()) {
1875 if (!lazymessage_value->IsInitialized())
return false;
1877 if (!message_value->IsInitialized())
return false;
1891 }
else if (PROTOBUF_PREDICT_TRUE(!
is_large())) {
1893 KeyValue::FirstComparator());
1894 return it->first ==
key ? &
it->second :
nullptr;
1911 const auto* const_this =
this;
1912 return const_cast<ExtensionSet::Extension*
>(const_this->FindOrNull(
key));
1916 const auto* const_this =
this;
1917 return const_cast<ExtensionSet::Extension*
>(
1918 const_this->FindOrNullInLargeMap(
key));
1922 if (PROTOBUF_PREDICT_FALSE(
is_large())) {
1930 return {&
it->second,
false};
1933 std::copy_backward(
it,
end,
end + 1);
1936 it->second = Extension();
1937 return {&
it->second,
true};
1944 if (PROTOBUF_PREDICT_FALSE(
is_large())) {
1953 new_flat_capacity = new_flat_capacity == 0 ? 1 : new_flat_capacity * 4;
1954 }
while (new_flat_capacity < minimum_new_capacity);
1958 AllocatedData new_map;
1960 new_map.large = Arena::Create<LargeMap>(
arena_);
1963 hint = new_map.large->insert(hint, {
it->first,
it->second});
1968 new_map.flat = Arena::CreateArray<KeyValue>(
arena_, new_flat_capacity);
1979 #if (__cplusplus < 201703) && \
1980 (!defined(_MSC_VER) || (_MSC_VER >= 1900 && _MSC_VER < 1912))
1983 #endif // (__cplusplus < 201703) && (!defined(_MSC_VER) || (_MSC_VER >= 1900
1987 if (PROTOBUF_PREDICT_FALSE(
is_large())) {
2019 if (cached_size == 0)
return target;
2027 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
2028 case WireFormatLite::TYPE_##UPPERCASE: \
2029 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
2030 target = stream->EnsureSpace(target); \
2031 target = WireFormatLite::Write##CAMELCASE##NoTagToArray( \
2032 repeated_##LOWERCASE##_value->Get(i), target); \
2061 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
2062 case WireFormatLite::TYPE_##UPPERCASE: \
2063 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
2064 target = stream->EnsureSpace(target); \
2065 target = WireFormatLite::Write##CAMELCASE##ToArray( \
2066 number, repeated_##LOWERCASE##_value->Get(i), target); \
2085 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
2086 case WireFormatLite::TYPE_##UPPERCASE: \
2087 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
2088 target = stream->EnsureSpace(target); \
2089 target = stream->WriteString( \
2090 number, repeated_##LOWERCASE##_value->Get(i), target); \
2096 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
2097 case WireFormatLite::TYPE_##UPPERCASE: \
2098 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
2099 target = stream->EnsureSpace(target); \
2100 target = WireFormatLite::InternalWrite##CAMELCASE( \
2101 number, repeated_##LOWERCASE##_value->Get(i), target, stream); \
2110 }
else if (!is_cleared) {
2112 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, VALUE) \
2113 case WireFormatLite::TYPE_##UPPERCASE: \
2114 target = stream->EnsureSpace(target); \
2115 target = WireFormatLite::Write##CAMELCASE##ToArray(number, VALUE, target); \
2133 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, VALUE) \
2134 case WireFormatLite::TYPE_##UPPERCASE: \
2135 target = stream->EnsureSpace(target); \
2136 target = stream->WriteString(number, VALUE, target); \
2148 const auto* prototype =
2150 target = lazymessage_value->WriteMessageToArray(prototype,
number,
2166 bool was_packed_on_wire =
false;
2170 &extension_info, &was_packed_on_wire)) {
2183 return InternalSerializeFieldWithCachedSizesToArray(extendee, extension_set,
2187 if (is_cleared)
return target;
2198 const auto* prototype =
2200 target = lazymessage_value->WriteMessageToArray(
2221 if (is_cleared)
return 0;
2229 size_t message_size = 0;
2231 message_size = lazymessage_value->ByteSizeLong();
2233 message_size = message_value->ByteSizeLong();
2237 our_size += message_size;
2243 size_t total_size = 0;
2245 total_size +=
ext.MessageSetItemByteSize(
number);
2255 #include <google/protobuf/port_undef.inc>