| OLD | NEW |
| 1 // Protocol Buffers - Google's data interchange format | 1 // Protocol Buffers - Google's data interchange format |
| 2 // Copyright 2008 Google Inc. All rights reserved. | 2 // Copyright 2008 Google Inc. All rights reserved. |
| 3 // https://developers.google.com/protocol-buffers/ | 3 // https://developers.google.com/protocol-buffers/ |
| 4 // | 4 // |
| 5 // Redistribution and use in source and binary forms, with or without | 5 // Redistribution and use in source and binary forms, with or without |
| 6 // modification, are permitted provided that the following conditions are | 6 // modification, are permitted provided that the following conditions are |
| 7 // met: | 7 // met: |
| 8 // | 8 // |
| 9 // * Redistributions of source code must retain the above copyright | 9 // * Redistributions of source code must retain the above copyright |
| 10 // notice, this list of conditions and the following disclaimer. | 10 // notice, this list of conditions and the following disclaimer. |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 private: | 88 private: |
| 89 const DescriptorPool* pool_; | 89 const DescriptorPool* pool_; |
| 90 MessageFactory* factory_; | 90 MessageFactory* factory_; |
| 91 const Descriptor* containing_type_; | 91 const Descriptor* containing_type_; |
| 92 }; | 92 }; |
| 93 | 93 |
| 94 void ExtensionSet::AppendToList( | 94 void ExtensionSet::AppendToList( |
| 95 const Descriptor* containing_type, | 95 const Descriptor* containing_type, |
| 96 const DescriptorPool* pool, | 96 const DescriptorPool* pool, |
| 97 std::vector<const FieldDescriptor*>* output) const { | 97 std::vector<const FieldDescriptor*>* output) const { |
| 98 for (map<int, Extension>::const_iterator iter = extensions_.begin(); | 98 for (ExtensionMap::const_iterator iter = extensions_.begin(); |
| 99 iter != extensions_.end(); ++iter) { | 99 iter != extensions_.end(); ++iter) { |
| 100 bool has = false; | 100 bool has = false; |
| 101 if (iter->second.is_repeated) { | 101 if (iter->second.is_repeated) { |
| 102 has = iter->second.GetSize() > 0; | 102 has = iter->second.GetSize() > 0; |
| 103 } else { | 103 } else { |
| 104 has = !iter->second.is_cleared; | 104 has = !iter->second.is_cleared; |
| 105 } | 105 } |
| 106 | 106 |
| 107 if (has) { | 107 if (has) { |
| 108 // TODO(kenton): Looking up each field by number is somewhat unfortunate. | 108 // TODO(kenton): Looking up each field by number is somewhat unfortunate. |
| (...skipping 28 matching lines...) Expand all Loading... |
| 137 | 137 |
| 138 #define GOOGLE_DCHECK_TYPE(EXTENSION, LABEL, CPPTYPE)
\ | 138 #define GOOGLE_DCHECK_TYPE(EXTENSION, LABEL, CPPTYPE)
\ |
| 139 GOOGLE_DCHECK_EQ((EXTENSION).is_repeated ? FieldDescriptor::LABEL_REPEATED
\ | 139 GOOGLE_DCHECK_EQ((EXTENSION).is_repeated ? FieldDescriptor::LABEL_REPEATED
\ |
| 140 : FieldDescriptor::LABEL_OPTIONAL, \ | 140 : FieldDescriptor::LABEL_OPTIONAL, \ |
| 141 FieldDescriptor::LABEL_##LABEL); \ | 141 FieldDescriptor::LABEL_##LABEL); \ |
| 142 GOOGLE_DCHECK_EQ(cpp_type((EXTENSION).type), FieldDescriptor::CPPTYPE_##CPPTYP
E) | 142 GOOGLE_DCHECK_EQ(cpp_type((EXTENSION).type), FieldDescriptor::CPPTYPE_##CPPTYP
E) |
| 143 | 143 |
| 144 const MessageLite& ExtensionSet::GetMessage(int number, | 144 const MessageLite& ExtensionSet::GetMessage(int number, |
| 145 const Descriptor* message_type, | 145 const Descriptor* message_type, |
| 146 MessageFactory* factory) const { | 146 MessageFactory* factory) const { |
| 147 map<int, Extension>::const_iterator iter = extensions_.find(number); | 147 ExtensionMap::const_iterator iter = extensions_.find(number); |
| 148 if (iter == extensions_.end() || iter->second.is_cleared) { | 148 if (iter == extensions_.end() || iter->second.is_cleared) { |
| 149 // Not present. Return the default value. | 149 // Not present. Return the default value. |
| 150 return *factory->GetPrototype(message_type); | 150 return *factory->GetPrototype(message_type); |
| 151 } else { | 151 } else { |
| 152 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); | 152 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); |
| 153 if (iter->second.is_lazy) { | 153 if (iter->second.is_lazy) { |
| 154 return iter->second.lazymessage_value->GetMessage( | 154 return iter->second.lazymessage_value->GetMessage( |
| 155 *factory->GetPrototype(message_type)); | 155 *factory->GetPrototype(message_type)); |
| 156 } else { | 156 } else { |
| 157 return *iter->second.message_value; | 157 return *iter->second.message_value; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 180 return extension->lazymessage_value->MutableMessage( | 180 return extension->lazymessage_value->MutableMessage( |
| 181 *factory->GetPrototype(descriptor->message_type())); | 181 *factory->GetPrototype(descriptor->message_type())); |
| 182 } else { | 182 } else { |
| 183 return extension->message_value; | 183 return extension->message_value; |
| 184 } | 184 } |
| 185 } | 185 } |
| 186 } | 186 } |
| 187 | 187 |
| 188 MessageLite* ExtensionSet::ReleaseMessage(const FieldDescriptor* descriptor, | 188 MessageLite* ExtensionSet::ReleaseMessage(const FieldDescriptor* descriptor, |
| 189 MessageFactory* factory) { | 189 MessageFactory* factory) { |
| 190 map<int, Extension>::iterator iter = extensions_.find(descriptor->number()); | 190 ExtensionMap::iterator iter = extensions_.find(descriptor->number()); |
| 191 if (iter == extensions_.end()) { | 191 if (iter == extensions_.end()) { |
| 192 // Not present. Return NULL. | 192 // Not present. Return NULL. |
| 193 return NULL; | 193 return NULL; |
| 194 } else { | 194 } else { |
| 195 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); | 195 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); |
| 196 MessageLite* ret = NULL; | 196 MessageLite* ret = NULL; |
| 197 if (iter->second.is_lazy) { | 197 if (iter->second.is_lazy) { |
| 198 ret = iter->second.lazymessage_value->ReleaseMessage( | 198 ret = iter->second.lazymessage_value->ReleaseMessage( |
| 199 *factory->GetPrototype(descriptor->message_type())); | 199 *factory->GetPrototype(descriptor->message_type())); |
| 200 if (arena_ == NULL) { | 200 if (arena_ == NULL) { |
| 201 delete iter->second.lazymessage_value; | 201 delete iter->second.lazymessage_value; |
| 202 } | 202 } |
| 203 } else { | 203 } else { |
| 204 if (arena_ != NULL) { | 204 if (arena_ != NULL) { |
| 205 ret = (iter->second.message_value)->New(); | 205 ret = (iter->second.message_value)->New(); |
| 206 ret->CheckTypeAndMergeFrom(*(iter->second.message_value)); | 206 ret->CheckTypeAndMergeFrom(*(iter->second.message_value)); |
| 207 } else { | 207 } else { |
| 208 ret = iter->second.message_value; | 208 ret = iter->second.message_value; |
| 209 } | 209 } |
| 210 } | 210 } |
| 211 extensions_.erase(descriptor->number()); | 211 extensions_.erase(descriptor->number()); |
| 212 return ret; | 212 return ret; |
| 213 } | 213 } |
| 214 } | 214 } |
| 215 | 215 |
| 216 MessageLite* ExtensionSet::UnsafeArenaReleaseMessage( |
| 217 const FieldDescriptor* descriptor, MessageFactory* factory) { |
| 218 ExtensionMap::iterator iter = extensions_.find(descriptor->number()); |
| 219 if (iter == extensions_.end()) { |
| 220 // Not present. Return NULL. |
| 221 return NULL; |
| 222 } else { |
| 223 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); |
| 224 MessageLite* ret = NULL; |
| 225 if (iter->second.is_lazy) { |
| 226 ret = iter->second.lazymessage_value->UnsafeArenaReleaseMessage( |
| 227 *factory->GetPrototype(descriptor->message_type())); |
| 228 if (arena_ == NULL) { |
| 229 delete iter->second.lazymessage_value; |
| 230 } |
| 231 } else { |
| 232 ret = iter->second.message_value; |
| 233 } |
| 234 extensions_.erase(descriptor->number()); |
| 235 return ret; |
| 236 } |
| 237 } |
| 238 |
| 216 ExtensionSet::Extension* ExtensionSet::MaybeNewRepeatedExtension(const FieldDesc
riptor* descriptor) { | 239 ExtensionSet::Extension* ExtensionSet::MaybeNewRepeatedExtension(const FieldDesc
riptor* descriptor) { |
| 217 Extension* extension; | 240 Extension* extension; |
| 218 if (MaybeNewExtension(descriptor->number(), descriptor, &extension)) { | 241 if (MaybeNewExtension(descriptor->number(), descriptor, &extension)) { |
| 219 extension->type = descriptor->type(); | 242 extension->type = descriptor->type(); |
| 220 GOOGLE_DCHECK_EQ(cpp_type(extension->type), FieldDescriptor::CPPTYPE_MESSAGE
); | 243 GOOGLE_DCHECK_EQ(cpp_type(extension->type), FieldDescriptor::CPPTYPE_MESSAGE
); |
| 221 extension->is_repeated = true; | 244 extension->is_repeated = true; |
| 222 extension->repeated_message_value = | 245 extension->repeated_message_value = |
| 223 ::google::protobuf::Arena::CreateMessage<RepeatedPtrField<MessageLite> >
(arena_); | 246 ::google::protobuf::Arena::CreateMessage<RepeatedPtrField<MessageLite> >
(arena_); |
| 224 } else { | 247 } else { |
| 225 GOOGLE_DCHECK_TYPE(*extension, REPEATED, MESSAGE); | 248 GOOGLE_DCHECK_TYPE(*extension, REPEATED, MESSAGE); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 311 } else { | 334 } else { |
| 312 DescriptorPoolExtensionFinder finder(input->GetExtensionPool(), | 335 DescriptorPoolExtensionFinder finder(input->GetExtensionPool(), |
| 313 input->GetExtensionFactory(), | 336 input->GetExtensionFactory(), |
| 314 containing_type->GetDescriptor()); | 337 containing_type->GetDescriptor()); |
| 315 return ParseMessageSet(input, &finder, &skipper); | 338 return ParseMessageSet(input, &finder, &skipper); |
| 316 } | 339 } |
| 317 } | 340 } |
| 318 | 341 |
| 319 int ExtensionSet::SpaceUsedExcludingSelf() const { | 342 int ExtensionSet::SpaceUsedExcludingSelf() const { |
| 320 int total_size = | 343 int total_size = |
| 321 extensions_.size() * sizeof(map<int, Extension>::value_type); | 344 extensions_.size() * sizeof(ExtensionMap::value_type); |
| 322 for (map<int, Extension>::const_iterator iter = extensions_.begin(), | 345 for (ExtensionMap::const_iterator iter = extensions_.begin(), |
| 323 end = extensions_.end(); | 346 end = extensions_.end(); |
| 324 iter != end; | 347 iter != end; |
| 325 ++iter) { | 348 ++iter) { |
| 326 total_size += iter->second.SpaceUsedExcludingSelf(); | 349 total_size += iter->second.SpaceUsedExcludingSelf(); |
| 327 } | 350 } |
| 328 return total_size; | 351 return total_size; |
| 329 } | 352 } |
| 330 | 353 |
| 331 inline int ExtensionSet::RepeatedMessage_SpaceUsedExcludingSelf( | 354 inline int ExtensionSet::RepeatedMessage_SpaceUsedExcludingSelf( |
| 332 RepeatedPtrFieldBase* field) { | 355 RepeatedPtrFieldBase* field) { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 default: | 402 default: |
| 380 // No extra storage costs for primitive types. | 403 // No extra storage costs for primitive types. |
| 381 break; | 404 break; |
| 382 } | 405 } |
| 383 } | 406 } |
| 384 return total_size; | 407 return total_size; |
| 385 } | 408 } |
| 386 | 409 |
| 387 // The Serialize*ToArray methods are only needed in the heavy library, as | 410 // The Serialize*ToArray methods are only needed in the heavy library, as |
| 388 // the lite library only generates SerializeWithCachedSizes. | 411 // the lite library only generates SerializeWithCachedSizes. |
| 389 uint8* ExtensionSet::SerializeWithCachedSizesToArray( | 412 uint8* ExtensionSet::SerializeWithCachedSizesToArray(int start_field_number, |
| 413 int end_field_number, |
| 414 uint8* target) const { |
| 415 return InternalSerializeWithCachedSizesToArray( |
| 416 start_field_number, end_field_number, false, target); |
| 417 } |
| 418 |
| 419 uint8* ExtensionSet::SerializeMessageSetWithCachedSizesToArray( |
| 420 uint8* target) const { |
| 421 return InternalSerializeMessageSetWithCachedSizesToArray(false, target); |
| 422 } |
| 423 |
| 424 uint8* ExtensionSet::InternalSerializeWithCachedSizesToArray( |
| 390 int start_field_number, int end_field_number, | 425 int start_field_number, int end_field_number, |
| 391 uint8* target) const { | 426 bool deterministic, uint8* target) const { |
| 392 map<int, Extension>::const_iterator iter; | 427 ExtensionMap::const_iterator iter; |
| 393 for (iter = extensions_.lower_bound(start_field_number); | 428 for (iter = extensions_.lower_bound(start_field_number); |
| 394 iter != extensions_.end() && iter->first < end_field_number; | 429 iter != extensions_.end() && iter->first < end_field_number; |
| 395 ++iter) { | 430 ++iter) { |
| 396 target = iter->second.SerializeFieldWithCachedSizesToArray(iter->first, | 431 target = iter->second.InternalSerializeFieldWithCachedSizesToArray( |
| 397 target); | 432 iter->first, deterministic, target); |
| 398 } | 433 } |
| 399 return target; | 434 return target; |
| 400 } | 435 } |
| 401 | 436 |
| 402 uint8* ExtensionSet::SerializeMessageSetWithCachedSizesToArray( | 437 uint8* ExtensionSet::InternalSerializeMessageSetWithCachedSizesToArray( |
| 403 uint8* target) const { | 438 bool deterministic, uint8* target) const { |
| 404 map<int, Extension>::const_iterator iter; | 439 ExtensionMap::const_iterator iter; |
| 405 for (iter = extensions_.begin(); iter != extensions_.end(); ++iter) { | 440 for (iter = extensions_.begin(); iter != extensions_.end(); ++iter) { |
| 406 target = iter->second.SerializeMessageSetItemWithCachedSizesToArray( | 441 target = iter->second.InternalSerializeMessageSetItemWithCachedSizesToArray( |
| 407 iter->first, target); | 442 iter->first, deterministic, target); |
| 408 } | 443 } |
| 409 return target; | 444 return target; |
| 410 } | 445 } |
| 411 | 446 |
| 412 uint8* ExtensionSet::Extension::SerializeFieldWithCachedSizesToArray( | 447 uint8* ExtensionSet::Extension::InternalSerializeFieldWithCachedSizesToArray( |
| 413 int number, uint8* target) const { | 448 int number, bool deterministic, uint8* target) const { |
| 414 if (is_repeated) { | 449 if (is_repeated) { |
| 415 if (is_packed) { | 450 if (is_packed) { |
| 416 if (cached_size == 0) return target; | 451 if (cached_size == 0) return target; |
| 417 | 452 |
| 418 target = WireFormatLite::WriteTagToArray(number, | 453 target = WireFormatLite::WriteTagToArray(number, |
| 419 WireFormatLite::WIRETYPE_LENGTH_DELIMITED, target); | 454 WireFormatLite::WIRETYPE_LENGTH_DELIMITED, target); |
| 420 target = WireFormatLite::WriteInt32NoTagToArray(cached_size, target); | 455 target = WireFormatLite::WriteInt32NoTagToArray(cached_size, target); |
| 421 | 456 |
| 422 switch (real_type(type)) { | 457 switch (real_type(type)) { |
| 423 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ | 458 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 HANDLE_TYPE( FIXED32, Fixed32, uint32); | 505 HANDLE_TYPE( FIXED32, Fixed32, uint32); |
| 471 HANDLE_TYPE( FIXED64, Fixed64, uint64); | 506 HANDLE_TYPE( FIXED64, Fixed64, uint64); |
| 472 HANDLE_TYPE(SFIXED32, SFixed32, int32); | 507 HANDLE_TYPE(SFIXED32, SFixed32, int32); |
| 473 HANDLE_TYPE(SFIXED64, SFixed64, int64); | 508 HANDLE_TYPE(SFIXED64, SFixed64, int64); |
| 474 HANDLE_TYPE( FLOAT, Float, float); | 509 HANDLE_TYPE( FLOAT, Float, float); |
| 475 HANDLE_TYPE( DOUBLE, Double, double); | 510 HANDLE_TYPE( DOUBLE, Double, double); |
| 476 HANDLE_TYPE( BOOL, Bool, bool); | 511 HANDLE_TYPE( BOOL, Bool, bool); |
| 477 HANDLE_TYPE( STRING, String, string); | 512 HANDLE_TYPE( STRING, String, string); |
| 478 HANDLE_TYPE( BYTES, Bytes, string); | 513 HANDLE_TYPE( BYTES, Bytes, string); |
| 479 HANDLE_TYPE( ENUM, Enum, enum); | 514 HANDLE_TYPE( ENUM, Enum, enum); |
| 515 #undef HANDLE_TYPE |
| 516 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ |
| 517 case FieldDescriptor::TYPE_##UPPERCASE: \ |
| 518 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ |
| 519 target = WireFormatLite::InternalWrite##CAMELCASE##ToArray( \ |
| 520 number, repeated_##LOWERCASE##_value->Get(i), \ |
| 521 deterministic, target); \ |
| 522 } \ |
| 523 break |
| 524 |
| 480 HANDLE_TYPE( GROUP, Group, message); | 525 HANDLE_TYPE( GROUP, Group, message); |
| 481 HANDLE_TYPE( MESSAGE, Message, message); | 526 HANDLE_TYPE( MESSAGE, Message, message); |
| 482 #undef HANDLE_TYPE | 527 #undef HANDLE_TYPE |
| 483 } | 528 } |
| 484 } | 529 } |
| 485 } else if (!is_cleared) { | 530 } else if (!is_cleared) { |
| 486 switch (real_type(type)) { | 531 switch (real_type(type)) { |
| 487 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, VALUE) \ | 532 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, VALUE) \ |
| 488 case FieldDescriptor::TYPE_##UPPERCASE: \ | 533 case FieldDescriptor::TYPE_##UPPERCASE: \ |
| 489 target = WireFormatLite::Write##CAMELCASE##ToArray( \ | 534 target = WireFormatLite::Write##CAMELCASE##ToArray( \ |
| (...skipping 13 matching lines...) Expand all Loading... |
| 503 HANDLE_TYPE( FLOAT, Float, float_value); | 548 HANDLE_TYPE( FLOAT, Float, float_value); |
| 504 HANDLE_TYPE( DOUBLE, Double, double_value); | 549 HANDLE_TYPE( DOUBLE, Double, double_value); |
| 505 HANDLE_TYPE( BOOL, Bool, bool_value); | 550 HANDLE_TYPE( BOOL, Bool, bool_value); |
| 506 HANDLE_TYPE( STRING, String, *string_value); | 551 HANDLE_TYPE( STRING, String, *string_value); |
| 507 HANDLE_TYPE( BYTES, Bytes, *string_value); | 552 HANDLE_TYPE( BYTES, Bytes, *string_value); |
| 508 HANDLE_TYPE( ENUM, Enum, enum_value); | 553 HANDLE_TYPE( ENUM, Enum, enum_value); |
| 509 HANDLE_TYPE( GROUP, Group, *message_value); | 554 HANDLE_TYPE( GROUP, Group, *message_value); |
| 510 #undef HANDLE_TYPE | 555 #undef HANDLE_TYPE |
| 511 case FieldDescriptor::TYPE_MESSAGE: | 556 case FieldDescriptor::TYPE_MESSAGE: |
| 512 if (is_lazy) { | 557 if (is_lazy) { |
| 513 target = lazymessage_value->WriteMessageToArray(number, target); | 558 target = lazymessage_value->InternalWriteMessageToArray( |
| 559 number, deterministic, target); |
| 514 } else { | 560 } else { |
| 515 target = WireFormatLite::WriteMessageToArray( | 561 target = WireFormatLite::InternalWriteMessageToArray( |
| 516 number, *message_value, target); | 562 number, *message_value, deterministic, target); |
| 517 } | 563 } |
| 518 break; | 564 break; |
| 519 } | 565 } |
| 520 } | 566 } |
| 521 return target; | 567 return target; |
| 522 } | 568 } |
| 523 | 569 |
| 524 uint8* ExtensionSet::Extension::SerializeMessageSetItemWithCachedSizesToArray( | 570 uint8* |
| 525 int number, | 571 ExtensionSet::Extension::InternalSerializeMessageSetItemWithCachedSizesToArray( |
| 526 uint8* target) const { | 572 int number, bool deterministic, uint8* target) const { |
| 527 if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) { | 573 if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) { |
| 528 // Not a valid MessageSet extension, but serialize it the normal way. | 574 // Not a valid MessageSet extension, but serialize it the normal way. |
| 529 GOOGLE_LOG(WARNING) << "Invalid message set extension."; | 575 GOOGLE_LOG(WARNING) << "Invalid message set extension."; |
| 530 return SerializeFieldWithCachedSizesToArray(number, target); | 576 return InternalSerializeFieldWithCachedSizesToArray(number, deterministic, |
| 577 target); |
| 531 } | 578 } |
| 532 | 579 |
| 533 if (is_cleared) return target; | 580 if (is_cleared) return target; |
| 534 | 581 |
| 535 // Start group. | 582 // Start group. |
| 536 target = io::CodedOutputStream::WriteTagToArray( | 583 target = io::CodedOutputStream::WriteTagToArray( |
| 537 WireFormatLite::kMessageSetItemStartTag, target); | 584 WireFormatLite::kMessageSetItemStartTag, target); |
| 538 // Write type ID. | 585 // Write type ID. |
| 539 target = WireFormatLite::WriteUInt32ToArray( | 586 target = WireFormatLite::WriteUInt32ToArray( |
| 540 WireFormatLite::kMessageSetTypeIdNumber, number, target); | 587 WireFormatLite::kMessageSetTypeIdNumber, number, target); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 602 // required int32 type_id = 2; | 649 // required int32 type_id = 2; |
| 603 // required data message = 3; | 650 // required data message = 3; |
| 604 | 651 |
| 605 uint32 last_type_id = 0; | 652 uint32 last_type_id = 0; |
| 606 | 653 |
| 607 // If we see message data before the type_id, we'll append it to this so | 654 // If we see message data before the type_id, we'll append it to this so |
| 608 // we can parse it later. | 655 // we can parse it later. |
| 609 string message_data; | 656 string message_data; |
| 610 | 657 |
| 611 while (true) { | 658 while (true) { |
| 612 const uint32 tag = input->ReadTag(); | 659 const uint32 tag = input->ReadTagNoLastTag(); |
| 613 if (tag == 0) return false; | 660 if (tag == 0) return false; |
| 614 | 661 |
| 615 switch (tag) { | 662 switch (tag) { |
| 616 case WireFormatLite::kMessageSetTypeIdTag: { | 663 case WireFormatLite::kMessageSetTypeIdTag: { |
| 617 uint32 type_id; | 664 uint32 type_id; |
| 618 if (!input->ReadVarint32(&type_id)) return false; | 665 if (!input->ReadVarint32(&type_id)) return false; |
| 619 last_type_id = type_id; | 666 last_type_id = type_id; |
| 620 | 667 |
| 621 if (!message_data.empty()) { | 668 if (!message_data.empty()) { |
| 622 // We saw some message data before the type_id. Have to parse it | 669 // We saw some message data before the type_id. Have to parse it |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 695 WireFormatLite::WriteMessageMaybeToArray( | 742 WireFormatLite::WriteMessageMaybeToArray( |
| 696 WireFormatLite::kMessageSetMessageNumber, | 743 WireFormatLite::kMessageSetMessageNumber, |
| 697 *message_value, | 744 *message_value, |
| 698 output); | 745 output); |
| 699 } | 746 } |
| 700 | 747 |
| 701 // End group. | 748 // End group. |
| 702 output->WriteTag(WireFormatLite::kMessageSetItemEndTag); | 749 output->WriteTag(WireFormatLite::kMessageSetItemEndTag); |
| 703 } | 750 } |
| 704 | 751 |
| 705 int ExtensionSet::Extension::MessageSetItemByteSize(int number) const { | 752 size_t ExtensionSet::Extension::MessageSetItemByteSize(int number) const { |
| 706 if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) { | 753 if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) { |
| 707 // Not a valid MessageSet extension, but compute the byte size for it the | 754 // Not a valid MessageSet extension, but compute the byte size for it the |
| 708 // normal way. | 755 // normal way. |
| 709 return ByteSize(number); | 756 return ByteSize(number); |
| 710 } | 757 } |
| 711 | 758 |
| 712 if (is_cleared) return 0; | 759 if (is_cleared) return 0; |
| 713 | 760 |
| 714 int our_size = WireFormatLite::kMessageSetItemTagsSize; | 761 size_t our_size = WireFormatLite::kMessageSetItemTagsSize; |
| 715 | 762 |
| 716 // type_id | 763 // type_id |
| 717 our_size += io::CodedOutputStream::VarintSize32(number); | 764 our_size += io::CodedOutputStream::VarintSize32(number); |
| 718 | 765 |
| 719 // message | 766 // message |
| 720 int message_size = 0; | 767 size_t message_size = 0; |
| 721 if (is_lazy) { | 768 if (is_lazy) { |
| 722 message_size = lazymessage_value->ByteSize(); | 769 message_size = lazymessage_value->ByteSize(); |
| 723 } else { | 770 } else { |
| 724 message_size = message_value->ByteSize(); | 771 message_size = message_value->ByteSize(); |
| 725 } | 772 } |
| 726 | 773 |
| 727 our_size += io::CodedOutputStream::VarintSize32(message_size); | 774 our_size += io::CodedOutputStream::VarintSize32(message_size); |
| 728 our_size += message_size; | 775 our_size += message_size; |
| 729 | 776 |
| 730 return our_size; | 777 return our_size; |
| 731 } | 778 } |
| 732 | 779 |
| 733 void ExtensionSet::SerializeMessageSetWithCachedSizes( | 780 void ExtensionSet::SerializeMessageSetWithCachedSizes( |
| 734 io::CodedOutputStream* output) const { | 781 io::CodedOutputStream* output) const { |
| 735 for (map<int, Extension>::const_iterator iter = extensions_.begin(); | 782 for (ExtensionMap::const_iterator iter = extensions_.begin(); |
| 736 iter != extensions_.end(); ++iter) { | 783 iter != extensions_.end(); ++iter) { |
| 737 iter->second.SerializeMessageSetItemWithCachedSizes(iter->first, output); | 784 iter->second.SerializeMessageSetItemWithCachedSizes(iter->first, output); |
| 738 } | 785 } |
| 739 } | 786 } |
| 740 | 787 |
| 741 int ExtensionSet::MessageSetByteSize() const { | 788 size_t ExtensionSet::MessageSetByteSize() const { |
| 742 int total_size = 0; | 789 size_t total_size = 0; |
| 743 | 790 |
| 744 for (map<int, Extension>::const_iterator iter = extensions_.begin(); | 791 for (ExtensionMap::const_iterator iter = extensions_.begin(); |
| 745 iter != extensions_.end(); ++iter) { | 792 iter != extensions_.end(); ++iter) { |
| 746 total_size += iter->second.MessageSetItemByteSize(iter->first); | 793 total_size += iter->second.MessageSetItemByteSize(iter->first); |
| 747 } | 794 } |
| 748 | 795 |
| 749 return total_size; | 796 return total_size; |
| 750 } | 797 } |
| 751 | 798 |
| 752 } // namespace internal | 799 } // namespace internal |
| 753 } // namespace protobuf | 800 } // namespace protobuf |
| 754 } // namespace google | 801 } // namespace google |
| OLD | NEW |