1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc. All rights reserved. 3afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson// https://developers.google.com/protocol-buffers/ 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met: 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions of source code must retain the above copyright 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer. 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions in binary form must reproduce the above 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution. 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Neither the name of Google Inc. nor the names of its 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission. 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda) 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Based on original Protocol Buffers design by 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Sanjay Ghemawat, Jeff Dean, and others. 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <map> 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string> 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 38b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/logging.h> 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h> 40a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/compiler/java/java_context.h> 41a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/compiler/java/java_doc_comment.h> 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/java/java_helpers.h> 43a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/compiler/java/java_name_resolver.h> 44a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/compiler/java/java_primitive_field.h> 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/io/printer.h> 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/wire_format.h> 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/strutil.h> 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google { 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace compiler { 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace java { 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing internal::WireFormat; 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing internal::WireFormatLite; 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace { 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid SetPrimitiveVariables(const FieldDescriptor* descriptor, 60a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int messageBitIndex, 61a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int builderBitIndex, 62a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldGeneratorInfo* info, 63a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ClassNameResolver* name_resolver, 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville map<string, string>* variables) { 65a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetCommonFieldVariables(descriptor, info, variables); 66a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (*variables)["type"] = PrimitiveTypeName(GetJavaType(descriptor)); 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (*variables)["boxed_type"] = BoxedPrimitiveTypeName(GetJavaType(descriptor)); 69a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["field_type"] = (*variables)["type"]; 70a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["field_list_type"] = "java.util.List<" + 71a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["boxed_type"] + ">"; 72a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["empty_list"] = "java.util.Collections.emptyList()"; 73a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["default"] = ImmutableDefaultValue(descriptor, name_resolver); 74a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["default_init"] = IsDefaultValueJavaDefault(descriptor) ? 75a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "" : ("= " + ImmutableDefaultValue(descriptor, name_resolver)); 76a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["capitalized_type"] = 77a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GetCapitalizedType(descriptor, /* immutable = */ true); 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (*variables)["tag"] = SimpleItoa(WireFormat::MakeTag(descriptor)); 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (*variables)["tag_size"] = SimpleItoa( 80d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville WireFormat::TagSize(descriptor->number(), GetType(descriptor))); 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (IsReferenceType(GetJavaType(descriptor))) { 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (*variables)["null_check"] = 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " if (value == null) {\n" 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " throw new NullPointerException();\n" 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }\n"; 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (*variables)["null_check"] = ""; 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 89a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported 90a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // by the proto compiler 91a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["deprecation"] = descriptor->options().deprecated() 92a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ? "@java.lang.Deprecated " : ""; 93d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville int fixed_size = FixedSize(GetType(descriptor)); 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (fixed_size != -1) { 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (*variables)["fixed_size"] = SimpleItoa(fixed_size); 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 97b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*variables)["on_changed"] = "onChanged();"; 98a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 99a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (SupportFieldPresence(descriptor->file())) { 100a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // For singular messages and builders, one bit is used for the hasField bit. 101a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex); 102a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["get_has_field_bit_builder"] = GenerateGetBit(builderBitIndex); 103a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 104a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Note that these have a trailing ";". 105a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["set_has_field_bit_message"] = 106a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GenerateSetBit(messageBitIndex) + ";"; 107a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["set_has_field_bit_builder"] = 108a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GenerateSetBit(builderBitIndex) + ";"; 109a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["clear_has_field_bit_builder"] = 110a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GenerateClearBit(builderBitIndex) + ";"; 111a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 112a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["is_field_present_message"] = GenerateGetBit(messageBitIndex); 113a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 114a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["set_has_field_bit_message"] = ""; 115a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["set_has_field_bit_builder"] = ""; 116a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["clear_has_field_bit_builder"] = ""; 117a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 118a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (descriptor->type() == FieldDescriptor::TYPE_BYTES) { 119a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["is_field_present_message"] = 120a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "!" + (*variables)["name"] + "_.isEmpty()"; 121a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 122a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["is_field_present_message"] = 123a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["name"] + "_ != " + (*variables)["default"]; 124a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 125a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 126a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 127a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // For repated builders, one bit is used for whether the array is immutable. 128a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["get_mutable_bit_builder"] = GenerateGetBit(builderBitIndex); 129a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["set_mutable_bit_builder"] = GenerateSetBit(builderBitIndex); 130a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["clear_mutable_bit_builder"] = GenerateClearBit(builderBitIndex); 131a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 132a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // For repeated fields, one bit is used for whether the array is immutable 133a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // in the parsing constructor. 134a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["get_mutable_bit_parser"] = 135a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GenerateGetBitMutableLocal(builderBitIndex); 136a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["set_mutable_bit_parser"] = 137a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GenerateSetBitMutableLocal(builderBitIndex); 138a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 139a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["get_has_field_bit_from_local"] = 140a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GenerateGetBitFromLocal(builderBitIndex); 141a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["set_has_field_bit_to_local"] = 142a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GenerateSetBitToLocal(messageBitIndex); 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 144a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 149a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutablePrimitiveFieldGenerator:: 150a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutablePrimitiveFieldGenerator(const FieldDescriptor* descriptor, 151a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int messageBitIndex, 152a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int builderBitIndex, 153a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Context* context) 154a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson : descriptor_(descriptor), messageBitIndex_(messageBitIndex), 155a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson builderBitIndex_(builderBitIndex), context_(context), 156a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson name_resolver_(context->GetNameResolver()) { 157a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex, 158a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson context->GetFieldGeneratorInfo(descriptor), 159a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson name_resolver_, &variables_); 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 162a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutablePrimitiveFieldGenerator::~ImmutablePrimitiveFieldGenerator() {} 163a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 164a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonint ImmutablePrimitiveFieldGenerator::GetNumBitsForMessage() const { 165a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return 1; 166a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 167a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 168a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonint ImmutablePrimitiveFieldGenerator::GetNumBitsForBuilder() const { 169a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return 1; 170a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 172a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator:: 173a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateInterfaceMembers(io::Printer* printer) const { 174a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (SupportFieldPresence(descriptor_->file())) { 175a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 176a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 177a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$boolean has$capitalized_name$();\n"); 178a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 179a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 180a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 181a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$$type$ get$capitalized_name$();\n"); 182a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 183a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 184a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator:: 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMembers(io::Printer* printer) const { 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 187a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "private $field_type$ $name$_;\n"); 188a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson PrintExtraFieldInfo(variables_, printer); 189a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (SupportFieldPresence(descriptor_->file())) { 190a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 191a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 192a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public boolean has$capitalized_name$() {\n" 193a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $get_has_field_bit_message$;\n" 194a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 195a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 196a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 197a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 198a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 199a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public $type$ get$capitalized_name$() {\n" 200a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $name$_;\n" 201a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 204a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator:: 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateBuilderMembers(io::Printer* printer) const { 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 207a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "private $field_type$ $name$_ $default_init$;\n"); 208a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 209a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (SupportFieldPresence(descriptor_->file())) { 210a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 211a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 212a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public boolean has$capitalized_name$() {\n" 213a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $get_has_field_bit_builder$;\n" 214a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 215a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 216a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 218a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 219a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public $type$ get$capitalized_name$() {\n" 220a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $name$_;\n" 221a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 222a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 223a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 224a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 225a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public Builder set$capitalized_name$($type$ value) {\n" 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "$null_check$" 227a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $set_has_field_bit_builder$\n" 228a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = value;\n" 229a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " return this;\n" 231a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 232a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 233a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 234a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 235a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public Builder clear$capitalized_name$() {\n" 236a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $clear_has_field_bit_builder$\n"); 237d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville JavaType type = GetJavaType(descriptor_); 238d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville if (type == JAVATYPE_STRING || type == JAVATYPE_BYTES) { 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The default value is not a simple literal so we want to avoid executing 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // it multiple times. Instead, get the default out of the default instance. 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 242a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = getDefaultInstance().get$capitalized_name$();\n"); 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 245a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = $default$;\n"); 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 248a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " return this;\n" 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n"); 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 253a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator:: 254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateFieldBuilderInitializationCode(io::Printer* printer) const { 255a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // noop for primitives 256a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 257a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 258a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator:: 259d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleGenerateInitializationCode(io::Printer* printer) const { 260a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, "$name$_ = $default$;\n"); 261d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville} 262d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 263a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator:: 264a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateBuilderClearCode(io::Printer* printer) const { 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 266a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$name$_ = $default$;\n" 267a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$clear_has_field_bit_builder$\n"); 268a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 269a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 270a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator:: 271a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateMergingCode(io::Printer* printer) const { 272a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (SupportFieldPresence(descriptor_->file())) { 273a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 274a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if (other.has$capitalized_name$()) {\n" 275a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " set$capitalized_name$(other.get$capitalized_name$());\n" 276a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 277a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 278a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 279a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if (other.get$capitalized_name$() != $default$) {\n" 280a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " set$capitalized_name$(other.get$capitalized_name$());\n" 281a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 282a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 285a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator:: 286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateBuildingCode(io::Printer* printer) const { 287a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (SupportFieldPresence(descriptor_->file())) { 288a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 289a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if ($get_has_field_bit_from_local$) {\n" 290a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $set_has_field_bit_to_local$;\n" 291a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 292a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 293a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 294a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "result.$name$_ = $name$_;\n"); 295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 297a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator:: 298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateParsingCode(io::Printer* printer) const { 299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 300a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$set_has_field_bit_message$\n" 301a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$name$_ = input.read$capitalized_type$();\n"); 302a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 303a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 304a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator:: 305a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateParsingDoneCode(io::Printer* printer) const { 306a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // noop for primitives. 307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 309a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator:: 310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializationCode(io::Printer* printer) const { 311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 312a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if ($is_field_present_message$) {\n" 313a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " output.write$capitalized_type$($number$, $name$_);\n" 314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n"); 315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 317a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator:: 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializedSizeCode(io::Printer* printer) const { 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 320a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if ($is_field_present_message$) {\n" 321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " size += com.google.protobuf.CodedOutputStream\n" 322a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " .compute$capitalized_type$Size($number$, $name$_);\n" 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n"); 324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 326a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator:: 327a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateEqualsCode(io::Printer* printer) const { 328a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson switch (GetJavaType(descriptor_)) { 329a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case JAVATYPE_INT: 330a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case JAVATYPE_LONG: 331a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case JAVATYPE_BOOLEAN: 332a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 333a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "result = result && (get$capitalized_name$()\n" 334a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " == other.get$capitalized_name$());\n"); 335a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 336a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 337a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case JAVATYPE_FLOAT: 338a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 339a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "result = result && (\n" 340a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " java.lang.Float.floatToIntBits(get$capitalized_name$())\n" 341a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " == java.lang.Float.floatToIntBits(\n" 342a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " other.get$capitalized_name$()));\n"); 343a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 344a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 345a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case JAVATYPE_DOUBLE: 346a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 347a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "result = result && (\n" 348a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " java.lang.Double.doubleToLongBits(get$capitalized_name$())\n" 349a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " == java.lang.Double.doubleToLongBits(\n" 350a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " other.get$capitalized_name$()));\n"); 351a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 352a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 353a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case JAVATYPE_STRING: 354a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case JAVATYPE_BYTES: 355a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 356a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "result = result && get$capitalized_name$()\n" 357a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " .equals(other.get$capitalized_name$());\n"); 358a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 359a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 360a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case JAVATYPE_ENUM: 361a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case JAVATYPE_MESSAGE: 362a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson default: 363a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_LOG(FATAL) << "Can't get here."; 364a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 365a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 366a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 367a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 368a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator:: 369a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateHashCode(io::Printer* printer) const { 370a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 371a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "hash = (37 * hash) + $constant_name$;\n"); 372a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson switch (GetJavaType(descriptor_)) { 373a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case JAVATYPE_INT: 374a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 375a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "hash = (53 * hash) + get$capitalized_name$();\n"); 376a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 377a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 378a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case JAVATYPE_LONG: 379a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 380a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "hash = (53 * hash) + com.google.protobuf.Internal.hashLong(\n" 381a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " get$capitalized_name$());\n"); 382a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 383a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 384a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case JAVATYPE_BOOLEAN: 385a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 386a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(\n" 387a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " get$capitalized_name$());\n"); 388a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 389a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 390a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case JAVATYPE_FLOAT: 391a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 392a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "hash = (53 * hash) + java.lang.Float.floatToIntBits(\n" 393a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " get$capitalized_name$());\n"); 394a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 395a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 396a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case JAVATYPE_DOUBLE: 397a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 398a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "hash = (53 * hash) + com.google.protobuf.Internal.hashLong(\n" 399a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " java.lang.Double.doubleToLongBits(get$capitalized_name$()));\n"); 400a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 401a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 402a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case JAVATYPE_STRING: 403a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case JAVATYPE_BYTES: 404a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 405a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "hash = (53 * hash) + get$capitalized_name$().hashCode();\n"); 406a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 407a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 408a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case JAVATYPE_ENUM: 409a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case JAVATYPE_MESSAGE: 410a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson default: 411a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_LOG(FATAL) << "Can't get here."; 412a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 413a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 414a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 415a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 416a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonstring ImmutablePrimitiveFieldGenerator::GetBoxedType() const { 417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return BoxedPrimitiveTypeName(GetJavaType(descriptor_)); 418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 422a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutablePrimitiveOneofFieldGenerator:: 423a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutablePrimitiveOneofFieldGenerator(const FieldDescriptor* descriptor, 424a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int messageBitIndex, 425a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int builderBitIndex, 426a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Context* context) 427a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson : ImmutablePrimitiveFieldGenerator( 428a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson descriptor, messageBitIndex, builderBitIndex, context) { 429a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const OneofGeneratorInfo* info = 430a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson context->GetOneofGeneratorInfo(descriptor->containing_oneof()); 431a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetCommonOneofVariables(descriptor, info, &variables_); 432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 434a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutablePrimitiveOneofFieldGenerator:: 435a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson~ImmutablePrimitiveOneofFieldGenerator() {} 436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 437a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveOneofFieldGenerator:: 438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMembers(io::Printer* printer) const { 439a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson PrintExtraFieldInfo(variables_, printer); 440a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (SupportFieldPresence(descriptor_->file())) { 441a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 442a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 443a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public boolean has$capitalized_name$() {\n" 444a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $has_oneof_case_message$;\n" 445a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 446a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 447a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 448a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 449a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 450a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public $type$ get$capitalized_name$() {\n" 451a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if ($has_oneof_case_message$) {\n" 452a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return ($boxed_type$) $oneof_name$_;\n" 453a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 454a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $default$;\n" 455a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 456a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 457a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 458a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 459a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveOneofFieldGenerator:: 460a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateBuilderMembers(io::Printer* printer) const { 461a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (SupportFieldPresence(descriptor_->file())) { 462a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 463a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 464a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public boolean has$capitalized_name$() {\n" 465a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $has_oneof_case_message$;\n" 466a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 467a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 468a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 469a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 470a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 471a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public $type$ get$capitalized_name$() {\n" 472a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if ($has_oneof_case_message$) {\n" 473a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return ($boxed_type$) $oneof_name$_;\n" 474a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 475a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $default$;\n" 476a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 477a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 478a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 480a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public Builder set$capitalized_name$($type$ value) {\n" 481a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$null_check$" 482a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $set_oneof_case_message$;\n" 483a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $oneof_name$_ = value;\n" 484a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 485a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return this;\n" 486a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 487a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 488a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 489a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 490a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public Builder clear$capitalized_name$() {\n" 491a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if ($has_oneof_case_message$) {\n" 492a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $clear_oneof_case_message$;\n" 493a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $oneof_name$_ = null;\n" 494a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 495a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 496a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return this;\n" 497a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 498a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 499a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 500a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveOneofFieldGenerator:: 501a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateBuildingCode(io::Printer* printer) const { 502a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 503a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if ($has_oneof_case_message$) {\n" 504a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " result.$oneof_name$_ = $oneof_name$_;\n" 505a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 506a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 507a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 508a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveOneofFieldGenerator:: 509a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateMergingCode(io::Printer* printer) const { 510a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 511a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "set$capitalized_name$(other.get$capitalized_name$());\n"); 512a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 513a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 514a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveOneofFieldGenerator:: 515a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateParsingCode(io::Printer* printer) const { 516a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 517a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$set_oneof_case_message$;\n" 518a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$oneof_name$_ = input.read$capitalized_type$();\n"); 519a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 520a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 521a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveOneofFieldGenerator:: 522a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateSerializationCode(io::Printer* printer) const { 523a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 524a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if ($has_oneof_case_message$) {\n" 525a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " output.write$capitalized_type$(\n" 526a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $number$, ($type$)(($boxed_type$) $oneof_name$_));\n" 527a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 528a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 529a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 530a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveOneofFieldGenerator:: 531a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateSerializedSizeCode(io::Printer* printer) const { 532a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 533a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if ($has_oneof_case_message$) {\n" 534a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " size += com.google.protobuf.CodedOutputStream\n" 535a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " .compute$capitalized_type$Size(\n" 536a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $number$, ($type$)(($boxed_type$) $oneof_name$_));\n" 537a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 538a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 539a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 540a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// =================================================================== 541a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 542a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonRepeatedImmutablePrimitiveFieldGenerator:: 543a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonRepeatedImmutablePrimitiveFieldGenerator(const FieldDescriptor* descriptor, 544a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int messageBitIndex, 545a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int builderBitIndex, 546a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Context* context) 547a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson : descriptor_(descriptor), messageBitIndex_(messageBitIndex), 548a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson builderBitIndex_(builderBitIndex), context_(context), 549a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson name_resolver_(context->GetNameResolver()) { 550a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex, 551a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson context->GetFieldGeneratorInfo(descriptor), 552a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson name_resolver_, &variables_); 553a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 554a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 555a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonRepeatedImmutablePrimitiveFieldGenerator:: 556a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson~RepeatedImmutablePrimitiveFieldGenerator() {} 557a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 558a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonint RepeatedImmutablePrimitiveFieldGenerator::GetNumBitsForMessage() const { 559a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return 0; 560a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 561a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 562a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonint RepeatedImmutablePrimitiveFieldGenerator::GetNumBitsForBuilder() const { 563a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return 1; 564a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 565a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 566a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator:: 567a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateInterfaceMembers(io::Printer* printer) const { 568a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 569a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 570a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$java.util.List<$boxed_type$> get$capitalized_name$List();\n"); 571a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 572a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 573a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$int get$capitalized_name$Count();\n"); 574a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 575a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 576a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$$type$ get$capitalized_name$(int index);\n"); 577a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 578a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 579a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 580a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator:: 581a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateMembers(io::Printer* printer) const { 582a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 583a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "private $field_list_type$ $name$_;\n"); 584a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson PrintExtraFieldInfo(variables_, printer); 585a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 586a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 587a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public java.util.List<$boxed_type$>\n" 588a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " get$capitalized_name$List() {\n" 589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " return $name$_;\n" // note: unmodifiable list 590a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 591a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 592a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 593a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public int get$capitalized_name$Count() {\n" 594a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $name$_.size();\n" 595a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 596a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 597a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 598a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public $type$ get$capitalized_name$(int index) {\n" 599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " return $name$_.get(index);\n" 600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n"); 601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 602b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (descriptor_->is_packed() && 603b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer context_->HasGeneratedMethods(descriptor_->containing_type())) { 604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 605d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "private int $name$MemoizedSerializedSize = -1;\n"); 606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 609a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator:: 610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateBuilderMembers(io::Printer* printer) const { 611a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // One field is the list and the bit field keeps track of whether the 612a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // list is immutable. If it's immutable, the invariant is that it must 613a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // either an instance of Collections.emptyList() or it's an ArrayList 614a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // wrapped in a Collections.unmodifiableList() wrapper and nobody else has 615a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // a refererence to the underlying ArrayList. This invariant allows us to 616a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // share instances of lists between protocol buffers avoiding expensive 617a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // memory allocations. Note, immutable is a strong guarantee here -- not 618a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // just that the list cannot be modified via the reference but that the 619a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // list can never be modified. 620a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 621a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "private $field_list_type$ $name$_ = $empty_list$;\n"); 622a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 624a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "private void ensure$capitalized_name$IsMutable() {\n" 625a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if (!$get_mutable_bit_builder$) {\n" 626a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = new java.util.ArrayList<$boxed_type$>($name$_);\n" 627a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $set_mutable_bit_builder$;\n" 628a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 629a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 630a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Note: We return an unmodifiable list because otherwise the caller 632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // could hold on to the returned list and modify it after the message 633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // has been built, thus mutating the message which is supposed to be 634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // immutable. 635a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 636a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 637a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public java.util.List<$boxed_type$>\n" 638a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " get$capitalized_name$List() {\n" 639a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return java.util.Collections.unmodifiableList($name$_);\n" 640a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 641a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 642a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 643a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public int get$capitalized_name$Count() {\n" 644a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $name$_.size();\n" 645a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 646a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 647a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 648a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public $type$ get$capitalized_name$(int index) {\n" 649a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $name$_.get(index);\n" 650a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 651a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 652a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 653a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public Builder set$capitalized_name$(\n" 654a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " int index, $type$ value) {\n" 655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "$null_check$" 656a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " ensure$capitalized_name$IsMutable();\n" 657a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_.set(index, value);\n" 658a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " return this;\n" 660a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 661a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 662a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 663a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public Builder add$capitalized_name$($type$ value) {\n" 664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "$null_check$" 665a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " ensure$capitalized_name$IsMutable();\n" 666a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_.add(value);\n" 667a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " return this;\n" 669a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 670a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 671a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 672a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public Builder addAll$capitalized_name$(\n" 673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " java.lang.Iterable<? extends $boxed_type$> values) {\n" 674a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " ensure$capitalized_name$IsMutable();\n" 675a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " com.google.protobuf.AbstractMessageLite.Builder.addAll(\n" 676a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " values, $name$_);\n" 677a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " return this;\n" 679a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 680a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 681a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 682a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public Builder clear$capitalized_name$() {\n" 683a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = $empty_list$;\n" 684a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $clear_mutable_bit_builder$;\n" 685a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " return this;\n" 687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n"); 688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 690a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator:: 691a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateFieldBuilderInitializationCode(io::Printer* printer) const { 692a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // noop for primitives 693a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 694a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 695a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator:: 696d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleGenerateInitializationCode(io::Printer* printer) const { 697a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, "$name$_ = $empty_list$;\n"); 698d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville} 699d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 700a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator:: 701a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateBuilderClearCode(io::Printer* printer) const { 702a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 703a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$name$_ = $empty_list$;\n" 704a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$clear_mutable_bit_builder$;\n"); 705a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 706a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 707a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator:: 708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergingCode(io::Printer* printer) const { 709a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // The code below does two optimizations: 710a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 1. If the other list is empty, there's nothing to do. This ensures we 711a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // don't allocate a new array if we already have an immutable one. 712a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 2. If the other list is non-empty and our current list is empty, we can 713a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // reuse the other list which is guaranteed to be immutable. 714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "if (!other.$name$_.isEmpty()) {\n" 716a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if ($name$_.isEmpty()) {\n" 717a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = other.$name$_;\n" 718a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $clear_mutable_bit_builder$;\n" 719a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } else {\n" 720a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " ensure$capitalized_name$IsMutable();\n" 721a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_.addAll(other.$name$_);\n" 722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }\n" 723a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n"); 725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 727a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator:: 728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateBuildingCode(io::Printer* printer) const { 729a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // The code below ensures that the result has an immutable list. If our 730a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // list is immutable, we can just reuse it. If not, we make it immutable. 731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 732a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if ($get_mutable_bit_builder$) {\n" 733a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = java.util.Collections.unmodifiableList($name$_);\n" 734a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $clear_mutable_bit_builder$;\n" 735a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n" 736a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "result.$name$_ = $name$_;\n"); 737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 739a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator:: 740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateParsingCode(io::Printer* printer) const { 741d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville printer->Print(variables_, 742a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if (!$get_mutable_bit_parser$) {\n" 743a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = new java.util.ArrayList<$boxed_type$>();\n" 744a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $set_mutable_bit_parser$;\n" 745a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n" 746a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$name$_.add(input.read$capitalized_type$());\n"); 747d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville} 748d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 749a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator:: 750d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleGenerateParsingCodeFromPacked(io::Printer* printer) const { 751d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville printer->Print(variables_, 752d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "int length = input.readRawVarint32();\n" 753d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "int limit = input.pushLimit(length);\n" 754a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if (!$get_mutable_bit_parser$ && input.getBytesUntilLimit() > 0) {\n" 755a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = new java.util.ArrayList<$boxed_type$>();\n" 756a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $set_mutable_bit_parser$;\n" 757a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n" 758d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "while (input.getBytesUntilLimit() > 0) {\n" 759a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_.add(input.read$capitalized_type$());\n" 760d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "}\n" 761d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "input.popLimit(limit);\n"); 762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 764a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator:: 765a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateParsingDoneCode(io::Printer* printer) const { 766a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 767a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if ($get_mutable_bit_parser$) {\n" 768a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = java.util.Collections.unmodifiableList($name$_);\n" 769a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 770a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 771a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 772a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator:: 773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializationCode(io::Printer* printer) const { 774b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (descriptor_->is_packed()) { 775b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // We invoke getSerializedSize in writeTo for messages that have packed 776b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // fields in ImmutableMessageGenerator::GenerateMessageSerializationMethods. 777b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // That makes it safe to rely on the memoized size here. 778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "if (get$capitalized_name$List().size() > 0) {\n" 780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " output.writeRawVarint32($tag$);\n" 781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " output.writeRawVarint32($name$MemoizedSerializedSize);\n" 782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n" 783a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "for (int i = 0; i < $name$_.size(); i++) {\n" 784a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " output.write$capitalized_type$NoTag($name$_.get(i));\n" 785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n"); 786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 788a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "for (int i = 0; i < $name$_.size(); i++) {\n" 789a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " output.write$capitalized_type$($number$, $name$_.get(i));\n" 790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n"); 791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 794a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator:: 795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializedSizeCode(io::Printer* printer) const { 796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "{\n" 798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " int dataSize = 0;\n"); 799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Indent(); 800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 801d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville if (FixedSize(GetType(descriptor_)) == -1) { 802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 803a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "for (int i = 0; i < $name$_.size(); i++) {\n" 804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " dataSize += com.google.protobuf.CodedOutputStream\n" 805a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " .compute$capitalized_type$SizeNoTag($name$_.get(i));\n" 806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n"); 807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dataSize = $fixed_size$ * get$capitalized_name$List().size();\n"); 810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print( 813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "size += dataSize;\n"); 814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 815b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (descriptor_->is_packed()) { 816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "if (!get$capitalized_name$List().isEmpty()) {\n" 818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " size += $tag_size$;\n" 819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " size += com.google.protobuf.CodedOutputStream\n" 820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " .computeInt32SizeNoTag(dataSize);\n" 821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n"); 822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "size += $tag_size$ * get$capitalized_name$List().size();\n"); 825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // cache the data size for packed fields. 828b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (descriptor_->is_packed()) { 829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "$name$MemoizedSerializedSize = dataSize;\n"); 831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Outdent(); 834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print("}\n"); 835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 837a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator:: 838a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateEqualsCode(io::Printer* printer) const { 839a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 840a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "result = result && get$capitalized_name$List()\n" 841a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " .equals(other.get$capitalized_name$List());\n"); 842a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 843a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 844a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator:: 845a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateHashCode(io::Printer* printer) const { 846a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 847a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if (get$capitalized_name$Count() > 0) {\n" 848a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " hash = (37 * hash) + $constant_name$;\n" 849a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " hash = (53 * hash) + get$capitalized_name$List().hashCode();\n" 850a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 851a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 852a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 853a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonstring RepeatedImmutablePrimitiveFieldGenerator::GetBoxedType() const { 854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return BoxedPrimitiveTypeName(GetJavaType(descriptor_)); 855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace java 858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace compiler 859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace protobuf 860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace google 861