15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Protocol Buffers - Google's data interchange format 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2008 Google Inc. All rights reserved. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://code.google.com/p/protobuf/ 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Redistribution and use in source and binary forms, with or without 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modification, are permitted provided that the following conditions are 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// met: 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Redistributions of source code must retain the above copyright 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notice, this list of conditions and the following disclaimer. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Redistributions in binary form must reproduce the above 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// copyright notice, this list of conditions and the following disclaimer 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the documentation and/or other materials provided with the 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distribution. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Neither the name of Google Inc. nor the names of its 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contributors may be used to endorse or promote products derived from 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this software without specific prior written permission. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: kenton@google.com (Kenton Varda) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: jonp@google.com (Jon Perlow) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Based on original Protocol Buffers design by 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sanjay Ghemawat, Jeff Dean, and others. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/compiler/java/java_string_field.h> 40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <google/protobuf/compiler/java/java_doc_comment.h> 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/stubs/common.h> 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/compiler/java/java_helpers.h> 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/io/printer.h> 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/wire_format.h> 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/stubs/strutil.h> 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace google { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protobuf { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace compiler { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace java { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using internal::WireFormat; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using internal::WireFormatLite; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetPrimitiveVariables(const FieldDescriptor* descriptor, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int messageBitIndex, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int builderBitIndex, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map<string, string>* variables) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["name"] = 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UnderscoresToCamelCase(descriptor); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["capitalized_name"] = 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UnderscoresToCapitalizedCamelCase(descriptor); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["constant_name"] = FieldConstantName(descriptor); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["number"] = SimpleItoa(descriptor->number()); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["empty_list"] = "com.google.protobuf.LazyStringArrayList.EMPTY"; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["default"] = DefaultValue(descriptor); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["default_init"] = ("= " + DefaultValue(descriptor)); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["capitalized_type"] = "String"; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["tag"] = SimpleItoa(WireFormat::MakeTag(descriptor)); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["tag_size"] = SimpleItoa( 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WireFormat::TagSize(descriptor->number(), GetType(descriptor))); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["null_check"] = 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if (value == null) {\n" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " throw new NullPointerException();\n" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }\n"; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by the proto compiler 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["deprecation"] = descriptor->options().deprecated() 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ? "@java.lang.Deprecated " : ""; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["on_changed"] = 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasDescriptorMethods(descriptor->containing_type()) ? "onChanged();" : ""; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For singular messages and builders, one bit is used for the hasField bit. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex); 89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch (*variables)["set_has_field_bit_message"] = GenerateSetBit(messageBitIndex); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["get_has_field_bit_builder"] = GenerateGetBit(builderBitIndex); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["set_has_field_bit_builder"] = GenerateSetBit(builderBitIndex); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["clear_has_field_bit_builder"] = 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateClearBit(builderBitIndex); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For repated builders, one bit is used for whether the array is immutable. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["get_mutable_bit_builder"] = GenerateGetBit(builderBitIndex); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["set_mutable_bit_builder"] = GenerateSetBit(builderBitIndex); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["clear_mutable_bit_builder"] = GenerateClearBit(builderBitIndex); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // For repeated fields, one bit is used for whether the array is immutable 102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // in the parsing constructor. 103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch (*variables)["get_mutable_bit_parser"] = 104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GenerateGetBitMutableLocal(builderBitIndex); 105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch (*variables)["set_mutable_bit_parser"] = 106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GenerateSetBitMutableLocal(builderBitIndex); 107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["get_has_field_bit_from_local"] = 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateGetBitFromLocal(builderBitIndex); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["set_has_field_bit_to_local"] = 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateSetBitToLocal(messageBitIndex); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// =================================================================== 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringFieldGenerator:: 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringFieldGenerator(const FieldDescriptor* descriptor, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int messageBitIndex, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int builderBitIndex) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : descriptor_(descriptor), messageBitIndex_(messageBitIndex), 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) builderBitIndex_(builderBitIndex) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &variables_); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringFieldGenerator::~StringFieldGenerator() {} 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int StringFieldGenerator::GetNumBitsForMessage() const { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int StringFieldGenerator::GetNumBitsForBuilder() const { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A note about how strings are handled. This code used to just store a String 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the Message. This had two issues: 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1. It wouldn't roundtrip byte arrays that were not vaid UTF-8 encoded 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// strings, but rather fields that were raw bytes incorrectly marked 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as strings in the proto file. This is common because in the proto1 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// syntax, string was the way to indicate bytes and C++ engineers can 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// easily make this mistake without affecting the C++ API. By converting to 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// strings immediately, some java code might corrupt these byte arrays as 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it passes through a java server even if the field was never accessed by 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// application code. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2. There's a performance hit to converting between bytes and strings and 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it many cases, the field is never even read by the application code. This 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// avoids unnecessary conversions in the common use cases. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// So now, the field for String is maintained as an Object reference which can 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// either store a String or a ByteString. The code uses an instanceof check 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to see which one it has and converts to the other one if needed. It remembers 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the last value requested (in a thread safe manner) as this is most likely 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the one needed next. The thread safety is such that if two threads both 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// convert the field because the changes made by each thread were not visible to 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the other, they may cause a conversion to happen more times than would 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// otherwise be necessary. This was deemed better than adding synchronization 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// overhead. It will not cause any corruption issues or affect the behavior of 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the API. The instanceof check is also highly optimized in the JVM and we 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// decided it was better to reduce the memory overhead by not having two 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// separate fields but rather use dynamic type checking. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For single fields, the logic for this is done inside the generated code. For 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// repeated fields, the logic is done in LazyStringArrayList and 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UnmodifiableLazyStringList. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StringFieldGenerator:: 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateInterfaceMembers(io::Printer* printer) const { 172ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 173ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch printer->Print(variables_, 174ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "$deprecation$boolean has$capitalized_name$();\n"); 175ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$java.lang.String get$capitalized_name$();\n"); 178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch printer->Print(variables_, 180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "$deprecation$com.google.protobuf.ByteString\n" 181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " get$capitalized_name$Bytes();\n"); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StringFieldGenerator:: 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateMembers(io::Printer* printer) const { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 187ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "private java.lang.Object $name$_;\n"); 188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch printer->Print(variables_, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public boolean has$capitalized_name$() {\n" 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $get_has_field_bit_message$;\n" 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public java.lang.String get$capitalized_name$() {\n" 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " java.lang.Object ref = $name$_;\n" 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if (ref instanceof java.lang.String) {\n" 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return (java.lang.String) ref;\n" 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " } else {\n" 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " com.google.protobuf.ByteString bs = \n" 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " (com.google.protobuf.ByteString) ref;\n" 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " java.lang.String s = bs.toStringUtf8();\n" 204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " if (bs.isValidUtf8()) {\n" 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_ = s;\n" 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }\n" 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return s;\n" 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }\n" 209ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "}\n"); 210ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 211ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch printer->Print(variables_, 212ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "$deprecation$public com.google.protobuf.ByteString\n" 213ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " get$capitalized_name$Bytes() {\n" 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " java.lang.Object ref = $name$_;\n" 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if (ref instanceof java.lang.String) {\n" 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " com.google.protobuf.ByteString b = \n" 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " com.google.protobuf.ByteString.copyFromUtf8(\n" 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " (java.lang.String) ref);\n" 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_ = b;\n" 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return b;\n" 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " } else {\n" 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return (com.google.protobuf.ByteString) ref;\n" 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }\n" 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StringFieldGenerator:: 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateBuilderMembers(io::Printer* printer) const { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 230ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "private java.lang.Object $name$_ $default_init$;\n"); 231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 232ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch printer->Print(variables_, 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public boolean has$capitalized_name$() {\n" 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $get_has_field_bit_builder$;\n" 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 237ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public java.lang.String get$capitalized_name$() {\n" 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " java.lang.Object ref = $name$_;\n" 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if (!(ref instanceof java.lang.String)) {\n" 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " java.lang.String s = ((com.google.protobuf.ByteString) ref)\n" 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " .toStringUtf8();\n" 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_ = s;\n" 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return s;\n" 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " } else {\n" 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return (java.lang.String) ref;\n" 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }\n" 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 251ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 252ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch printer->Print(variables_, 253ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "$deprecation$public com.google.protobuf.ByteString\n" 254ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " get$capitalized_name$Bytes() {\n" 255ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " java.lang.Object ref = $name$_;\n" 256ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " if (ref instanceof String) {\n" 257ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " com.google.protobuf.ByteString b = \n" 258ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " com.google.protobuf.ByteString.copyFromUtf8(\n" 259ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " (java.lang.String) ref);\n" 260ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " $name$_ = b;\n" 261ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " return b;\n" 262ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " } else {\n" 263ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " return (com.google.protobuf.ByteString) ref;\n" 264ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " }\n" 265ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "}\n"); 266ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 267ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public Builder set$capitalized_name$(\n" 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " java.lang.String value) {\n" 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$null_check$" 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $set_has_field_bit_builder$;\n" 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_ = value;\n" 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $on_changed$\n" 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return this;\n" 276ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "}\n"); 277ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 278ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch printer->Print(variables_, 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public Builder clear$capitalized_name$() {\n" 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $clear_has_field_bit_builder$;\n"); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The default value is not a simple literal so we want to avoid executing 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it multiple times. Instead, get the default out of the default instance. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_ = getDefaultInstance().get$capitalized_name$();\n"); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $on_changed$\n" 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return this;\n" 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 290ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 292ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "$deprecation$public Builder set$capitalized_name$Bytes(\n" 293ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " com.google.protobuf.ByteString value) {\n" 294ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "$null_check$" 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $set_has_field_bit_builder$;\n" 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_ = value;\n" 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $on_changed$\n" 298ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " return this;\n" 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StringFieldGenerator:: 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateFieldBuilderInitializationCode(io::Printer* printer) const { 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // noop for primitives 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StringFieldGenerator:: 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateInitializationCode(io::Printer* printer) const { 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, "$name$_ = $default$;\n"); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StringFieldGenerator:: 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateBuilderClearCode(io::Printer* printer) const { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$_ = $default$;\n" 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$clear_has_field_bit_builder$;\n"); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StringFieldGenerator:: 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateMergingCode(io::Printer* printer) const { 321ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Allow a slight breach of abstraction here in order to avoid forcing 322ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // all string fields to Strings when copying fields from a Message. 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if (other.has$capitalized_name$()) {\n" 325ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " $set_has_field_bit_builder$;\n" 326ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " $name$_ = other.$name$_;\n" 327ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " $on_changed$\n" 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StringFieldGenerator:: 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateBuildingCode(io::Printer* printer) const { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if ($get_has_field_bit_from_local$) {\n" 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $set_has_field_bit_to_local$;\n" 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n" 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "result.$name$_ = $name$_;\n"); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StringFieldGenerator:: 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateParsingCode(io::Printer* printer) const { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 343ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "$set_has_field_bit_message$;\n" 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$_ = input.readBytes();\n"); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StringFieldGenerator:: 348ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochGenerateParsingDoneCode(io::Printer* printer) const { 349ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // noop for strings. 350ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 351ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 352ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid StringFieldGenerator:: 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSerializationCode(io::Printer* printer) const { 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if ($get_has_field_bit_message$) {\n" 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " output.writeBytes($number$, get$capitalized_name$Bytes());\n" 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StringFieldGenerator:: 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSerializedSizeCode(io::Printer* printer) const { 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if ($get_has_field_bit_message$) {\n" 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " size += com.google.protobuf.CodedOutputStream\n" 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " .computeBytesSize($number$, get$capitalized_name$Bytes());\n" 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StringFieldGenerator:: 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateEqualsCode(io::Printer* printer) const { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "result = result && get$capitalized_name$()\n" 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " .equals(other.get$capitalized_name$());\n"); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StringFieldGenerator:: 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateHashCode(io::Printer* printer) const { 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "hash = (37 * hash) + $constant_name$;\n"); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "hash = (53 * hash) + get$capitalized_name$().hashCode();\n"); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string StringFieldGenerator::GetBoxedType() const { 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "java.lang.String"; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// =================================================================== 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedStringFieldGenerator:: 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedStringFieldGenerator(const FieldDescriptor* descriptor, 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int messageBitIndex, 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int builderBitIndex) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : descriptor_(descriptor), messageBitIndex_(messageBitIndex), 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) builderBitIndex_(builderBitIndex) { 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex, 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &variables_); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedStringFieldGenerator::~RepeatedStringFieldGenerator() {} 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RepeatedStringFieldGenerator::GetNumBitsForMessage() const { 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RepeatedStringFieldGenerator::GetNumBitsForBuilder() const { 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedStringFieldGenerator:: 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateInterfaceMembers(io::Printer* printer) const { 413ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$java.util.List<java.lang.String>\n" 416ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "get$capitalized_name$List();\n"); 417ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 418ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch printer->Print(variables_, 419ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "$deprecation$int get$capitalized_name$Count();\n"); 420ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 421ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch printer->Print(variables_, 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$java.lang.String get$capitalized_name$(int index);\n"); 423ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 424ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch printer->Print(variables_, 425ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "$deprecation$com.google.protobuf.ByteString\n" 426ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " get$capitalized_name$Bytes(int index);\n"); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedStringFieldGenerator:: 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateMembers(io::Printer* printer) const { 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 433ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "private com.google.protobuf.LazyStringList $name$_;\n"); 434ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 435ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch printer->Print(variables_, 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public java.util.List<java.lang.String>\n" 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " get$capitalized_name$List() {\n" 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $name$_;\n" // note: unmodifiable list 439ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "}\n"); 440ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 441ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch printer->Print(variables_, 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public int get$capitalized_name$Count() {\n" 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $name$_.size();\n" 444ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "}\n"); 445ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 446ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch printer->Print(variables_, 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public java.lang.String get$capitalized_name$(int index) {\n" 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $name$_.get(index);\n" 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 450ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 451ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch printer->Print(variables_, 452ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "$deprecation$public com.google.protobuf.ByteString\n" 453ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " get$capitalized_name$Bytes(int index) {\n" 454ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " return $name$_.getByteString(index);\n" 455ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "}\n"); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (descriptor_->options().packed() && 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasGeneratedMethods(descriptor_->containing_type())) { 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "private int $name$MemoizedSerializedSize = -1;\n"); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedStringFieldGenerator:: 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateBuilderMembers(io::Printer* printer) const { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // One field is the list and the bit field keeps track of whether the 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // list is immutable. If it's immutable, the invariant is that it must 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // either an instance of Collections.emptyList() or it's an ArrayList 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // wrapped in a Collections.unmodifiableList() wrapper and nobody else has 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a refererence to the underlying ArrayList. This invariant allows us to 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // share instances of lists between protocol buffers avoiding expensive 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // memory allocations. Note, immutable is a strong guarantee here -- not 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // just that the list cannot be modified via the reference but that the 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // list can never be modified. 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "private com.google.protobuf.LazyStringList $name$_ = $empty_list$;\n"); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "private void ensure$capitalized_name$IsMutable() {\n" 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if (!$get_mutable_bit_builder$) {\n" 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_ = new com.google.protobuf.LazyStringArrayList($name$_);\n" 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $set_mutable_bit_builder$;\n" 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }\n" 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: We return an unmodifiable list because otherwise the caller 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // could hold on to the returned list and modify it after the message 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // has been built, thus mutating the message which is supposed to be 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // immutable. 490ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public java.util.List<java.lang.String>\n" 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " get$capitalized_name$List() {\n" 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return java.util.Collections.unmodifiableList($name$_);\n" 495ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "}\n"); 496ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 497ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch printer->Print(variables_, 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public int get$capitalized_name$Count() {\n" 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $name$_.size();\n" 500ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "}\n"); 501ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 502ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch printer->Print(variables_, 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public java.lang.String get$capitalized_name$(int index) {\n" 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $name$_.get(index);\n" 505ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "}\n"); 506ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 507ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch printer->Print(variables_, 508ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "$deprecation$public com.google.protobuf.ByteString\n" 509ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " get$capitalized_name$Bytes(int index) {\n" 510ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " return $name$_.getByteString(index);\n" 511ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "}\n"); 512ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 513ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch printer->Print(variables_, 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public Builder set$capitalized_name$(\n" 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " int index, java.lang.String value) {\n" 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$null_check$" 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ensure$capitalized_name$IsMutable();\n" 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_.set(index, value);\n" 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $on_changed$\n" 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return this;\n" 521ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "}\n"); 522ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 523ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch printer->Print(variables_, 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public Builder add$capitalized_name$(\n" 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " java.lang.String value) {\n" 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$null_check$" 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ensure$capitalized_name$IsMutable();\n" 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_.add(value);\n" 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $on_changed$\n" 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return this;\n" 531ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "}\n"); 532ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 533ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch printer->Print(variables_, 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public Builder addAll$capitalized_name$(\n" 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " java.lang.Iterable<java.lang.String> values) {\n" 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ensure$capitalized_name$IsMutable();\n" 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " super.addAll(values, $name$_);\n" 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $on_changed$\n" 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return this;\n" 540ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "}\n"); 541ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 542ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch printer->Print(variables_, 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public Builder clear$capitalized_name$() {\n" 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_ = $empty_list$;\n" 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $clear_mutable_bit_builder$;\n" 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $on_changed$\n" 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return this;\n" 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 550ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WriteFieldDocComment(printer, descriptor_); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 552ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "$deprecation$public Builder add$capitalized_name$Bytes(\n" 553ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " com.google.protobuf.ByteString value) {\n" 554ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "$null_check$" 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ensure$capitalized_name$IsMutable();\n" 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_.add(value);\n" 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $on_changed$\n" 558ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " return this;\n" 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedStringFieldGenerator:: 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateFieldBuilderInitializationCode(io::Printer* printer) const { 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // noop for primitives 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedStringFieldGenerator:: 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateInitializationCode(io::Printer* printer) const { 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, "$name$_ = $empty_list$;\n"); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedStringFieldGenerator:: 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateBuilderClearCode(io::Printer* printer) const { 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$_ = $empty_list$;\n" 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$clear_mutable_bit_builder$;\n"); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedStringFieldGenerator:: 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateMergingCode(io::Printer* printer) const { 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The code below does two optimizations: 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1. If the other list is empty, there's nothing to do. This ensures we 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // don't allocate a new array if we already have an immutable one. 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2. If the other list is non-empty and our current list is empty, we can 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reuse the other list which is guaranteed to be immutable. 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if (!other.$name$_.isEmpty()) {\n" 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if ($name$_.isEmpty()) {\n" 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_ = other.$name$_;\n" 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $clear_mutable_bit_builder$;\n" 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " } else {\n" 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ensure$capitalized_name$IsMutable();\n" 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_.addAll(other.$name$_);\n" 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }\n" 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $on_changed$\n" 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedStringFieldGenerator:: 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateBuildingCode(io::Printer* printer) const { 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The code below ensures that the result has an immutable list. If our 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // list is immutable, we can just reuse it. If not, we make it immutable. 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if ($get_mutable_bit_builder$) {\n" 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_ = new com.google.protobuf.UnmodifiableLazyStringList(\n" 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_);\n" 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $clear_mutable_bit_builder$;\n" 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n" 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "result.$name$_ = $name$_;\n"); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedStringFieldGenerator:: 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateParsingCode(io::Printer* printer) const { 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 616ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "if (!$get_mutable_bit_parser$) {\n" 617ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " $name$_ = new com.google.protobuf.LazyStringArrayList();\n" 618ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " $set_mutable_bit_parser$;\n" 619ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "}\n" 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$_.add(input.readBytes());\n"); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedStringFieldGenerator:: 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateParsingCodeFromPacked(io::Printer* printer) const { 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "int length = input.readRawVarint32();\n" 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "int limit = input.pushLimit(length);\n" 628ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "if (!$get_mutable_bit_parser$ && input.getBytesUntilLimit() > 0) {\n" 629ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " $name$_ = new com.google.protobuf.LazyStringArrayList();\n" 630ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " $set_mutable_bit_parser$;\n" 631ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "}\n" 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "while (input.getBytesUntilLimit() > 0) {\n" 633ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " $name$.add(input.read$capitalized_type$());\n" 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n" 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "input.popLimit(limit);\n"); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedStringFieldGenerator:: 639ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochGenerateParsingDoneCode(io::Printer* printer) const { 640ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch printer->Print(variables_, 641ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "if ($get_mutable_bit_parser$) {\n" 642ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " $name$_ = new com.google.protobuf.UnmodifiableLazyStringList($name$_);\n" 643ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "}\n"); 644ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 645ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 646ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid RepeatedStringFieldGenerator:: 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSerializationCode(io::Printer* printer) const { 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (descriptor_->options().packed()) { 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if (get$capitalized_name$List().size() > 0) {\n" 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " output.writeRawVarint32($tag$);\n" 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " output.writeRawVarint32($name$MemoizedSerializedSize);\n" 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n" 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "for (int i = 0; i < $name$_.size(); i++) {\n" 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " output.write$capitalized_type$NoTag($name$_.get(i));\n" 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "for (int i = 0; i < $name$_.size(); i++) {\n" 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " output.writeBytes($number$, $name$_.getByteString(i));\n" 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedStringFieldGenerator:: 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSerializedSizeCode(io::Printer* printer) const { 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{\n" 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " int dataSize = 0;\n"); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Indent(); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "for (int i = 0; i < $name$_.size(); i++) {\n" 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " dataSize += com.google.protobuf.CodedOutputStream\n" 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " .computeBytesSizeNoTag($name$_.getByteString(i));\n" 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print( 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "size += dataSize;\n"); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (descriptor_->options().packed()) { 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if (!get$capitalized_name$List().isEmpty()) {\n" 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " size += $tag_size$;\n" 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " size += com.google.protobuf.CodedOutputStream\n" 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " .computeInt32SizeNoTag(dataSize);\n" 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "size += $tag_size$ * get$capitalized_name$List().size();\n"); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cache the data size for packed fields. 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (descriptor_->options().packed()) { 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$MemoizedSerializedSize = dataSize;\n"); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Outdent(); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print("}\n"); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedStringFieldGenerator:: 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateEqualsCode(io::Printer* printer) const { 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "result = result && get$capitalized_name$List()\n" 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " .equals(other.get$capitalized_name$List());\n"); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedStringFieldGenerator:: 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateHashCode(io::Printer* printer) const { 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if (get$capitalized_name$Count() > 0) {\n" 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " hash = (37 * hash) + $constant_name$;\n" 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " hash = (53 * hash) + get$capitalized_name$List().hashCode();\n" 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string RepeatedStringFieldGenerator::GetBoxedType() const { 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "String"; 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace java 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace compiler 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace protobuf 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace google 727