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