38 #include <unordered_map>
51 #include <google/protobuf/port_def.inc>
87 struct ExtensionHasher {
88 std::size_t operator()(
const std::pair<const MessageLite*, int>&
p)
const {
89 return std::hash<const MessageLite*>{}(
p.first) ^
90 std::hash<int>{}(
p.second);
94 typedef std::unordered_map<std::pair<const MessageLite*, int>, ExtensionInfo,
98 static const ExtensionRegistry* global_registry =
nullptr;
102 void Register(
const MessageLite* containing_type,
int number,
103 ExtensionInfo info) {
104 static auto local_static_registry =
OnShutdownDelete(
new ExtensionRegistry);
105 global_registry = local_static_registry;
107 std::make_pair(containing_type,
number), info)) {
109 << containing_type->GetTypeName() <<
"\", field number "
114 const ExtensionInfo* FindRegisteredExtension(
const MessageLite* containing_type,
116 return global_registry ==
nullptr
119 std::make_pair(containing_type,
number));
139 bool is_repeated,
bool is_packed) {
144 Register(containing_type,
number, info);
162 bool is_repeated,
bool is_packed,
169 Register(containing_type,
number, info);
174 bool is_repeated,
bool is_packed,
180 Register(containing_type,
number, info);
207 if (PROTOBUF_PREDICT_FALSE(
is_large())) {
217 #ifdef __cpp_sized_deallocation
221 "CreateArray requires a trivially destructible type");
225 sizeof(*flat) * flat_capacity);
226 #else // !__cpp_sized_deallocation
228 #endif // !__cpp_sized_deallocation
238 if (ext ==
NULL)
return false;
261 GOOGLE_LOG(DFATAL) <<
"Don't lookup extension types if they aren't present (1). ";
265 GOOGLE_LOG(DFATAL) <<
"Don't lookup extension types if they aren't present (2). ";
272 if (ext ==
NULL)
return;
281 enum { REPEATED_FIELD, OPTIONAL_FIELD };
285 #define GOOGLE_DCHECK_TYPE(EXTENSION, LABEL, CPPTYPE) \
286 GOOGLE_DCHECK_EQ((EXTENSION).is_repeated ? REPEATED_FIELD : OPTIONAL_FIELD, LABEL); \
287 GOOGLE_DCHECK_EQ(cpp_type((EXTENSION).type), WireFormatLite::CPPTYPE_##CPPTYPE)
292 #define PRIMITIVE_ACCESSORS(UPPERCASE, LOWERCASE, CAMELCASE) \
294 LOWERCASE ExtensionSet::Get##CAMELCASE(int number, LOWERCASE default_value) \
296 const Extension* extension = FindOrNull(number); \
297 if (extension == NULL || extension->is_cleared) { \
298 return default_value; \
300 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL_FIELD, UPPERCASE); \
301 return extension->LOWERCASE##_value; \
305 void ExtensionSet::Set##CAMELCASE(int number, FieldType type, \
307 const FieldDescriptor* descriptor) { \
308 Extension* extension; \
309 if (MaybeNewExtension(number, descriptor, &extension)) { \
310 extension->type = type; \
311 GOOGLE_DCHECK_EQ(cpp_type(extension->type), \
312 WireFormatLite::CPPTYPE_##UPPERCASE); \
313 extension->is_repeated = false; \
315 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL_FIELD, UPPERCASE); \
317 extension->is_cleared = false; \
318 extension->LOWERCASE##_value = value; \
321 LOWERCASE ExtensionSet::GetRepeated##CAMELCASE(int number, int index) \
323 const Extension* extension = FindOrNull(number); \
324 GOOGLE_CHECK(extension != NULL) << "Index out-of-bounds (field is empty)."; \
325 GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, UPPERCASE); \
326 return extension->repeated_##LOWERCASE##_value->Get(index); \
329 void ExtensionSet::SetRepeated##CAMELCASE(int number, int index, \
331 Extension* extension = FindOrNull(number); \
332 GOOGLE_CHECK(extension != NULL) << "Index out-of-bounds (field is empty)."; \
333 GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, UPPERCASE); \
334 extension->repeated_##LOWERCASE##_value->Set(index, value); \
337 void ExtensionSet::Add##CAMELCASE(int number, FieldType type, bool packed, \
339 const FieldDescriptor* descriptor) { \
340 Extension* extension; \
341 if (MaybeNewExtension(number, descriptor, &extension)) { \
342 extension->type = type; \
343 GOOGLE_DCHECK_EQ(cpp_type(extension->type), \
344 WireFormatLite::CPPTYPE_##UPPERCASE); \
345 extension->is_repeated = true; \
346 extension->is_packed = packed; \
347 extension->repeated_##LOWERCASE##_value = \
348 Arena::CreateMessage<RepeatedField<LOWERCASE>>(arena_); \
350 GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, UPPERCASE); \
351 GOOGLE_DCHECK_EQ(extension->is_packed, packed); \
353 extension->repeated_##LOWERCASE##_value->Add(value); \
364 #undef PRIMITIVE_ACCESSORS
367 const void* default_value)
const {
393 Arena::CreateMessage<RepeatedField<int32>>(
arena_);
397 Arena::CreateMessage<RepeatedField<int64>>(
arena_);
401 Arena::CreateMessage<RepeatedField<uint32>>(
arena_);
405 Arena::CreateMessage<RepeatedField<uint64>>(
arena_);
409 Arena::CreateMessage<RepeatedField<double>>(
arena_);
413 Arena::CreateMessage<RepeatedField<float>>(
arena_);
417 Arena::CreateMessage<RepeatedField<bool>>(
arena_);
421 Arena::CreateMessage<RepeatedField<int>>(
arena_);
425 Arena::CreateMessage<RepeatedPtrField<std::string>>(
arena_);
429 Arena::CreateMessage<RepeatedPtrField<MessageLite>>(
arena_);
500 Arena::CreateMessage<RepeatedField<int>>(
arena_);
562 Arena::CreateMessage<RepeatedPtrField<std::string>>(
arena_);
566 return extension->repeated_string_value->Add();
609 return extension->lazymessage_value->MutableMessage(prototype);
628 Arena* message_arena =
message->GetArena();
635 if (message_arena ==
arena_) {
637 }
else if (message_arena ==
NULL) {
652 if (message_arena ==
arena_) {
654 }
else if (message_arena ==
NULL) {
704 ret =
extension->lazymessage_value->ReleaseMessage(prototype);
733 ret =
extension->lazymessage_value->UnsafeArenaReleaseMessage(prototype);
773 Arena::CreateMessage<RepeatedPtrField<MessageLite>>(
arena_);
780 MessageLite* result =
reinterpret_cast<internal::RepeatedPtrFieldBase*
>(
782 ->AddFromCleared<GenericTypeHandler<MessageLite>>();
783 if (result ==
NULL) {
785 extension->repeated_message_value->AddAllocated(result);
795 #undef GOOGLE_DCHECK_TYPE
804 extension->repeated_int32_value->RemoveLast();
807 extension->repeated_int64_value->RemoveLast();
810 extension->repeated_uint32_value->RemoveLast();
813 extension->repeated_uint64_value->RemoveLast();
816 extension->repeated_float_value->RemoveLast();
819 extension->repeated_double_value->RemoveLast();
822 extension->repeated_bool_value->RemoveLast();
825 extension->repeated_enum_value->RemoveLast();
828 extension->repeated_string_value->RemoveLast();
831 extension->repeated_message_value->RemoveLast();
841 return extension->repeated_message_value->ReleaseLast();
851 extension->repeated_int32_value->SwapElements(index1, index2);
854 extension->repeated_int64_value->SwapElements(index1, index2);
857 extension->repeated_uint32_value->SwapElements(index1, index2);
860 extension->repeated_uint64_value->SwapElements(index1, index2);
863 extension->repeated_float_value->SwapElements(index1, index2);
866 extension->repeated_double_value->SwapElements(index1, index2);
869 extension->repeated_bool_value->SwapElements(index1, index2);
872 extension->repeated_enum_value->SwapElements(index1, index2);
875 extension->repeated_string_value->SwapElements(index1, index2);
878 extension->repeated_message_value->SwapElements(index1, index2);
891 template <
typename ItX,
typename ItY>
892 size_t SizeOfUnion(ItX it_xs, ItX end_xs, ItY it_ys, ItY end_ys) {
894 while (it_xs != end_xs && it_ys != end_ys) {
896 if (it_xs->first < it_ys->first) {
898 }
else if (it_xs->first == it_ys->first) {
905 result += std::distance(it_xs, end_xs);
906 result += std::distance(it_ys, end_ys);
912 if (PROTOBUF_PREDICT_TRUE(!
is_large())) {
913 if (PROTOBUF_PREDICT_TRUE(!other.
is_large())) {
945 #define HANDLE_TYPE(UPPERCASE, LOWERCASE, REPEATED_TYPE) \
946 case WireFormatLite::CPPTYPE_##UPPERCASE: \
948 extension->repeated_##LOWERCASE##_value = \
949 Arena::CreateMessage<REPEATED_TYPE>(arena_); \
951 extension->repeated_##LOWERCASE##_value->MergeFrom( \
952 *other_extension.repeated_##LOWERCASE##_value); \
969 Arena::CreateMessage<RepeatedPtrField<MessageLite>>(
arena_);
975 for (
int i = 0;
i < other_repeated_message->
size();
i++) {
985 target->CheckTypeAndMergeFrom(other_message);
992 #define HANDLE_TYPE(UPPERCASE, LOWERCASE, CAMELCASE) \
993 case WireFormatLite::CPPTYPE_##UPPERCASE: \
994 Set##CAMELCASE(number, other_extension.type, \
995 other_extension.LOWERCASE##_value, \
996 other_extension.descriptor); \
1020 if (other_extension.
is_lazy) {
1024 extension->lazymessage_value->MergeFrom(
1030 extension->message_value->CheckTypeAndMergeFrom(
1037 if (other_extension.
is_lazy) {
1039 extension->lazymessage_value->MergeFrom(
1042 extension->message_value->CheckTypeAndMergeFrom(
1052 extension->message_value->CheckTypeAndMergeFrom(
1078 x->MergeFrom(*
this);
1085 if (
this == other)
return;
1089 if (this_ext ==
NULL && other_ext ==
NULL) {
1093 if (this_ext !=
NULL && other_ext !=
NULL) {
1096 swap(*this_ext, *other_ext);
1114 if (this_ext ==
NULL) {
1124 if (other_ext ==
NULL) {
1138 if (PROTOBUF_PREDICT_FALSE(
is_large())) {
1140 if (!kv.second.IsInitialized())
return false;
1145 if (!
it->second.IsInitialized())
return false;
1154 bool* was_packed_on_wire) {
1159 was_packed_on_wire);
1173 *was_packed_on_wire =
false;
1176 is_packable(expected_wire_type)) {
1177 *was_packed_on_wire =
true;
1181 return expected_wire_type == wire_type;
1188 bool was_packed_on_wire;
1191 &was_packed_on_wire)) {
1195 input, field_skipper);
1199 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
1206 bool was_packed_on_wire;
1209 &was_packed_on_wire)) {
1217 const char* ptr,
const MessageLite* containing_type,
1218 internal::InternalMetadataWithArenaLite*
metadata,
1219 internal::ParseContext* ctx) {
1220 return ParseMessageSetItemTmpl(ptr, containing_type,
metadata, ctx);
1226 bool was_packed_on_wire,
1232 if (was_packed_on_wire) {
1234 if (!
input->ReadVarint32(&
size))
return false;
1238 #define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE) \
1239 case WireFormatLite::TYPE_##UPPERCASE: \
1240 while (input->BytesUntilLimit() > 0) { \
1241 CPP_LOWERCASE value; \
1242 if (!WireFormatLite::ReadPrimitive<CPP_LOWERCASE, \
1243 WireFormatLite::TYPE_##UPPERCASE>( \
1246 Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, \
1247 extension.is_packed, value, extension.descriptor); \
1267 while (
input->BytesUntilLimit() > 0) {
1269 if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
1291 input->PopLimit(limit);
1294 #define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE) \
1295 case WireFormatLite::TYPE_##UPPERCASE: { \
1296 CPP_LOWERCASE value; \
1297 if (!WireFormatLite::ReadPrimitive<CPP_LOWERCASE, \
1298 WireFormatLite::TYPE_##UPPERCASE>( \
1301 if (extension.is_repeated) { \
1302 Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, \
1303 extension.is_packed, value, extension.descriptor); \
1305 Set##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, value, \
1306 extension.descriptor); \
1327 if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
1331 if (!
extension.enum_validity_check.func(
1440 return me->ParseField(
1442 extension_finder, field_skipper);
1455 MSLite{
this, extension_finder, field_skipper});
1469 int start_field_number,
int end_field_number,
1471 if (PROTOBUF_PREDICT_FALSE(
is_large())) {
1473 for (
auto it =
map_.
large->lower_bound(start_field_number);
1474 it !=
end &&
it->first < end_field_number; ++
it) {
1475 it->second.SerializeFieldWithCachedSizes(
it->first,
output);
1482 it !=
end &&
it->first < end_field_number; ++
it) {
1483 it->second.SerializeFieldWithCachedSizes(
it->first,
output);
1488 size_t total_size = 0;
1501 bool extension_is_new =
false;
1504 return extension_is_new;
1513 #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \
1514 case WireFormatLite::CPPTYPE_##UPPERCASE: \
1515 repeated_##LOWERCASE##_value->Clear(); \
1559 if (cached_size == 0)
return;
1563 output->WriteVarint32(cached_size);
1566 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
1567 case WireFormatLite::TYPE_##UPPERCASE: \
1568 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
1569 WireFormatLite::Write##CAMELCASE##NoTag( \
1570 repeated_##LOWERCASE##_value->Get(i), output); \
1599 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
1600 case WireFormatLite::TYPE_##UPPERCASE: \
1601 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
1602 WireFormatLite::Write##CAMELCASE( \
1603 number, repeated_##LOWERCASE##_value->Get(i), output); \
1628 }
else if (!is_cleared) {
1630 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, VALUE) \
1631 case WireFormatLite::TYPE_##UPPERCASE: \
1632 WireFormatLite::Write##CAMELCASE(number, VALUE, output); \
1670 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
1671 case WireFormatLite::TYPE_##UPPERCASE: \
1672 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
1673 result += WireFormatLite::CAMELCASE##Size( \
1674 repeated_##LOWERCASE##_value->Get(i)); \
1688 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
1689 case WireFormatLite::TYPE_##UPPERCASE: \
1690 result += WireFormatLite::k##CAMELCASE##Size * \
1691 FromIntSize(repeated_##LOWERCASE##_value->size()); \
1720 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
1721 case WireFormatLite::TYPE_##UPPERCASE: \
1722 result += tag_size * FromIntSize(repeated_##LOWERCASE##_value->size()); \
1723 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
1724 result += WireFormatLite::CAMELCASE##Size( \
1725 repeated_##LOWERCASE##_value->Get(i)); \
1743 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
1744 case WireFormatLite::TYPE_##UPPERCASE: \
1745 result += (tag_size + WireFormatLite::k##CAMELCASE##Size) * \
1746 FromIntSize(repeated_##LOWERCASE##_value->size()); \
1758 }
else if (!is_cleared) {
1761 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
1762 case WireFormatLite::TYPE_##UPPERCASE: \
1763 result += WireFormatLite::CAMELCASE##Size(LOWERCASE); \
1779 size_t size = lazymessage_value->ByteSize();
1788 #define HANDLE_TYPE(UPPERCASE, CAMELCASE) \
1789 case WireFormatLite::TYPE_##UPPERCASE: \
1790 result += WireFormatLite::k##CAMELCASE##Size; \
1809 #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \
1810 case WireFormatLite::CPPTYPE_##UPPERCASE: \
1811 return repeated_##LOWERCASE##_value->size()
1835 #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \
1836 case WireFormatLite::CPPTYPE_##UPPERCASE: \
1837 delete repeated_##LOWERCASE##_value; \
1855 delete string_value;
1859 delete lazymessage_value;
1861 delete message_value;
1876 for (
int i = 0;
i < repeated_message_value->size();
i++) {
1877 if (!repeated_message_value->Get(
i).IsInitialized()) {
1884 if (!lazymessage_value->IsInitialized())
return false;
1886 if (!message_value->IsInitialized())
return false;
1898 if (PROTOBUF_PREDICT_FALSE(
is_large())) {
1921 if (PROTOBUF_PREDICT_FALSE(
is_large())) {
1943 if (PROTOBUF_PREDICT_FALSE(
is_large())) {
1945 return {&maybe.first->second, maybe.second};
1951 return {&
it->second,
false};
1954 std::copy_backward(
it,
end,
end + 1);
1958 return {&
it->second,
true};
1965 if (PROTOBUF_PREDICT_FALSE(
is_large())) {
1983 LargeMap::iterator hint =
map_.
large->begin();
2001 if (PROTOBUF_PREDICT_FALSE(
is_large())) {
2036 if (is_cleared)
return;
2064 if (is_cleared)
return 0;
2093 size_t total_size = 0;