1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc. All rights reserved. 3afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson// https://developers.google.com/protocol-buffers/ 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met: 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions of source code must retain the above copyright 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer. 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions in binary form must reproduce the above 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution. 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Neither the name of Google Inc. nor the names of its 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission. 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda) 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Based on original Protocol Buffers design by 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Sanjay Ghemawat, Jeff Dean, and others. 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/cpp/cpp_enum_field.h> 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/cpp/cpp_helpers.h> 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/io/printer.h> 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/strutil.h> 39b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/wire_format.h> 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google { 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace compiler { 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace cpp { 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace { 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid SetEnumVariables(const FieldDescriptor* descriptor, 49a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson map<string, string>* variables, 50a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Options& options) { 51a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetCommonFieldVariables(descriptor, variables, options); 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* default_value = descriptor->default_value_enum(); 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (*variables)["type"] = ClassName(descriptor->enum_type(), true); 54a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["default"] = Int32ToString(default_value->number()); 55a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["full_name"] = descriptor->full_name(); 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 62b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerEnumFieldGenerator::EnumFieldGenerator(const FieldDescriptor* descriptor, 63b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Options& options) 64b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer : FieldGenerator(options), descriptor_(descriptor) { 65a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetEnumVariables(descriptor, &variables_, options); 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleEnumFieldGenerator::~EnumFieldGenerator() {} 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid EnumFieldGenerator:: 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGeneratePrivateMembers(io::Printer* printer) const { 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, "int $name$_;\n"); 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid EnumFieldGenerator:: 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateAccessorDeclarations(io::Printer* printer) const { 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 78b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "$deprecated_attr$$type$ $name$() const;\n" 79b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "$deprecated_attr$void set_$name$($type$ value);\n"); 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid EnumFieldGenerator:: 83b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateInlineAccessorDefinitions(io::Printer* printer, 84b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer bool is_inline) const { 85b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map<string, string> variables(variables_); 86b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer variables["inline"] = is_inline ? "inline" : ""; 87b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables, 88b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "$inline$ $type$ $classname$::$name$() const {\n" 89a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " // @@protoc_insertion_point(field_get:$full_name$)\n" 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " return static_cast< $type$ >($name$_);\n" 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n" 92b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "$inline$ void $classname$::set_$name$($type$ value) {\n"); 93b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (!HasPreservingUnknownEnumSemantics(descriptor_->file())) { 94b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables, 95b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " assert($type$_IsValid(value));\n"); 96b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 97b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables, 98b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " $set_hasbit$\n" 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " $name$_ = value;\n" 100a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " // @@protoc_insertion_point(field_set:$full_name$)\n" 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n"); 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid EnumFieldGenerator:: 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateClearingCode(io::Printer* printer) const { 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, "$name$_ = $default$;\n"); 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid EnumFieldGenerator:: 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergingCode(io::Printer* printer) const { 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, "set_$name$(from.$name$());\n"); 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid EnumFieldGenerator:: 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSwappingCode(io::Printer* printer) const { 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, "std::swap($name$_, other->$name$_);\n"); 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid EnumFieldGenerator:: 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateConstructorCode(io::Printer* printer) const { 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, "$name$_ = $default$;\n"); 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid EnumFieldGenerator:: 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergeFromCodedStream(io::Printer* printer) const { 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "int value;\n" 128d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n" 129d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville " int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(\n" 130b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " input, &value)));\n"); 131b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (HasPreservingUnknownEnumSemantics(descriptor_->file())) { 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 133b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "set_$name$(static_cast< $type$ >(value));\n"); 134a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 135b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables_, 136b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "if ($type$_IsValid(value)) {\n" 137b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " set_$name$(static_cast< $type$ >(value));\n"); 138b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (UseUnknownFieldSet(descriptor_->file(), options_)) { 139b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables_, 140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "} else {\n" 141b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " mutable_unknown_fields()->AddVarint($number$, value);\n"); 142b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } else { 143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print( 144b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "} else {\n" 145b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " unknown_fields_stream.WriteVarint32($tag$);\n" 146b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " unknown_fields_stream.WriteVarint32(value);\n", 147b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "tag", SimpleItoa(internal::WireFormat::MakeTag(descriptor_))); 148b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 149b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables_, 150b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "}\n"); 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid EnumFieldGenerator:: 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizes(io::Printer* printer) const { 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "::google::protobuf::internal::WireFormatLite::WriteEnum(\n" 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " $number$, this->$name$(), output);\n"); 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid EnumFieldGenerator:: 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(\n" 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " $number$, this->$name$(), target);\n"); 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid EnumFieldGenerator:: 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateByteSize(io::Printer* printer) const { 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "total_size += $tag_size$ +\n" 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " ::google::protobuf::internal::WireFormatLite::EnumSize(this->$name$());\n"); 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 177a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonEnumOneofFieldGenerator:: 178a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonEnumOneofFieldGenerator(const FieldDescriptor* descriptor, 179a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Options& options) 180a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson : EnumFieldGenerator(descriptor, options) { 181a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetCommonOneofFieldVariables(descriptor, &variables_); 182a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 183a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 184a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonEnumOneofFieldGenerator::~EnumOneofFieldGenerator() {} 185a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 186a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid EnumOneofFieldGenerator:: 187b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateInlineAccessorDefinitions(io::Printer* printer, 188b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer bool is_inline) const { 189b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map<string, string> variables(variables_); 190b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer variables["inline"] = is_inline ? "inline" : ""; 191b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables, 192b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "$inline$ $type$ $classname$::$name$() const {\n" 193b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " // @@protoc_insertion_point(field_get:$full_name$)\n" 194a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if (has_$name$()) {\n" 195a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return static_cast< $type$ >($oneof_prefix$$name$_);\n" 196a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 197a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return static_cast< $type$ >($default$);\n" 198a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n" 199b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "$inline$ void $classname$::set_$name$($type$ value) {\n"); 200b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (!HasPreservingUnknownEnumSemantics(descriptor_->file())) { 201b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables, 202b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " assert($type$_IsValid(value));\n"); 203b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 204b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables, 205a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if (!has_$name$()) {\n" 206a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " clear_$oneof_name$();\n" 207a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " set_has_$name$();\n" 208a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 209a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $oneof_prefix$$name$_ = value;\n" 210b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " // @@protoc_insertion_point(field_set:$full_name$)\n" 211a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 212a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 213a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 214a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid EnumOneofFieldGenerator:: 215a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateClearingCode(io::Printer* printer) const { 216a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, "$oneof_prefix$$name$_ = $default$;\n"); 217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 218a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 219a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid EnumOneofFieldGenerator:: 220a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateSwappingCode(io::Printer* printer) const { 221a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Don't print any swapping code. Swapping the union will swap this field. 222a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 223a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 224a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid EnumOneofFieldGenerator:: 225a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateConstructorCode(io::Printer* printer) const { 226a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 227a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $classname$_default_oneof_instance_->$name$_ = $default$;\n"); 228a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 229a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 230a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// =================================================================== 231a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 232b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerRepeatedEnumFieldGenerator::RepeatedEnumFieldGenerator( 233b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* descriptor, const Options& options) 234b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer : FieldGenerator(options), descriptor_(descriptor) { 235a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetEnumVariables(descriptor, &variables_, options); 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleRepeatedEnumFieldGenerator::~RepeatedEnumFieldGenerator() {} 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedEnumFieldGenerator:: 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGeneratePrivateMembers(io::Printer* printer) const { 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "::google::protobuf::RepeatedField<int> $name$_;\n"); 244b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (descriptor_->is_packed() && 245b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer HasGeneratedMethods(descriptor_->file(), options_)) { 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "mutable int _$name$_cached_byte_size_;\n"); 248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedEnumFieldGenerator:: 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateAccessorDeclarations(io::Printer* printer) const { 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 254b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "$deprecated_attr$$type$ $name$(int index) const;\n" 255b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "$deprecated_attr$void set_$name$(int index, $type$ value);\n" 256b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "$deprecated_attr$void add_$name$($type$ value);\n"); 257d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville printer->Print(variables_, 258b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "$deprecated_attr$const ::google::protobuf::RepeatedField<int>& $name$() const;\n" 259b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "$deprecated_attr$::google::protobuf::RepeatedField<int>* mutable_$name$();\n"); 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedEnumFieldGenerator:: 263b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateInlineAccessorDefinitions(io::Printer* printer, 264b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer bool is_inline) const { 265b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map<string, string> variables(variables_); 266b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer variables["inline"] = is_inline ? "inline" : ""; 267b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables, 268b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "$inline$ $type$ $classname$::$name$(int index) const {\n" 269a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " // @@protoc_insertion_point(field_get:$full_name$)\n" 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " return static_cast< $type$ >($name$_.Get(index));\n" 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n" 272b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "$inline$ void $classname$::set_$name$(int index, $type$ value) {\n"); 273b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (!HasPreservingUnknownEnumSemantics(descriptor_->file())) { 274b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables, 275b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " assert($type$_IsValid(value));\n"); 276b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 277b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables, 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " $name$_.Set(index, value);\n" 279a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " // @@protoc_insertion_point(field_set:$full_name$)\n" 280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n" 281b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "$inline$ void $classname$::add_$name$($type$ value) {\n"); 282b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (!HasPreservingUnknownEnumSemantics(descriptor_->file())) { 283b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables, 284b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " assert($type$_IsValid(value));\n"); 285b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 286b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables, 287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " $name$_.Add(value);\n" 288a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " // @@protoc_insertion_point(field_add:$full_name$)\n" 289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n"); 290b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables, 291b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "$inline$ const ::google::protobuf::RepeatedField<int>&\n" 292d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "$classname$::$name$() const {\n" 293a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " // @@protoc_insertion_point(field_list:$full_name$)\n" 294d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville " return $name$_;\n" 295d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "}\n" 296b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "$inline$ ::google::protobuf::RepeatedField<int>*\n" 297d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "$classname$::mutable_$name$() {\n" 298a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " // @@protoc_insertion_point(field_mutable_list:$full_name$)\n" 299d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville " return &$name$_;\n" 300d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "}\n"); 301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedEnumFieldGenerator:: 304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateClearingCode(io::Printer* printer) const { 305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, "$name$_.Clear();\n"); 306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedEnumFieldGenerator:: 309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergingCode(io::Printer* printer) const { 310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, "$name$_.MergeFrom(from.$name$_);\n"); 311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedEnumFieldGenerator:: 314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSwappingCode(io::Printer* printer) const { 315b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables_, "$name$_.UnsafeArenaSwap(&other->$name$_);\n"); 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedEnumFieldGenerator:: 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateConstructorCode(io::Printer* printer) const { 320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Not needed for repeated fields. 321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedEnumFieldGenerator:: 324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergeFromCodedStream(io::Printer* printer) const { 325d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Don't use ReadRepeatedPrimitive here so that the enum can be validated. 326d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville printer->Print(variables_, 327d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "int value;\n" 328d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n" 329d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville " int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(\n" 330b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " input, &value)));\n"); 331b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (HasPreservingUnknownEnumSemantics(descriptor_->file())) { 332d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville printer->Print(variables_, 333b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "add_$name$(static_cast< $type$ >(value));\n"); 334a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 335b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables_, 336b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "if ($type$_IsValid(value)) {\n" 337b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " add_$name$(static_cast< $type$ >(value));\n"); 338b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (UseUnknownFieldSet(descriptor_->file(), options_)) { 339b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables_, 340b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "} else {\n" 341b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " mutable_unknown_fields()->AddVarint($number$, value);\n"); 342b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } else { 343b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print( 344b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "} else {\n" 345b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " unknown_fields_stream.WriteVarint32(tag);\n" 346b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " unknown_fields_stream.WriteVarint32(value);\n"); 347b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 348b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print("}\n"); 349d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 350d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville} 351d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 352d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savillevoid RepeatedEnumFieldGenerator:: 353d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleGenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const { 354b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (!descriptor_->is_packed()) { 355b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // This path is rarely executed, so we use a non-inlined implementation. 356b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (HasPreservingUnknownEnumSemantics(descriptor_->file())) { 357b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables_, 358b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DO_((::google::protobuf::internal::" 359b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "WireFormatLite::ReadPackedEnumPreserveUnknowns(\n" 360b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " input,\n" 361b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " $number$,\n" 362b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " NULL,\n" 363b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " NULL,\n" 364b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " this->mutable_$name$())));\n"); 365b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } else if (UseUnknownFieldSet(descriptor_->file(), options_)) { 366b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables_, 367b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DO_((::google::protobuf::internal::WireFormat::ReadPackedEnumPreserveUnknowns(\n" 368b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " input,\n" 369b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " $number$,\n" 370b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " $type$_IsValid,\n" 371b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " mutable_unknown_fields(),\n" 372b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " this->mutable_$name$())));\n"); 373b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } else { 374b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables_, 375b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DO_((::google::protobuf::internal::" 376b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "WireFormatLite::ReadPackedEnumPreserveUnknowns(\n" 377b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " input,\n" 378b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " $number$,\n" 379b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " $type$_IsValid,\n" 380b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " &unknown_fields_stream,\n" 381b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " this->mutable_$name$())));\n"); 382b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 383d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } else { 384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "::google::protobuf::uint32 length;\n" 386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "DO_(input->ReadVarint32(&length));\n" 387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "::google::protobuf::io::CodedInputStream::Limit limit = " 388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "input->PushLimit(length);\n" 389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "while (input->BytesUntilLimit() > 0) {\n" 390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " int value;\n" 391d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville " DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n" 392d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville " int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(\n" 393b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " input, &value)));\n"); 394b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (HasPreservingUnknownEnumSemantics(descriptor_->file())) { 395b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables_, 396b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " add_$name$(static_cast< $type$ >(value));\n"); 397b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } else { 398b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables_, 399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " if ($type$_IsValid(value)) {\n" 400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " add_$name$(static_cast< $type$ >(value));\n" 401b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " } else {\n"); 402b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (UseUnknownFieldSet(descriptor_->file(), options_)) { 403b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables_, 404b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " mutable_unknown_fields()->AddVarint($number$, value);\n"); 405b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } else { 406b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables_, 407b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " unknown_fields_stream.WriteVarint32(tag);\n" 408b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " unknown_fields_stream.WriteVarint32(value);\n"); 409b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 410b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print( 411b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " }\n"); 412b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 413b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables_, 414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n" 415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "input->PopLimit(limit);\n"); 416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedEnumFieldGenerator:: 420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizes(io::Printer* printer) const { 421b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (descriptor_->is_packed()) { 422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Write the tag and the size. 423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "if (this->$name$_size() > 0) {\n" 425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " ::google::protobuf::internal::WireFormatLite::WriteTag(\n" 426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " $number$,\n" 427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED,\n" 428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " output);\n" 429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " output->WriteVarint32(_$name$_cached_byte_size_);\n" 430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n"); 431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for (int i = 0; i < this->$name$_size(); i++) {\n"); 434b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (descriptor_->is_packed()) { 435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " ::google::protobuf::internal::WireFormatLite::WriteEnumNoTag(\n" 437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " this->$name$(i), output);\n"); 438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " ::google::protobuf::internal::WireFormatLite::WriteEnum(\n" 441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " $number$, this->$name$(i), output);\n"); 442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print("}\n"); 444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedEnumFieldGenerator:: 447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { 448b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (descriptor_->is_packed()) { 449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Write the tag and the size. 450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "if (this->$name$_size() > 0) {\n" 452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " target = ::google::protobuf::internal::WireFormatLite::WriteTagToArray(\n" 453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " $number$,\n" 454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED,\n" 455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " target);\n" 456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray(" 457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " _$name$_cached_byte_size_, target);\n" 458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n"); 459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for (int i = 0; i < this->$name$_size(); i++) {\n"); 462b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (descriptor_->is_packed()) { 463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " target = ::google::protobuf::internal::WireFormatLite::WriteEnumNoTagToArray(\n" 465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " this->$name$(i), target);\n"); 466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(\n" 469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " $number$, this->$name$(i), target);\n"); 470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print("}\n"); 472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedEnumFieldGenerator:: 475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateByteSize(io::Printer* printer) const { 476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "{\n" 478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " int data_size = 0;\n"); 479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Indent(); 480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for (int i = 0; i < this->$name$_size(); i++) {\n" 482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " data_size += ::google::protobuf::internal::WireFormatLite::EnumSize(\n" 483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " this->$name$(i));\n" 484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n"); 485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 486b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (descriptor_->is_packed()) { 487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "if (data_size > 0) {\n" 489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " total_size += $tag_size$ +\n" 490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " ::google::protobuf::internal::WireFormatLite::Int32Size(data_size);\n" 491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n" 492a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n" 493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "_$name$_cached_byte_size_ = data_size;\n" 494a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "GOOGLE_SAFE_CONCURRENT_WRITES_END();\n" 495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "total_size += data_size;\n"); 496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "total_size += $tag_size$ * this->$name$_size() + data_size;\n"); 499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Outdent(); 501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print("}\n"); 502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace cpp 505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace compiler 506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace protobuf 507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace google 508