1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc.  All rights reserved.
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/
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_string_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/descriptor.pb.h>
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/strutil.h>
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace compiler {
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace cpp {
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace {
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid SetStringVariables(const FieldDescriptor* descriptor,
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                        map<string, string>* variables) {
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  SetCommonFieldVariables(descriptor, variables);
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  (*variables)["default"] =
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\"" + CEscape(descriptor->default_value_string()) + "\"";
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  (*variables)["pointer_type"] =
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      descriptor->type() == FieldDescriptor::TYPE_BYTES ? "void" : "char";
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleStringFieldGenerator::
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleStringFieldGenerator(const FieldDescriptor* descriptor)
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  : descriptor_(descriptor) {
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  SetStringVariables(descriptor, &variables_);
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleStringFieldGenerator::~StringFieldGenerator() {}
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid StringFieldGenerator::
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGeneratePrivateMembers(io::Printer* printer) const {
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "::std::string* $name$_;\n"
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "static const ::std::string _default_$name$_;\n");
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid StringFieldGenerator::
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateAccessorDeclarations(io::Printer* printer) const {
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // If we're using StringFieldGenerator for a field with a ctype, it's
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // because that ctype isn't actually implemented.  In particular, this is
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // true of ctype=CORD and ctype=STRING_PIECE in the open source release.
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // We aren't releasing Cord because it has too many Google-specific
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // dependencies and we aren't releasing StringPiece because it's hardly
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // useful outside of Google and because it would get confusing to have
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // multiple instances of the StringPiece class in different libraries (PCRE
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // already includes it for their C++ bindings, which came from Google).
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // In any case, we make all the accessors private while still actually
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // using a string to represent the field internally.  This way, we can
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // guarantee that if we do ever implement the ctype, it won't break any
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // existing users who might be -- for whatever reason -- already using .proto
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // files that applied the ctype.  The field can still be accessed via the
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // reflection interface since the reflection interface is independent of
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // the string's underlying representation.
94d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (descriptor_->options().ctype() != FieldOptions::STRING) {
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Outdent();
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      " private:\n"
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  // Hidden due to unknown ctype option.\n");
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Indent();
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline const ::std::string& $name$() const$deprecation$;\n"
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline void set_$name$(const ::std::string& value)$deprecation$;\n"
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline void set_$name$(const char* value)$deprecation$;\n"
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline void set_$name$(const $pointer_type$* value, size_t size)"
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 "$deprecation$;\n"
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline ::std::string* mutable_$name$()$deprecation$;\n");
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
110d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (descriptor_->options().ctype() != FieldOptions::STRING) {
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Outdent();
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(" public:\n");
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Indent();
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid StringFieldGenerator::
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateInlineAccessorDefinitions(io::Printer* printer) const {
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline const ::std::string& $classname$::$name$() const {\n"
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return *$name$_;\n"
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline void $classname$::set_$name$(const ::std::string& value) {\n"
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  _set_bit($index$);\n"
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  if ($name$_ == &_default_$name$_) {\n"
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    $name$_ = new ::std::string;\n"
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  }\n"
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  $name$_->assign(value);\n"
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline void $classname$::set_$name$(const char* value) {\n"
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  _set_bit($index$);\n"
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  if ($name$_ == &_default_$name$_) {\n"
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    $name$_ = new ::std::string;\n"
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  }\n"
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  $name$_->assign(value);\n"
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline "
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "void $classname$::set_$name$(const $pointer_type$* value, size_t size) {\n"
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  _set_bit($index$);\n"
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  if ($name$_ == &_default_$name$_) {\n"
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    $name$_ = new ::std::string;\n"
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  }\n"
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  $name$_->assign(reinterpret_cast<const char*>(value), size);\n"
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline ::std::string* $classname$::mutable_$name$() {\n"
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  _set_bit($index$);\n"
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  if ($name$_ == &_default_$name$_) {\n");
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (descriptor_->default_value_string().empty()) {
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    $name$_ = new ::std::string;\n");
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    $name$_ = new ::std::string(_default_$name$_);\n");
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  }\n"
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return $name$_;\n"
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid StringFieldGenerator::
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateNonInlineAccessorDefinitions(io::Printer* printer) const {
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (descriptor_->default_value_string().empty()) {
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "const ::std::string $classname$::_default_$name$_;\n");
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "const ::std::string $classname$::_default_$name$_($default$);\n");
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid StringFieldGenerator::
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateClearingCode(io::Printer* printer) const {
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (descriptor_->default_value_string().empty()) {
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "if ($name$_ != &_default_$name$_) {\n"
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  $name$_->clear();\n"
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "}\n");
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "if ($name$_ != &_default_$name$_) {\n"
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  $name$_->assign(_default_$name$_);\n"
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "}\n");
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid StringFieldGenerator::
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergingCode(io::Printer* printer) const {
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "set_$name$(from.$name$());\n");
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid StringFieldGenerator::
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSwappingCode(io::Printer* printer) const {
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "std::swap($name$_, other->$name$_);\n");
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid StringFieldGenerator::
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateConstructorCode(io::Printer* printer) const {
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "$name$_ = const_cast< ::std::string*>(&_default_$name$_);\n");
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid StringFieldGenerator::
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateDestructorCode(io::Printer* printer) const {
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "if ($name$_ != &_default_$name$_) {\n"
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  delete $name$_;\n"
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid StringFieldGenerator::
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergeFromCodedStream(io::Printer* printer) const {
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "DO_(::google::protobuf::internal::WireFormatLite::Read$declared_type$(\n"
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "      input, this->mutable_$name$()));\n");
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (HasUtf8Verification(descriptor_->file()) &&
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      descriptor_->type() == FieldDescriptor::TYPE_STRING) {
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "::google::protobuf::internal::WireFormat::VerifyUTF8String(\n"
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  this->$name$().data(), this->$name$().length(),\n"
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  ::google::protobuf::internal::WireFormat::PARSE);\n");
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid StringFieldGenerator::
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizes(io::Printer* printer) const {
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (HasUtf8Verification(descriptor_->file()) &&
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      descriptor_->type() == FieldDescriptor::TYPE_STRING) {
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "::google::protobuf::internal::WireFormat::VerifyUTF8String(\n"
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  this->$name$().data(), this->$name$().length(),\n"
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  ::google::protobuf::internal::WireFormat::SERIALIZE);\n");
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "::google::protobuf::internal::WireFormatLite::Write$declared_type$(\n"
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  $number$, this->$name$(), output);\n");
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid StringFieldGenerator::
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (HasUtf8Verification(descriptor_->file()) &&
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      descriptor_->type() == FieldDescriptor::TYPE_STRING) {
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "::google::protobuf::internal::WireFormat::VerifyUTF8String(\n"
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  this->$name$().data(), this->$name$().length(),\n"
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  ::google::protobuf::internal::WireFormat::SERIALIZE);\n");
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "target =\n"
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  ::google::protobuf::internal::WireFormatLite::Write$declared_type$ToArray(\n"
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    $number$, this->$name$(), target);\n");
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid StringFieldGenerator::
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateByteSize(io::Printer* printer) const {
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "total_size += $tag_size$ +\n"
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  ::google::protobuf::internal::WireFormatLite::$declared_type$Size(\n"
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    this->$name$());\n");
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleRepeatedStringFieldGenerator::
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleRepeatedStringFieldGenerator(const FieldDescriptor* descriptor)
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  : descriptor_(descriptor) {
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  SetStringVariables(descriptor, &variables_);
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleRepeatedStringFieldGenerator::~RepeatedStringFieldGenerator() {}
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedStringFieldGenerator::
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGeneratePrivateMembers(io::Printer* printer) const {
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "::google::protobuf::RepeatedPtrField< ::std::string> $name$_;\n");
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedStringFieldGenerator::
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateAccessorDeclarations(io::Printer* printer) const {
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // See comment above about unknown ctypes.
281d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (descriptor_->options().ctype() != FieldOptions::STRING) {
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Outdent();
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      " private:\n"
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  // Hidden due to unknown ctype option.\n");
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Indent();
287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline const ::std::string& $name$(int index) const$deprecation$;\n"
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline ::std::string* mutable_$name$(int index)$deprecation$;\n"
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline void set_$name$(int index, const ::std::string& value)$deprecation$;\n"
293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline void set_$name$(int index, const char* value)$deprecation$;\n"
294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline "
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "void set_$name$(int index, const $pointer_type$* value, size_t size)"
296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 "$deprecation$;\n"
297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline ::std::string* add_$name$()$deprecation$;\n"
298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline void add_$name$(const ::std::string& value)$deprecation$;\n"
299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline void add_$name$(const char* value)$deprecation$;\n"
300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline void add_$name$(const $pointer_type$* value, size_t size)"
301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 "$deprecation$;\n");
302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
303d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  printer->Print(variables_,
304d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "inline const ::google::protobuf::RepeatedPtrField< ::std::string>& $name$() const"
305d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                 "$deprecation$;\n"
306d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "inline ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_$name$()"
307d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                 "$deprecation$;\n");
308d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
309d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (descriptor_->options().ctype() != FieldOptions::STRING) {
310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Outdent();
311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(" public:\n");
312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Indent();
313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedStringFieldGenerator::
317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateInlineAccessorDefinitions(io::Printer* printer) const {
318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline const ::std::string& $classname$::$name$(int index) const {\n"
320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return $name$_.Get(index);\n"
321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline ::std::string* $classname$::mutable_$name$(int index) {\n"
323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return $name$_.Mutable(index);\n"
324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline void $classname$::set_$name$(int index, const ::std::string& value) {\n"
326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  $name$_.Mutable(index)->assign(value);\n"
327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline void $classname$::set_$name$(int index, const char* value) {\n"
329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  $name$_.Mutable(index)->assign(value);\n"
330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline void "
332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "$classname$::set_$name$"
333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "(int index, const $pointer_type$* value, size_t size) {\n"
334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  $name$_.Mutable(index)->assign(\n"
335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    reinterpret_cast<const char*>(value), size);\n"
336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline ::std::string* $classname$::add_$name$() {\n"
338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return $name$_.Add();\n"
339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline void $classname$::add_$name$(const ::std::string& value) {\n"
341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  $name$_.Add()->assign(value);\n"
342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline void $classname$::add_$name$(const char* value) {\n"
344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  $name$_.Add()->assign(value);\n"
345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline void "
347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "$classname$::add_$name$(const $pointer_type$* value, size_t size) {\n"
348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  $name$_.Add()->assign(reinterpret_cast<const char*>(value), size);\n"
349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
350d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  printer->Print(variables_,
351d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "inline const ::google::protobuf::RepeatedPtrField< ::std::string>&\n"
352d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "$classname$::$name$() const {\n"
353d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  return $name$_;\n"
354d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "}\n"
355d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "inline ::google::protobuf::RepeatedPtrField< ::std::string>*\n"
356d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "$classname$::mutable_$name$() {\n"
357d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  return &$name$_;\n"
358d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "}\n");
359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedStringFieldGenerator::
362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateClearingCode(io::Printer* printer) const {
363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "$name$_.Clear();\n");
364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedStringFieldGenerator::
367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergingCode(io::Printer* printer) const {
368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "$name$_.MergeFrom(from.$name$_);\n");
369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedStringFieldGenerator::
372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSwappingCode(io::Printer* printer) const {
373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "$name$_.Swap(&other->$name$_);\n");
374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedStringFieldGenerator::
377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateConstructorCode(io::Printer* printer) const {
378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Not needed for repeated fields.
379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedStringFieldGenerator::
382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergeFromCodedStream(io::Printer* printer) const {
383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "DO_(::google::protobuf::internal::WireFormatLite::Read$declared_type$(\n"
385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "      input, this->add_$name$()));\n");
386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (HasUtf8Verification(descriptor_->file()) &&
387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      descriptor_->type() == FieldDescriptor::TYPE_STRING) {
388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "::google::protobuf::internal::WireFormat::VerifyUTF8String(\n"
390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  this->$name$(0).data(), this->$name$(0).length(),\n"
391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  ::google::protobuf::internal::WireFormat::PARSE);\n");
392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedStringFieldGenerator::
396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizes(io::Printer* printer) const {
397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "for (int i = 0; i < this->$name$_size(); i++) {\n");
399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (HasUtf8Verification(descriptor_->file()) &&
400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      descriptor_->type() == FieldDescriptor::TYPE_STRING) {
401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "::google::protobuf::internal::WireFormat::VerifyUTF8String(\n"
403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  this->$name$(i).data(), this->$name$(i).length(),\n"
404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  ::google::protobuf::internal::WireFormat::SERIALIZE);\n");
405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  ::google::protobuf::internal::WireFormatLite::Write$declared_type$(\n"
408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    $number$, this->$name$(i), output);\n"
409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedStringFieldGenerator::
413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "for (int i = 0; i < this->$name$_size(); i++) {\n");
416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (HasUtf8Verification(descriptor_->file()) &&
417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      descriptor_->type() == FieldDescriptor::TYPE_STRING) {
418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n"
420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    this->$name$(i).data(), this->$name$(i).length(),\n"
421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    ::google::protobuf::internal::WireFormat::SERIALIZE);\n");
422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  target = ::google::protobuf::internal::WireFormatLite::\n"
425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    Write$declared_type$ToArray($number$, this->$name$(i), target);\n"
426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedStringFieldGenerator::
430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateByteSize(io::Printer* printer) const {
431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "total_size += $tag_size$ * this->$name$_size();\n"
433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "for (int i = 0; i < this->$name$_size(); i++) {\n"
434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  total_size += ::google::protobuf::internal::WireFormatLite::$declared_type$Size(\n"
435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    this->$name$(i));\n"
436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace cpp
440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace compiler
441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
443