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 |