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