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 27 matching lines...) Expand all Loading... |
38 #include <google/protobuf/stubs/strutil.h> | 38 #include <google/protobuf/stubs/strutil.h> |
39 | 39 |
40 namespace google { | 40 namespace google { |
41 namespace protobuf { | 41 namespace protobuf { |
42 namespace compiler { | 42 namespace compiler { |
43 namespace cpp { | 43 namespace cpp { |
44 | 44 |
45 namespace { | 45 namespace { |
46 | 46 |
47 void SetMessageVariables(const FieldDescriptor* descriptor, | 47 void SetMessageVariables(const FieldDescriptor* descriptor, |
48 std::map<string, string>* variables, | 48 map<string, string>* variables, |
49 const Options& options) { | 49 const Options& options) { |
50 SetCommonFieldVariables(descriptor, variables, options); | 50 SetCommonFieldVariables(descriptor, variables, options); |
51 (*variables)["type"] = FieldMessageTypeName(descriptor); | 51 (*variables)["type"] = FieldMessageTypeName(descriptor); |
52 if (descriptor->options().weak() || !descriptor->containing_oneof()) { | 52 if (descriptor->options().weak() || !descriptor->containing_oneof()) { |
53 (*variables)["non_null_ptr_to_name"] = | 53 (*variables)["non_null_ptr_to_name"] = |
54 StrCat("this->", (*variables)["name"], "_"); | 54 StrCat("this->", (*variables)["name"], "_"); |
55 } | 55 } |
56 (*variables)["stream_writer"] = | 56 (*variables)["stream_writer"] = |
57 (*variables)["declared_type"] + | 57 (*variables)["declared_type"] + |
58 (HasFastArraySerialization(descriptor->message_type()->file(), options) | 58 (HasFastArraySerialization(descriptor->message_type()->file(), options) |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 printer->Print(variables_, | 154 printer->Print(variables_, |
155 " $name$_ = ::google::protobuf::Arena::Create< $type$ >(\n" | 155 " $name$_ = ::google::protobuf::Arena::Create< $type$ >(\n" |
156 " GetArenaNoVirtual());\n"); | 156 " GetArenaNoVirtual());\n"); |
157 } | 157 } |
158 printer->Print(variables_, | 158 printer->Print(variables_, |
159 "}\n" | 159 "}\n" |
160 "$type$* $classname$::_slow_$release_name$() {\n" | 160 "$type$* $classname$::_slow_$release_name$() {\n" |
161 " if ($name$_ == NULL) {\n" | 161 " if ($name$_ == NULL) {\n" |
162 " return NULL;\n" | 162 " return NULL;\n" |
163 " } else {\n" | 163 " } else {\n" |
164 " $type$* temp = new $type$(*$name$_);\n" | 164 " $type$* temp = new $type$;\n" |
| 165 " temp->MergeFrom(*$name$_);\n" |
165 " $name$_ = NULL;\n" | 166 " $name$_ = NULL;\n" |
166 " return temp;\n" | 167 " return temp;\n" |
167 " }\n" | 168 " }\n" |
168 "}\n" | 169 "}\n" |
169 "$type$* $classname$::unsafe_arena_release_$name$() {\n" | 170 "$type$* $classname$::unsafe_arena_release_$name$() {\n" |
170 " // @@protoc_insertion_point(field_unsafe_arena_release:$full_name$)\n" | 171 " // @@protoc_insertion_point(field_unsafe_arena_release:$full_name$)\n" |
171 " $clear_hasbit$\n" | 172 " $clear_hasbit$\n" |
172 " $type$* temp = $name$_;\n" | 173 " $type$* temp = $name$_;\n" |
173 " $name$_ = NULL;\n" | 174 " $name$_ = NULL;\n" |
174 " return temp;\n" | 175 " return temp;\n" |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 "}\n"); | 212 "}\n"); |
212 } | 213 } |
213 } | 214 } |
214 | 215 |
215 void MessageFieldGenerator:: | 216 void MessageFieldGenerator:: |
216 GenerateDependentInlineAccessorDefinitions(io::Printer* printer) const { | 217 GenerateDependentInlineAccessorDefinitions(io::Printer* printer) const { |
217 if (!dependent_field_) { | 218 if (!dependent_field_) { |
218 return; | 219 return; |
219 } | 220 } |
220 | 221 |
221 std::map<string, string> variables(variables_); | 222 map<string, string> variables(variables_); |
222 // For the CRTP base class, all mutation methods are dependent, and so | 223 // For the CRTP base class, all mutation methods are dependent, and so |
223 // they must be in the header. | 224 // they must be in the header. |
224 variables["dependent_classname"] = | 225 variables["dependent_classname"] = |
225 DependentBaseClassTemplateName(descriptor_->containing_type()) + "<T>"; | 226 DependentBaseClassTemplateName(descriptor_->containing_type()) + "<T>"; |
226 variables["this_message"] = DependentBaseDownCast(); | 227 variables["this_message"] = DependentBaseDownCast(); |
227 if (!variables["set_hasbit"].empty()) { | 228 if (!variables["set_hasbit"].empty()) { |
228 variables["set_hasbit"] = | 229 variables["set_hasbit"] = |
229 variables["this_message"] + variables["set_hasbit"]; | 230 variables["this_message"] + variables["set_hasbit"]; |
230 } | 231 } |
231 if (!variables["clear_hasbit"].empty()) { | 232 if (!variables["clear_hasbit"].empty()) { |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
338 " $clear_hasbit$\n" | 339 " $clear_hasbit$\n" |
339 " }\n" | 340 " }\n" |
340 " // @@protoc_insertion_point(field_set_allocated:$full_name$)\n" | 341 " // @@protoc_insertion_point(field_set_allocated:$full_name$)\n" |
341 "}\n"); | 342 "}\n"); |
342 } | 343 } |
343 } | 344 } |
344 | 345 |
345 void MessageFieldGenerator:: | 346 void MessageFieldGenerator:: |
346 GenerateInlineAccessorDefinitions(io::Printer* printer, | 347 GenerateInlineAccessorDefinitions(io::Printer* printer, |
347 bool is_inline) const { | 348 bool is_inline) const { |
| 349 map<string, string> variables(variables_); |
| 350 variables["inline"] = is_inline ? "inline " : ""; |
| 351 printer->Print(variables, |
| 352 "$inline$const $type$& $classname$::$name$() const {\n" |
| 353 " // @@protoc_insertion_point(field_get:$full_name$)\n"); |
| 354 |
| 355 PrintHandlingOptionalStaticInitializers( |
| 356 variables, descriptor_->file(), options_, printer, |
| 357 // With static initializers. |
| 358 " return $name$_ != NULL ? *$name$_ : *default_instance_->$name$_;\n", |
| 359 // Without. |
| 360 " return $name$_ != NULL ? *$name$_ : *default_instance().$name$_;\n"); |
| 361 printer->Print(variables, "}\n"); |
| 362 |
348 if (dependent_field_) { | 363 if (dependent_field_) { |
349 // for dependent fields we cannot access its internal_default_instance, | |
350 // because the type is incomplete. | |
351 // TODO(gerbens) deprecate dependent base class. | |
352 std::map<string, string> variables(variables_); | |
353 variables["inline"] = is_inline ? "inline " : ""; | |
354 printer->Print(variables, | |
355 "$inline$const $type$& $classname$::$name$() const {\n" | |
356 " // @@protoc_insertion_point(field_get:$full_name$)\n" | |
357 " return $name$_ != NULL ? *$name$_\n" | |
358 " : *internal_default_instance()->$name$_;\n" | |
359 "}\n"); | |
360 return; | 364 return; |
361 } | 365 } |
362 | 366 |
363 std::map<string, string> variables(variables_); | |
364 variables["inline"] = is_inline ? "inline " : ""; | |
365 printer->Print(variables, | |
366 "$inline$const $type$& $classname$::$name$() const {\n" | |
367 " // @@protoc_insertion_point(field_get:$full_name$)\n" | |
368 " return $name$_ != NULL ? *$name$_\n" | |
369 " : *$type$::internal_default_instance();\n" | |
370 "}\n"); | |
371 | |
372 if (SupportsArenas(descriptor_)) { | 367 if (SupportsArenas(descriptor_)) { |
373 printer->Print(variables, | 368 printer->Print(variables, |
374 "$inline$" | 369 "$inline$" |
375 "$type$* $classname$::mutable_$name$() {\n" | 370 "$type$* $classname$::mutable_$name$() {\n" |
376 " $set_hasbit$\n" | 371 " $set_hasbit$\n" |
377 " if ($name$_ == NULL) {\n" | 372 " if ($name$_ == NULL) {\n" |
378 " _slow_mutable_$name$();\n" | 373 " _slow_mutable_$name$();\n" |
379 " }\n" | 374 " }\n" |
380 " // @@protoc_insertion_point(field_mutable:$full_name$)\n" | 375 " // @@protoc_insertion_point(field_mutable:$full_name$)\n" |
381 " return $name$_;\n" | 376 " return $name$_;\n" |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
462 " } else {\n" | 457 " } else {\n" |
463 " $clear_hasbit$\n" | 458 " $clear_hasbit$\n" |
464 " }\n" | 459 " }\n" |
465 " // @@protoc_insertion_point(field_set_allocated:$full_name$)\n" | 460 " // @@protoc_insertion_point(field_set_allocated:$full_name$)\n" |
466 "}\n"); | 461 "}\n"); |
467 } | 462 } |
468 } | 463 } |
469 | 464 |
470 void MessageFieldGenerator:: | 465 void MessageFieldGenerator:: |
471 GenerateClearingCode(io::Printer* printer) const { | 466 GenerateClearingCode(io::Printer* printer) const { |
472 std::map<string, string> variables(variables_); | 467 map<string, string> variables(variables_); |
473 variables["this_message"] = dependent_field_ ? DependentBaseDownCast() : ""; | 468 variables["this_message"] = dependent_field_ ? DependentBaseDownCast() : ""; |
474 if (!HasFieldPresence(descriptor_->file())) { | 469 if (!HasFieldPresence(descriptor_->file())) { |
475 // If we don't have has-bits, message presence is indicated only by ptr != | 470 // If we don't have has-bits, message presence is indicated only by ptr != |
476 // NULL. Thus on clear, we need to delete the object. | 471 // NULL. Thus on clear, we need to delete the object. |
477 printer->Print(variables, | 472 printer->Print(variables, |
478 "if ($this_message$GetArenaNoVirtual() == NULL && " | 473 "if ($this_message$GetArenaNoVirtual() == NULL && " |
479 "$this_message$$name$_ != NULL) delete $this_message$$name$_;\n" | 474 "$this_message$$name$_ != NULL) delete $this_message$$name$_;\n" |
480 "$this_message$$name$_ = NULL;\n"); | 475 "$this_message$$name$_ = NULL;\n"); |
481 } else { | 476 } else { |
482 printer->Print(variables, | 477 printer->Print(variables, |
483 "if ($this_message$$name$_ != NULL) $this_message$$name$_->" | 478 "if ($this_message$$name$_ != NULL) $this_message$$name$_->" |
484 "$dependent_type$::Clear();\n"); | 479 "$dependent_type$::Clear();\n"); |
485 } | 480 } |
486 } | 481 } |
487 | 482 |
488 void MessageFieldGenerator:: | 483 void MessageFieldGenerator:: |
489 GenerateMessageClearingCode(io::Printer* printer) const { | |
490 std::map<string, string> variables(variables_); | |
491 variables["type"] = FieldMessageTypeName(descriptor_); | |
492 | |
493 if (!HasFieldPresence(descriptor_->file())) { | |
494 // If we don't have has-bits, message presence is indicated only by ptr != | |
495 // NULL. Thus on clear, we need to delete the object. | |
496 printer->Print(variables_, | |
497 "if (GetArenaNoVirtual() == NULL && $name$_ != NULL) {\n" | |
498 " delete $name$_;\n" | |
499 "}\n" | |
500 "$name$_ = NULL;\n"); | |
501 } else { | |
502 printer->Print(variables_, | |
503 "GOOGLE_DCHECK($name$_ != NULL);\n" | |
504 "$name$_->$type$::Clear();\n"); | |
505 } | |
506 } | |
507 | |
508 void MessageFieldGenerator:: | |
509 GenerateMergingCode(io::Printer* printer) const { | 484 GenerateMergingCode(io::Printer* printer) const { |
510 printer->Print(variables_, | 485 printer->Print(variables_, |
511 "mutable_$name$()->$type$::MergeFrom(from.$name$());\n"); | 486 "mutable_$name$()->$type$::MergeFrom(from.$name$());\n"); |
512 } | 487 } |
513 | 488 |
514 void MessageFieldGenerator:: | 489 void MessageFieldGenerator:: |
515 GenerateSwappingCode(io::Printer* printer) const { | 490 GenerateSwappingCode(io::Printer* printer) const { |
516 printer->Print(variables_, "std::swap($name$_, other->$name$_);\n"); | 491 printer->Print(variables_, "std::swap($name$_, other->$name$_);\n"); |
517 } | 492 } |
518 | 493 |
519 void MessageFieldGenerator:: | 494 void MessageFieldGenerator:: |
520 GenerateDestructorCode(io::Printer* printer) const { | |
521 // In google3 a default instance will never get deleted so we don't need to | |
522 // worry about that but in opensource protobuf default instances are deleted | |
523 // in shutdown process and we need to take special care when handling them. | |
524 printer->Print(variables_, | |
525 "if (this != internal_default_instance()) {\n" | |
526 " delete $name$_;\n" | |
527 "}\n"); | |
528 } | |
529 | |
530 void MessageFieldGenerator:: | |
531 GenerateConstructorCode(io::Printer* printer) const { | 495 GenerateConstructorCode(io::Printer* printer) const { |
532 printer->Print(variables_, "$name$_ = NULL;\n"); | 496 printer->Print(variables_, "$name$_ = NULL;\n"); |
533 } | 497 } |
534 | 498 |
535 void MessageFieldGenerator:: | 499 void MessageFieldGenerator:: |
536 GenerateCopyConstructorCode(io::Printer* printer) const { | |
537 // For non-Arena enabled messages, everything always goes on the heap. | |
538 // | |
539 // For Arena enabled messages, the logic is a bit more convoluted. | |
540 // | |
541 // In the copy constructor, we call InternalMetadataWithArena::MergeFrom, | |
542 // which does *not* copy the Arena pointer. In the generated MergeFrom | |
543 // (see MessageFieldGenerator::GenerateMergingCode), we: | |
544 // -> copy the has bits (but this is done in bulk by a memcpy in the copy | |
545 // constructor) | |
546 // -> check whether the destination field pointer is NULL (it will be, since | |
547 // we're initializing it and would have called SharedCtor) and if so: | |
548 // -> call _slow_mutable_$name$(), which calls either | |
549 // ::google::protobuf::Arena::CreateMessage<>(GetArenaNoVirtual()), or | |
550 // ::google::protobuf::Arena::Create<>(GetArenaNoVirtual()) | |
551 // | |
552 // At this point, GetArenaNoVirtual returns NULL since the Arena pointer | |
553 // wasn't copied, so both of these methods allocate the submessage on the | |
554 // heap. | |
555 | |
556 printer->Print(variables_, | |
557 "if (from.has_$name$()) {\n" | |
558 " $name$_ = new $type$(*from.$name$_);\n" | |
559 "} else {\n" | |
560 " $name$_ = NULL;\n" | |
561 "}\n"); | |
562 } | |
563 | |
564 void MessageFieldGenerator:: | |
565 GenerateMergeFromCodedStream(io::Printer* printer) const { | 500 GenerateMergeFromCodedStream(io::Printer* printer) const { |
566 if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE) { | 501 if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE) { |
567 printer->Print(variables_, | 502 printer->Print(variables_, |
568 "DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n
" | 503 "DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n
" |
569 " input, mutable_$name$()));\n"); | 504 " input, mutable_$name$()));\n"); |
570 } else { | 505 } else { |
571 printer->Print(variables_, | 506 printer->Print(variables_, |
572 "DO_(::google::protobuf::internal::WireFormatLite::ReadGroupNoVirtual(\n" | 507 "DO_(::google::protobuf::internal::WireFormatLite::ReadGroupNoVirtual(\n" |
573 " $number$, input, mutable_$name$()));\n"); | 508 " $number$, input, mutable_$name$()));\n"); |
574 } | 509 } |
575 } | 510 } |
576 | 511 |
577 void MessageFieldGenerator:: | 512 void MessageFieldGenerator:: |
578 GenerateSerializeWithCachedSizes(io::Printer* printer) const { | 513 GenerateSerializeWithCachedSizes(io::Printer* printer) const { |
579 printer->Print(variables_, | 514 printer->Print(variables_, |
580 "::google::protobuf::internal::WireFormatLite::Write$stream_writer$(\n" | 515 "::google::protobuf::internal::WireFormatLite::Write$stream_writer$(\n" |
581 " $number$, *$non_null_ptr_to_name$, output);\n"); | 516 " $number$, *$non_null_ptr_to_name$, output);\n"); |
582 } | 517 } |
583 | 518 |
584 void MessageFieldGenerator:: | 519 void MessageFieldGenerator:: |
585 GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { | 520 GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { |
586 printer->Print(variables_, | 521 printer->Print(variables_, |
587 "target = ::google::protobuf::internal::WireFormatLite::\n" | 522 "target = ::google::protobuf::internal::WireFormatLite::\n" |
588 " InternalWrite$declared_type$NoVirtualToArray(\n" | 523 " Write$declared_type$NoVirtualToArray(\n" |
589 " $number$, *$non_null_ptr_to_name$, false, target);\n"); | 524 " $number$, *$non_null_ptr_to_name$, target);\n"); |
590 } | 525 } |
591 | 526 |
592 void MessageFieldGenerator:: | 527 void MessageFieldGenerator:: |
593 GenerateByteSize(io::Printer* printer) const { | 528 GenerateByteSize(io::Printer* printer) const { |
594 printer->Print(variables_, | 529 printer->Print(variables_, |
595 "total_size += $tag_size$ +\n" | 530 "total_size += $tag_size$ +\n" |
596 " ::google::protobuf::internal::WireFormatLite::$declared_type$SizeNoVirtua
l(\n" | 531 " ::google::protobuf::internal::WireFormatLite::$declared_type$SizeNoVirtua
l(\n" |
597 " *$non_null_ptr_to_name$);\n"); | 532 " *$non_null_ptr_to_name$);\n"); |
598 } | 533 } |
599 | 534 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
634 "$deprecated_attr$const $type$& $name$() const;\n"); | 569 "$deprecated_attr$const $type$& $name$() const;\n"); |
635 } | 570 } |
636 | 571 |
637 void MessageOneofFieldGenerator:: | 572 void MessageOneofFieldGenerator:: |
638 GenerateDependentInlineAccessorDefinitions(io::Printer* printer) const { | 573 GenerateDependentInlineAccessorDefinitions(io::Printer* printer) const { |
639 // For the CRTP base class, all mutation methods are dependent, and so | 574 // For the CRTP base class, all mutation methods are dependent, and so |
640 // they must be in the header. | 575 // they must be in the header. |
641 if (!dependent_base_) { | 576 if (!dependent_base_) { |
642 return; | 577 return; |
643 } | 578 } |
644 std::map<string, string> variables(variables_); | 579 map<string, string> variables(variables_); |
645 variables["inline"] = "inline "; | 580 variables["inline"] = "inline "; |
646 variables["dependent_classname"] = | 581 variables["dependent_classname"] = |
647 DependentBaseClassTemplateName(descriptor_->containing_type()) + "<T>"; | 582 DependentBaseClassTemplateName(descriptor_->containing_type()) + "<T>"; |
648 variables["this_message"] = "reinterpret_cast<T*>(this)->"; | 583 variables["this_message"] = "reinterpret_cast<T*>(this)->"; |
649 // Const message access is needed for the dependent getter. | 584 // Const message access is needed for the dependent getter. |
650 variables["this_const_message"] = "reinterpret_cast<const T*>(this)->"; | 585 variables["this_const_message"] = "reinterpret_cast<const T*>(this)->"; |
651 variables["tmpl"] = "template <class T>\n"; | 586 variables["tmpl"] = "template <class T>\n"; |
652 variables["field_member"] = variables["this_message"] + | 587 variables["field_member"] = variables["this_message"] + |
653 variables["oneof_prefix"] + variables["name"] + | 588 variables["oneof_prefix"] + variables["name"] + |
654 "_"; | 589 "_"; |
655 InternalGenerateInlineAccessorDefinitions(variables, printer); | 590 InternalGenerateInlineAccessorDefinitions(variables, printer); |
656 } | 591 } |
657 | 592 |
658 void MessageOneofFieldGenerator:: | 593 void MessageOneofFieldGenerator:: |
659 GenerateInlineAccessorDefinitions(io::Printer* printer, | 594 GenerateInlineAccessorDefinitions(io::Printer* printer, |
660 bool is_inline) const { | 595 bool is_inline) const { |
661 if (dependent_base_) { | 596 if (dependent_base_) { |
662 return; | 597 return; |
663 } | 598 } |
664 std::map<string, string> variables(variables_); | 599 map<string, string> variables(variables_); |
665 variables["inline"] = is_inline ? "inline " : ""; | 600 variables["inline"] = is_inline ? "inline " : ""; |
666 variables["dependent_classname"] = variables["classname"]; | 601 variables["dependent_classname"] = variables["classname"]; |
667 variables["this_message"] = ""; | 602 variables["this_message"] = ""; |
668 variables["this_const_message"] = ""; | 603 variables["this_const_message"] = ""; |
669 variables["tmpl"] = ""; | 604 variables["tmpl"] = ""; |
670 variables["field_member"] = | 605 variables["field_member"] = |
671 variables["oneof_prefix"] + variables["name"] + "_"; | 606 variables["oneof_prefix"] + variables["name"] + "_"; |
672 variables["dependent_type"] = variables["type"]; | 607 variables["dependent_type"] = variables["type"]; |
673 InternalGenerateInlineAccessorDefinitions(variables, printer); | 608 InternalGenerateInlineAccessorDefinitions(variables, printer); |
674 } | 609 } |
675 | 610 |
676 void MessageOneofFieldGenerator:: | 611 void MessageOneofFieldGenerator:: |
677 GenerateNonInlineAccessorDefinitions(io::Printer* printer) const { | 612 GenerateNonInlineAccessorDefinitions(io::Printer* printer) const { |
678 std::map<string, string> variables(variables_); | 613 map<string, string> variables(variables_); |
679 variables["field_member"] = | 614 variables["field_member"] = |
680 variables["oneof_prefix"] + variables["name"] + "_"; | 615 variables["oneof_prefix"] + variables["name"] + "_"; |
681 | 616 |
682 //printer->Print(variables, | 617 //printer->Print(variables, |
683 } | 618 } |
684 | 619 |
685 void MessageOneofFieldGenerator::InternalGenerateInlineAccessorDefinitions( | 620 void MessageOneofFieldGenerator:: |
686 const std::map<string, string>& variables, io::Printer* printer) const { | 621 InternalGenerateInlineAccessorDefinitions(const map<string, string>& variables, |
| 622 io::Printer* printer) const { |
687 printer->Print(variables, | 623 printer->Print(variables, |
688 "$tmpl$" | 624 "$tmpl$" |
689 "$inline$ " | 625 "$inline$ " |
690 "const $type$& $dependent_classname$::$name$() const {\n" | 626 "const $type$& $dependent_classname$::$name$() const {\n" |
691 " // @@protoc_insertion_point(field_get:$full_name$)\n" | 627 " // @@protoc_insertion_point(field_get:$full_name$)\n" |
692 " return $this_const_message$has_$name$()\n" | 628 " return $this_const_message$has_$name$()\n" |
693 " ? *$this_const_message$$oneof_prefix$$name$_\n" | 629 " ? *$this_const_message$$oneof_prefix$$name$_\n" |
694 " : $dependent_type$::default_instance();\n" | 630 " : $dependent_type$::default_instance();\n" |
695 "}\n"); | 631 "}\n"); |
696 | 632 |
(...skipping 23 matching lines...) Expand all Loading... |
720 "}\n" | 656 "}\n" |
721 "$tmpl$" | 657 "$tmpl$" |
722 "$inline$" | 658 "$inline$" |
723 "$type$* $dependent_classname$::$release_name$() {\n" | 659 "$type$* $dependent_classname$::$release_name$() {\n" |
724 " // @@protoc_insertion_point(field_release:$full_name$)\n" | 660 " // @@protoc_insertion_point(field_release:$full_name$)\n" |
725 " if ($this_message$has_$name$()) {\n" | 661 " if ($this_message$has_$name$()) {\n" |
726 " $this_message$clear_has_$oneof_name$();\n" | 662 " $this_message$clear_has_$oneof_name$();\n" |
727 " if ($this_message$GetArenaNoVirtual() != NULL) {\n" | 663 " if ($this_message$GetArenaNoVirtual() != NULL) {\n" |
728 // N.B.: safe to use the underlying field pointer here because we are sure | 664 // N.B.: safe to use the underlying field pointer here because we are sure |
729 // that it is non-NULL (because has_$name$() returned true). | 665 // that it is non-NULL (because has_$name$() returned true). |
730 " $dependent_typename$* temp = " | 666 " $dependent_typename$* temp = new $dependent_typename$;\n" |
731 "new $dependent_typename$(*$field_member$);\n" | 667 " temp->MergeFrom(*$field_member$);\n" |
732 " $field_member$ = NULL;\n" | 668 " $field_member$ = NULL;\n" |
733 " return temp;\n" | 669 " return temp;\n" |
734 " } else {\n" | 670 " } else {\n" |
735 " $dependent_typename$* temp = $field_member$;\n" | 671 " $dependent_typename$* temp = $field_member$;\n" |
736 " $field_member$ = NULL;\n" | 672 " $field_member$ = NULL;\n" |
737 " return temp;\n" | 673 " return temp;\n" |
738 " }\n" | 674 " }\n" |
739 " } else {\n" | 675 " } else {\n" |
740 " return NULL;\n" | 676 " return NULL;\n" |
741 " }\n" | 677 " }\n" |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
846 " $this_message$set_has_$name$();\n" | 782 " $this_message$set_has_$name$();\n" |
847 " $field_member$ = $name$;\n" | 783 " $field_member$ = $name$;\n" |
848 " }\n" | 784 " }\n" |
849 " // @@protoc_insertion_point(field_set_allocated:$full_name$)\n" | 785 " // @@protoc_insertion_point(field_set_allocated:$full_name$)\n" |
850 "}\n"); | 786 "}\n"); |
851 } | 787 } |
852 } | 788 } |
853 | 789 |
854 void MessageOneofFieldGenerator:: | 790 void MessageOneofFieldGenerator:: |
855 GenerateClearingCode(io::Printer* printer) const { | 791 GenerateClearingCode(io::Printer* printer) const { |
856 std::map<string, string> variables(variables_); | 792 map<string, string> variables(variables_); |
857 variables["this_message"] = dependent_field_ ? DependentBaseDownCast() : ""; | 793 variables["this_message"] = dependent_field_ ? DependentBaseDownCast() : ""; |
858 if (SupportsArenas(descriptor_)) { | 794 if (SupportsArenas(descriptor_)) { |
859 printer->Print(variables, | 795 printer->Print(variables, |
860 "if ($this_message$GetArenaNoVirtual() == NULL) {\n" | 796 "if ($this_message$GetArenaNoVirtual() == NULL) {\n" |
861 " delete $this_message$$oneof_prefix$$name$_;\n" | 797 " delete $this_message$$oneof_prefix$$name$_;\n" |
862 "}\n"); | 798 "}\n"); |
863 } else { | 799 } else { |
864 printer->Print(variables, | 800 printer->Print(variables, |
865 "delete $this_message$$oneof_prefix$$name$_;\n"); | 801 "delete $this_message$$oneof_prefix$$name$_;\n"); |
866 } | 802 } |
867 } | 803 } |
868 | 804 |
869 void MessageOneofFieldGenerator:: | 805 void MessageOneofFieldGenerator:: |
870 GenerateMessageClearingCode(io::Printer* printer) const { | |
871 GenerateClearingCode(printer); | |
872 } | |
873 | |
874 void MessageOneofFieldGenerator:: | |
875 GenerateSwappingCode(io::Printer* printer) const { | 806 GenerateSwappingCode(io::Printer* printer) const { |
876 // Don't print any swapping code. Swapping the union will swap this field. | 807 // Don't print any swapping code. Swapping the union will swap this field. |
877 } | 808 } |
878 | 809 |
879 void MessageOneofFieldGenerator:: | 810 void MessageOneofFieldGenerator:: |
880 GenerateDestructorCode(io::Printer* printer) const { | |
881 // We inherit from MessageFieldGenerator, so we need to override the default | |
882 // behavior. | |
883 } | |
884 | |
885 void MessageOneofFieldGenerator:: | |
886 GenerateConstructorCode(io::Printer* printer) const { | 811 GenerateConstructorCode(io::Printer* printer) const { |
887 // Don't print any constructor code. The field is in a union. We allocate | 812 // Don't print any constructor code. The field is in a union. We allocate |
888 // space only when this field is used. | 813 // space only when this field is used. |
889 } | 814 } |
890 | 815 |
891 // =================================================================== | 816 // =================================================================== |
892 | 817 |
893 RepeatedMessageFieldGenerator::RepeatedMessageFieldGenerator( | 818 RepeatedMessageFieldGenerator::RepeatedMessageFieldGenerator( |
894 const FieldDescriptor* descriptor, const Options& options) | 819 const FieldDescriptor* descriptor, const Options& options) |
895 : FieldGenerator(options), | 820 : FieldGenerator(options), |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
947 "$deprecated_attr$const ::google::protobuf::RepeatedPtrField< $type$ >&\n" | 872 "$deprecated_attr$const ::google::protobuf::RepeatedPtrField< $type$ >&\n" |
948 " $name$() const;\n"); | 873 " $name$() const;\n"); |
949 } | 874 } |
950 } | 875 } |
951 | 876 |
952 void RepeatedMessageFieldGenerator:: | 877 void RepeatedMessageFieldGenerator:: |
953 GenerateDependentInlineAccessorDefinitions(io::Printer* printer) const { | 878 GenerateDependentInlineAccessorDefinitions(io::Printer* printer) const { |
954 if (!dependent_field_) { | 879 if (!dependent_field_) { |
955 return; | 880 return; |
956 } | 881 } |
957 std::map<string, string> variables(variables_); | 882 map<string, string> variables(variables_); |
958 // For the CRTP base class, all mutation methods are dependent, and so | 883 // For the CRTP base class, all mutation methods are dependent, and so |
959 // they must be in the header. | 884 // they must be in the header. |
960 variables["dependent_classname"] = | 885 variables["dependent_classname"] = |
961 DependentBaseClassTemplateName(descriptor_->containing_type()) + "<T>"; | 886 DependentBaseClassTemplateName(descriptor_->containing_type()) + "<T>"; |
962 variables["this_message"] = DependentBaseDownCast(); | 887 variables["this_message"] = DependentBaseDownCast(); |
963 variables["this_const_message"] = DependentBaseConstDownCast(); | 888 variables["this_const_message"] = DependentBaseConstDownCast(); |
964 | 889 |
965 if (dependent_getter_) { | 890 if (dependent_getter_) { |
966 printer->Print(variables, | 891 printer->Print(variables, |
967 "template <class T>\n" | 892 "template <class T>\n" |
(...skipping 10 matching lines...) Expand all Loading... |
978 // TODO(dlj): move insertion points | 903 // TODO(dlj): move insertion points |
979 " // @@protoc_insertion_point(field_mutable:$full_name$)\n" | 904 " // @@protoc_insertion_point(field_mutable:$full_name$)\n" |
980 " return $this_message$$name$_.Mutable(index);\n" | 905 " return $this_message$$name$_.Mutable(index);\n" |
981 "}\n" | 906 "}\n" |
982 "template <class T>\n" | 907 "template <class T>\n" |
983 "inline $type$* $dependent_classname$::add_$name$() {\n" | 908 "inline $type$* $dependent_classname$::add_$name$() {\n" |
984 " // @@protoc_insertion_point(field_add:$full_name$)\n" | 909 " // @@protoc_insertion_point(field_add:$full_name$)\n" |
985 " return $this_message$$name$_.Add();\n" | 910 " return $this_message$$name$_.Add();\n" |
986 "}\n"); | 911 "}\n"); |
987 | 912 |
| 913 |
988 if (dependent_getter_) { | 914 if (dependent_getter_) { |
989 printer->Print(variables, | 915 printer->Print(variables, |
990 "template <class T>\n" | 916 "template <class T>\n" |
991 "inline const ::google::protobuf::RepeatedPtrField< $type$ >&\n" | 917 "inline const ::google::protobuf::RepeatedPtrField< $type$ >&\n" |
992 "$dependent_classname$::$name$() const {\n" | 918 "$dependent_classname$::$name$() const {\n" |
993 " // @@protoc_insertion_point(field_list:$full_name$)\n" | 919 " // @@protoc_insertion_point(field_list:$full_name$)\n" |
994 " return $this_const_message$$name$_;\n" | 920 " return $this_const_message$$name$_;\n" |
995 "}\n"); | 921 "}\n"); |
996 } | 922 } |
997 | 923 |
998 // Generate mutable access to the entire list: | 924 // Generate mutable access to the entire list: |
999 printer->Print(variables, | 925 printer->Print(variables, |
1000 "template <class T>\n" | 926 "template <class T>\n" |
1001 "inline ::google::protobuf::RepeatedPtrField< $type$ >*\n" | 927 "inline ::google::protobuf::RepeatedPtrField< $type$ >*\n" |
1002 "$dependent_classname$::mutable_$name$() {\n" | 928 "$dependent_classname$::mutable_$name$() {\n" |
1003 " // @@protoc_insertion_point(field_mutable_list:$full_name$)\n" | 929 " // @@protoc_insertion_point(field_mutable_list:$full_name$)\n" |
1004 " return &$this_message$$name$_;\n" | 930 " return &$this_message$$name$_;\n" |
1005 "}\n"); | 931 "}\n"); |
1006 } | 932 } |
1007 | 933 |
1008 void RepeatedMessageFieldGenerator:: | 934 void RepeatedMessageFieldGenerator:: |
1009 GenerateInlineAccessorDefinitions(io::Printer* printer, | 935 GenerateInlineAccessorDefinitions(io::Printer* printer, |
1010 bool is_inline) const { | 936 bool is_inline) const { |
1011 std::map<string, string> variables(variables_); | 937 map<string, string> variables(variables_); |
1012 variables["inline"] = is_inline ? "inline " : ""; | 938 variables["inline"] = is_inline ? "inline " : ""; |
1013 | 939 |
1014 if (!dependent_getter_) { | 940 if (!dependent_getter_) { |
1015 printer->Print(variables, | 941 printer->Print(variables, |
1016 "$inline$" | 942 "$inline$" |
1017 "const $type$& $classname$::$name$(int index) const {\n" | 943 "const $type$& $classname$::$name$(int index) const {\n" |
1018 " // @@protoc_insertion_point(field_get:$full_name$)\n" | 944 " // @@protoc_insertion_point(field_get:$full_name$)\n" |
1019 " return $name$_.$cppget$(index);\n" | 945 " return $name$_.$cppget$(index);\n" |
1020 "}\n"); | 946 "}\n"); |
1021 } | 947 } |
(...skipping 29 matching lines...) Expand all Loading... |
1051 "const ::google::protobuf::RepeatedPtrField< $type$ >&\n" | 977 "const ::google::protobuf::RepeatedPtrField< $type$ >&\n" |
1052 "$classname$::$name$() const {\n" | 978 "$classname$::$name$() const {\n" |
1053 " // @@protoc_insertion_point(field_list:$full_name$)\n" | 979 " // @@protoc_insertion_point(field_list:$full_name$)\n" |
1054 " return $name$_;\n" | 980 " return $name$_;\n" |
1055 "}\n"); | 981 "}\n"); |
1056 } | 982 } |
1057 } | 983 } |
1058 | 984 |
1059 void RepeatedMessageFieldGenerator:: | 985 void RepeatedMessageFieldGenerator:: |
1060 GenerateClearingCode(io::Printer* printer) const { | 986 GenerateClearingCode(io::Printer* printer) const { |
1061 std::map<string, string> variables(variables_); | 987 map<string, string> variables(variables_); |
1062 variables["this_message"] = dependent_field_ ? DependentBaseDownCast() : ""; | 988 variables["this_message"] = dependent_field_ ? DependentBaseDownCast() : ""; |
1063 printer->Print(variables, "$this_message$$name$_.Clear();\n"); | 989 printer->Print(variables, "$this_message$$name$_.Clear();\n"); |
1064 } | 990 } |
1065 | 991 |
1066 void RepeatedMessageFieldGenerator:: | 992 void RepeatedMessageFieldGenerator:: |
1067 GenerateMergingCode(io::Printer* printer) const { | 993 GenerateMergingCode(io::Printer* printer) const { |
1068 printer->Print(variables_, "$name$_.MergeFrom(from.$name$_);\n"); | 994 printer->Print(variables_, "$name$_.MergeFrom(from.$name$_);\n"); |
1069 } | 995 } |
1070 | 996 |
1071 void RepeatedMessageFieldGenerator:: | 997 void RepeatedMessageFieldGenerator:: |
(...skipping 28 matching lines...) Expand all Loading... |
1100 " ::google::protobuf::internal::WireFormatLite::Write$stream_writer$(\n" | 1026 " ::google::protobuf::internal::WireFormatLite::Write$stream_writer$(\n" |
1101 " $number$, this->$name$(i), output);\n" | 1027 " $number$, this->$name$(i), output);\n" |
1102 "}\n"); | 1028 "}\n"); |
1103 } | 1029 } |
1104 | 1030 |
1105 void RepeatedMessageFieldGenerator:: | 1031 void RepeatedMessageFieldGenerator:: |
1106 GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { | 1032 GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { |
1107 printer->Print(variables_, | 1033 printer->Print(variables_, |
1108 "for (unsigned int i = 0, n = this->$name$_size(); i < n; i++) {\n" | 1034 "for (unsigned int i = 0, n = this->$name$_size(); i < n; i++) {\n" |
1109 " target = ::google::protobuf::internal::WireFormatLite::\n" | 1035 " target = ::google::protobuf::internal::WireFormatLite::\n" |
1110 " InternalWrite$declared_type$NoVirtualToArray(\n" | 1036 " Write$declared_type$NoVirtualToArray(\n" |
1111 " $number$, this->$name$(i), false, target);\n" | 1037 " $number$, this->$name$(i), target);\n" |
1112 "}\n"); | 1038 "}\n"); |
1113 } | 1039 } |
1114 | 1040 |
1115 void RepeatedMessageFieldGenerator:: | 1041 void RepeatedMessageFieldGenerator:: |
1116 GenerateByteSize(io::Printer* printer) const { | 1042 GenerateByteSize(io::Printer* printer) const { |
1117 printer->Print(variables_, | 1043 printer->Print(variables_, |
1118 "{\n" | 1044 "total_size += $tag_size$ * this->$name$_size();\n" |
1119 " unsigned int count = this->$name$_size();\n"); | 1045 "for (int i = 0; i < this->$name$_size(); i++) {\n" |
1120 printer->Indent(); | |
1121 printer->Print(variables_, | |
1122 "total_size += $tag_size$UL * count;\n" | |
1123 "for (unsigned int i = 0; i < count; i++) {\n" | |
1124 " total_size +=\n" | 1046 " total_size +=\n" |
1125 " ::google::protobuf::internal::WireFormatLite::$declared_type$SizeNoVirt
ual(\n" | 1047 " ::google::protobuf::internal::WireFormatLite::$declared_type$SizeNoVirt
ual(\n" |
1126 " this->$name$(i));\n" | 1048 " this->$name$(i));\n" |
1127 "}\n"); | 1049 "}\n"); |
1128 printer->Outdent(); | |
1129 printer->Print("}\n"); | |
1130 } | 1050 } |
1131 | 1051 |
1132 } // namespace cpp | 1052 } // namespace cpp |
1133 } // namespace compiler | 1053 } // namespace compiler |
1134 } // namespace protobuf | 1054 } // namespace protobuf |
1135 } // namespace google | 1055 } // namespace google |
OLD | NEW |