javanano_primitive_field.cc revision 04e0fa44e105bc644bf07ba5154fc4a1ca4baec2
1ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org// Protocol Buffers - Google's data interchange format 243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Copyright 2008 Google Inc. All rights reserved. 343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// http://code.google.com/p/protobuf/ 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Redistribution and use in source and binary forms, with or without 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// modification, are permitted provided that the following conditions are 743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// met: 843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// * Redistributions of source code must retain the above copyright 1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// notice, this list of conditions and the following disclaimer. 1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// * Redistributions in binary form must reproduce the above 1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// copyright notice, this list of conditions and the following disclaimer 1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// in the documentation and/or other materials provided with the 1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// distribution. 1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// * Neither the name of Google Inc. nor the names of its 1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// contributors may be used to endorse or promote products derived from 1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// this software without specific prior written permission. 1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Author: kenton@google.com (Kenton Varda) 32f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org// Based on original Protocol Buffers design by 33d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org// Sanjay Ghemawat, Jeff Dean, and others. 34c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org 35a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#include <map> 3601beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.org#include <math.h> 3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <string> 38f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org 391456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org#include <google/protobuf/compiler/javanano/javanano_primitive_field.h> 40a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#include <google/protobuf/stubs/common.h> 41f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org#include <google/protobuf/compiler/javanano/javanano_helpers.h> 427c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org#include <google/protobuf/io/printer.h> 43a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#include <google/protobuf/wire_format.h> 4443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <google/protobuf/stubs/strutil.h> 4571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org#include <google/protobuf/stubs/substitute.h> 4671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansennamespace google { 4810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.orgnamespace protobuf { 4910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.orgnamespace compiler { 5010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.orgnamespace javanano { 5110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org 5210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.orgusing internal::WireFormat; 5310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.orgusing internal::WireFormatLite; 5410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org 5510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.orgnamespace { 5610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org 5710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.orgconst char* PrimitiveTypeName(JavaType type) { 5810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org switch (type) { 5910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_INT : return "int"; 6010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_LONG : return "long"; 6110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_FLOAT : return "float"; 6210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_DOUBLE : return "double"; 6310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_BOOLEAN: return "boolean"; 6410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_STRING : return "java.lang.String"; 6510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_BYTES : return "byte[]"; 6610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_ENUM : return NULL; 6710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_MESSAGE: return NULL; 6810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org 6910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org // No default because we want the compiler to complain if any new 7010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org // JavaTypes are added. 7110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org } 7210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org 7310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org GOOGLE_LOG(FATAL) << "Can't get here."; 7410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org return NULL; 7510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org} 7610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org 7710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.orgbool IsReferenceType(JavaType type) { 7810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org switch (type) { 7910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_INT : return false; 8010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_LONG : return false; 8110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_FLOAT : return false; 8210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_DOUBLE : return false; 8310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_BOOLEAN: return false; 8410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_STRING : return true; 8510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_BYTES : return true; 8610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_ENUM : return false; 8710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_MESSAGE: return true; 8810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org 8910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org // No default because we want the compiler to complain if any new 9010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org // JavaTypes are added. 9110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org } 9210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org 9310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org GOOGLE_LOG(FATAL) << "Can't get here."; 9410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org return false; 9510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org} 9610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org 9710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.orgbool IsArrayType(JavaType type) { 9810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org switch (type) { 9910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_INT : return false; 10010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_LONG : return false; 10110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_FLOAT : return false; 10210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_DOUBLE : return false; 10310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_BOOLEAN: return false; 10410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_STRING : return false; 10510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_BYTES : return true; 10610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_ENUM : return false; 10710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case JAVATYPE_MESSAGE: return false; 10810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org 10910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org // No default because we want the compiler to complain if any new 11010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org // JavaTypes are added. 11110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org } 11210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org 11310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org GOOGLE_LOG(FATAL) << "Can't get here."; 11410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org return false; 11510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org} 11610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org 11710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.orgconst char* GetCapitalizedType(const FieldDescriptor* field) { 11810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org switch (field->type()) { 11910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case FieldDescriptor::TYPE_INT32 : return "Int32" ; 12010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case FieldDescriptor::TYPE_UINT32 : return "UInt32" ; 12110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case FieldDescriptor::TYPE_SINT32 : return "SInt32" ; 12210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case FieldDescriptor::TYPE_FIXED32 : return "Fixed32" ; 12310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case FieldDescriptor::TYPE_SFIXED32: return "SFixed32"; 12443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_INT64 : return "Int64" ; 12543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_UINT64 : return "UInt64" ; 12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_SINT64 : return "SInt64" ; 12743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_FIXED64 : return "Fixed64" ; 12843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_SFIXED64: return "SFixed64"; 12943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_FLOAT : return "Float" ; 13043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_DOUBLE : return "Double" ; 131ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case FieldDescriptor::TYPE_BOOL : return "Bool" ; 13243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_STRING : return "String" ; 13343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_BYTES : return "Bytes" ; 13443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_ENUM : return "Enum" ; 13543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_GROUP : return "Group" ; 13643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_MESSAGE : return "Message" ; 137245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org 138245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org // No default because we want the compiler to complain if any new 139245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org // types are added. 14043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 14143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen GOOGLE_LOG(FATAL) << "Can't get here."; 14343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return NULL; 14443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 14543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// For encodings with fixed sizes, returns that size in bytes. Otherwise 14743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// returns -1. 14843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenint FixedSize(FieldDescriptor::Type type) { 14943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch (type) { 15043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_INT32 : return -1; 15143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_INT64 : return -1; 15243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_UINT32 : return -1; 15343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_UINT64 : return -1; 15443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_SINT32 : return -1; 15543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_SINT64 : return -1; 15643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_FIXED32 : return WireFormatLite::kFixed32Size; 15743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_FIXED64 : return WireFormatLite::kFixed64Size; 15843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_SFIXED32: return WireFormatLite::kSFixed32Size; 15943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_SFIXED64: return WireFormatLite::kSFixed64Size; 16043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_FLOAT : return WireFormatLite::kFloatSize; 161245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org case FieldDescriptor::TYPE_DOUBLE : return WireFormatLite::kDoubleSize; 162ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 163ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case FieldDescriptor::TYPE_BOOL : return WireFormatLite::kBoolSize; 164ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case FieldDescriptor::TYPE_ENUM : return -1; 165245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org 16643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_STRING : return -1; 16743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_BYTES : return -1; 16843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_GROUP : return -1; 16943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FieldDescriptor::TYPE_MESSAGE : return -1; 1706d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 17143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // No default because we want the compiler to complain if any new 17243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // types are added. 17343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 17443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen GOOGLE_LOG(FATAL) << "Can't get here."; 17543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return -1; 17643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 17743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 17843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Return true if the type is a that has variable length 17943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// for instance String's. 1803811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgbool IsVariableLenType(JavaType type) { 1813811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org switch (type) { 1823811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org case JAVATYPE_INT : return false; 18343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case JAVATYPE_LONG : return false; 18443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case JAVATYPE_FLOAT : return false; 185245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org case JAVATYPE_DOUBLE : return false; 186245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org case JAVATYPE_BOOLEAN: return false; 187ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case JAVATYPE_STRING : return true; 18843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case JAVATYPE_BYTES : return true; 18943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case JAVATYPE_ENUM : return false; 19043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case JAVATYPE_MESSAGE: return true; 19143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 19243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // No default because we want the compiler to complain if any new 19343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // JavaTypes are added. 19443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 1959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 19643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen GOOGLE_LOG(FATAL) << "Can't get here."; 19774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org return false; 198ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 199a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 20043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool AllAscii(const string& text) { 20143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (int i = 0; i < text.size(); i++) { 20243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if ((text[i] & 0x80) != 0) { 2034a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org return false; 20443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 20543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 20643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return true; 20743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 208a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 20943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid SetPrimitiveVariables(const FieldDescriptor* descriptor, const Params params, 210a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org map<string, string>* variables) { 21171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org (*variables)["name"] = 21243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen RenameJavaKeywords(UnderscoresToCamelCase(descriptor)); 21343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen (*variables)["capitalized_name"] = 21443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen RenameJavaKeywords(UnderscoresToCapitalizedCamelCase(descriptor)); 215a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org (*variables)["number"] = SimpleItoa(descriptor->number()); 21643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (params.use_reference_types_for_primitives() 2175323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org && !descriptor->is_repeated()) { 21843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen (*variables)["type"] = BoxedPrimitiveTypeName(GetJavaType(descriptor)); 21943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 22043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen (*variables)["type"] = PrimitiveTypeName(GetJavaType(descriptor)); 22143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 22243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Deals with defaults. For C++-string types (string and bytes), 22343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // we might need to have the generated code do the unicode decoding 22443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // (see comments in InternalNano.java for gory details.). We would 22543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // like to do this once into a static field and re-use that from 22643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // then on. 22743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (descriptor->cpp_type() == FieldDescriptor::CPPTYPE_STRING && 228ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org !descriptor->default_value_string().empty() && 2296d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org !params.use_reference_types_for_primitives()) { 2306d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org if (descriptor->type() == FieldDescriptor::TYPE_BYTES) { 2315d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org (*variables)["default"] = DefaultValue(params, descriptor); 2323811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org (*variables)["default_constant"] = FieldDefaultConstantName(descriptor); 2333811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org (*variables)["default_constant_value"] = strings::Substitute( 2343811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org "com.google.protobuf.nano.InternalNano.bytesDefaultValue(\"$0\")", 2353811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org CEscape(descriptor->default_value_string())); 236ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org (*variables)["default_copy_if_needed"] = 237ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org (*variables)["default"] + ".clone()"; 23843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else if (AllAscii(descriptor->default_value_string())) { 23943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // All chars are ASCII. In this case directly referencing a 24043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // CEscape()'d string literal works fine. 24143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen (*variables)["default"] = 2423811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org "\"" + CEscape(descriptor->default_value_string()) + "\""; 2433811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org (*variables)["default_copy_if_needed"] = (*variables)["default"]; 2443811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org } else { 245068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org // Strings where some chars are non-ASCII. We need to save the 24643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // default value. 24743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen (*variables)["default"] = DefaultValue(params, descriptor); 24843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen (*variables)["default_constant"] = FieldDefaultConstantName(descriptor); 24943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen (*variables)["default_constant_value"] = strings::Substitute( 25043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "com.google.protobuf.nano.InternalNano.stringDefaultValue(\"$0\")", 25143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen CEscape(descriptor->default_value_string())); 252e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org (*variables)["default_copy_if_needed"] = (*variables)["default"]; 253e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 25443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 255e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Non-string, non-bytes field. Defaults are literals. 25643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen (*variables)["default"] = DefaultValue(params, descriptor); 25743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen (*variables)["default_copy_if_needed"] = (*variables)["default"]; 25843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 25943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen (*variables)["boxed_type"] = BoxedPrimitiveTypeName(GetJavaType(descriptor)); 2603811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org (*variables)["capitalized_type"] = GetCapitalizedType(descriptor); 2613811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org (*variables)["tag"] = SimpleItoa(WireFormat::MakeTag(descriptor)); 26243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen (*variables)["tag_size"] = SimpleItoa( 263e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org WireFormat::TagSize(descriptor->number(), descriptor->type())); 26443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int fixed_size = FixedSize(descriptor->type()); 26543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (fixed_size != -1) { 26643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen (*variables)["fixed_size"] = SimpleItoa(fixed_size); 26743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 26843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen (*variables)["message_name"] = descriptor->containing_type()->name(); 26943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen (*variables)["empty_array_name"] = EmptyArrayName(params, descriptor); 27071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 27171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} // namespace 27243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 27343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// =================================================================== 27443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 275ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgPrimitiveFieldGenerator:: 27643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenPrimitiveFieldGenerator(const FieldDescriptor* descriptor, const Params& params) 27743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen : FieldGenerator(params), descriptor_(descriptor) { 27843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SetPrimitiveVariables(descriptor, params, &variables_); 27943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 28043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 28140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.orgPrimitiveFieldGenerator::~PrimitiveFieldGenerator() {} 28243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2836d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgbool PrimitiveFieldGenerator::SavedDefaultNeeded() const { 28440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org return variables_.find("default_constant") != variables_.end(); 28543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 28643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 28743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrimitiveFieldGenerator::GenerateInitSavedDefaultCode(io::Printer* printer) const { 28843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (variables_.find("default_constant") != variables_.end()) { 28943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen printer->Print(variables_, 29043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "$default_constant$ = $default_constant_value$;\n"); 29143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 292ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 2938e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 2948e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgvoid PrimitiveFieldGenerator:: 2958e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgGenerateMembers(io::Printer* printer, bool lazy_init) const { 2968e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org if (variables_.find("default_constant") != variables_.end()) { 2978e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org // Those primitive types that need a saved default. 2988e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org if (lazy_init) { 2998e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 3008e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "private static $type$ $default_constant$;\n"); 3018e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org } else { 3028e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 3038e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "private static final $type$ $default_constant$ =\n" 3048e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org " $default_constant_value$;\n"); 3058e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org } 3068e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org } 3078e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 3088e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 3098e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "public $type$ $name$;\n"); 3108e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 3118e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org if (params_.generate_has()) { 3128e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 3138e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "public boolean has$capitalized_name$;\n"); 3148e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org } 3158e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org} 3168e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 31704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.orgvoid PrimitiveFieldGenerator:: 31804921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.orgGenerateClearCode(io::Printer* printer) const { 31904921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org printer->Print(variables_, 32004921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org "$name$ = $default_copy_if_needed$;\n"); 3218e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 3228e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org if (params_.generate_has()) { 3238e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 3248e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "has$capitalized_name$ = false;\n"); 3258e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org } 3268e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org} 3278e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 3288e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgvoid PrimitiveFieldGenerator:: 3298e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgGenerateMergingCode(io::Printer* printer) const { 3308e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 3318e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "this.$name$ = input.read$capitalized_type$();\n"); 3328e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 3338e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org if (params_.generate_has()) { 3348e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 3358e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "has$capitalized_name$ = true;\n"); 3368e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org } 3378e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org} 3388e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 3398e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgvoid PrimitiveFieldGenerator:: 3408e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgGenerateSerializationConditional(io::Printer* printer) const { 3418e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org if (params_.use_reference_types_for_primitives()) { 3428e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org // For reference type mode, serialize based on equality 3438e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org // to null. 3448e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 3458e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "if (this.$name$ != null) {\n"); 3468e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org return; 3478e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org } 3488e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org if (params_.generate_has()) { 3498e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 3508e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "if (has$capitalized_name$ || "); 3518e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org } else { 3528e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 3538e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "if ("); 3548e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org } 3558e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org JavaType java_type = GetJavaType(descriptor_); 3568e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org if (IsArrayType(java_type)) { 3578e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 3588e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "!java.util.Arrays.equals(this.$name$, $default$)) {\n"); 3598e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org } else if (IsReferenceType(java_type)) { 3608e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 3618e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "!this.$name$.equals($default$)) {\n"); 3628e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org } else if (java_type == JAVATYPE_FLOAT) { 3638e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 3648e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "java.lang.Float.floatToIntBits(this.$name$)\n" 3658e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org " != java.lang.Float.floatToIntBits($default$)) {\n"); 3668e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org } else if (java_type == JAVATYPE_DOUBLE) { 3678e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 3688e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "java.lang.Double.doubleToLongBits(this.$name$)\n" 3698e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org " != java.lang.Double.doubleToLongBits($default$)) {\n"); 3708e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org } else { 3718e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 3728e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "this.$name$ != $default$) {\n"); 3738e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org } 3748e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org} 3758e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 3768e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgvoid PrimitiveFieldGenerator:: 3778e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgGenerateSerializationCode(io::Printer* printer) const { 378154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org if (descriptor_->is_required() && !params_.generate_has()) { 379154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org // Always serialize a required field if we don't have the 'has' signal. 380154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org printer->Print(variables_, 3818e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "output.write$capitalized_type$($number$, this.$name$);\n"); 382154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org } else { 38359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org GenerateSerializationConditional(printer); 3848e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 3858e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org " output.write$capitalized_type$($number$, this.$name$);\n" 386154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org "}\n"); 3878e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org } 388154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org} 3898e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 3908e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgvoid PrimitiveFieldGenerator:: 391154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.orgGenerateSerializedSizeCode(io::Printer* printer) const { 3928e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org if (descriptor_->is_required() && !params_.generate_has()) { 3938e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 3948e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "size += com.google.protobuf.nano.CodedOutputByteBufferNano\n" 3958e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org " .compute$capitalized_type$Size($number$, this.$name$);\n"); 3968e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org } else { 397e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org GenerateSerializationConditional(printer); 3988e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 3998e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org " size += com.google.protobuf.nano.CodedOutputByteBufferNano\n" 4008e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org " .compute$capitalized_type$Size($number$, this.$name$);\n" 4018e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "}\n"); 4028e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org } 4038e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org} 4048e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 4058e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgvoid PrimitiveFieldGenerator:: 4068e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgGenerateEqualsCode(io::Printer* printer) const { 4078e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org // We define equality as serialized form equality. If generate_has(), 4088e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org // then if the field value equals the default value in both messages, 4098e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org // but one's 'has' field is set and the other's is not, the serialized 4108e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org // forms are different and we should return false. 4118e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org JavaType java_type = GetJavaType(descriptor_); 4128e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org if (java_type == JAVATYPE_BYTES) { 4138e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 4148e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "if (!java.util.Arrays.equals(this.$name$, other.$name$)"); 4158e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org if (params_.generate_has()) { 4168e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 4178e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "\n" 418750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org " || (java.util.Arrays.equals(this.$name$, $default$)\n" 419750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org " && this.has$capitalized_name$ != other.has$capitalized_name$)"); 420750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 421750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org printer->Print(") {\n" 422750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org " return false;\n" 423750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org "}\n"); 424750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } else if (java_type == JAVATYPE_STRING 425750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org || params_.use_reference_types_for_primitives()) { 4268e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 4278e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "if (this.$name$ == null) {\n" 4288e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org " if (other.$name$ != null) {\n" 4298e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org " return false;\n" 4308e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org " }\n" 431154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org "} else if (!this.$name$.equals(other.$name$)"); 4328e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org if (params_.generate_has()) { 4338e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 4348e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "\n" 435154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org " || (this.$name$.equals($default$)\n" 4368e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org " && this.has$capitalized_name$ != other.has$capitalized_name$)"); 4378e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org } 4388e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(") {\n" 439c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org " return false;\n" 440c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org "}\n"); 441c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org } else if (java_type == JAVATYPE_FLOAT) { 442ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org printer->Print(variables_, 443ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org "{\n" 444ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org " int bits = java.lang.Float.floatToIntBits(this.$name$);\n" 445ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org " if (bits != java.lang.Float.floatToIntBits(other.$name$)"); 446ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (params_.generate_has()) { 44710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org printer->Print(variables_, 4488e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "\n" 4498e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org " || (bits == java.lang.Float.floatToIntBits($default$)\n" 450ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org " && this.has$capitalized_name$ != other.has$capitalized_name$)"); 451355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org } 452ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org printer->Print(") {\n" 453ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org " return false;\n" 454ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org " }\n" 455ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org "}\n"); 4568e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } else if (java_type == JAVATYPE_DOUBLE) { 4578e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org printer->Print(variables_, 458ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org "{\n" 459ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org " long bits = java.lang.Double.doubleToLongBits(this.$name$);\n" 4608e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org " if (bits != java.lang.Double.doubleToLongBits(other.$name$)"); 461ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (params_.generate_has()) { 4628e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(variables_, 4638e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org "\n" 464ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org " || (bits == java.lang.Double.doubleToLongBits($default$)\n" 465ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org " && this.has$capitalized_name$ != other.has$capitalized_name$)"); 466eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org } 4678e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org printer->Print(") {\n" 468355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org " return false;\n" 469c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org " }\n" 470355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org "}\n"); 471355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org } else { 472355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org printer->Print(variables_, 473c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org "if (this.$name$ != other.$name$"); 474355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org if (params_.generate_has()) { 475355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org printer->Print(variables_, 476355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org "\n" 477c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org " || (this.$name$ == $default$\n" 478c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org " && this.has$capitalized_name$ != other.has$capitalized_name$)"); 479f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org } 480355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org printer->Print(") {\n" 481355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org " return false;\n" 482355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org "}\n"); 483355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org } 484355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org} 485355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org 486355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.orgvoid PrimitiveFieldGenerator:: 487355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.orgGenerateHashCodeCode(io::Printer* printer) const { 488355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org JavaType java_type = GetJavaType(descriptor_); 489355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org if (java_type == JAVATYPE_BYTES) { 490355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org printer->Print(variables_, 491355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org "result = 31 * result + java.util.Arrays.hashCode(this.$name$);\n"); 492355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org } else if (java_type == JAVATYPE_STRING 493355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org || params_.use_reference_types_for_primitives()) { 494355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org printer->Print(variables_, 495355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org "result = 31 * result\n" 496355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org " + (this.$name$ == null ? 0 : this.$name$.hashCode());\n"); 497355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org } else { 498355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org switch (java_type) { 499355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org // For all Java primitive types below, the hash codes match the 500355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org // results of BoxedType.valueOf(primitiveValue).hashCode(). 501355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org case JAVATYPE_INT: 502355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org printer->Print(variables_, 503355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org "result = 31 * result + this.$name$;\n"); 504355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org break; 505355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org case JAVATYPE_LONG: 506355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org printer->Print(variables_, 507355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org "result = 31 * result\n" 508355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org " + (int) (this.$name$ ^ (this.$name$ >>> 32));\n"); 509355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org break; 510355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org case JAVATYPE_FLOAT: 511355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org printer->Print(variables_, 512355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org "result = 31 * result\n" 513355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org " + java.lang.Float.floatToIntBits(this.$name$);\n"); 514355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org break; 515355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org case JAVATYPE_DOUBLE: 516355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org printer->Print(variables_, 517355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org "{\n" 518c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org " long v = java.lang.Double.doubleToLongBits(this.$name$);\n" 519c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org " result = 31 * result + (int) (v ^ (v >>> 32));\n" 520c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org "}\n"); 521c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org break; 522c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org case JAVATYPE_BOOLEAN: 523c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org printer->Print(variables_, 524c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org "result = 31 * result + (this.$name$ ? 1231 : 1237);\n"); 525c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org break; 526c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org default: 527c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org GOOGLE_LOG(ERROR) << "unknown java type for primitive field"; 528c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org break; 529c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org } 530c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org } 531c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org} 532c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org 533c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org// =================================================================== 534e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 535c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.orgAccessorPrimitiveFieldGenerator:: 536c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.orgAccessorPrimitiveFieldGenerator(const FieldDescriptor* descriptor, 537c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org const Params& params, int has_bit_index) 538c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org : FieldGenerator(params), descriptor_(descriptor) { 539c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org SetPrimitiveVariables(descriptor, params, &variables_); 540c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org SetBitOperationVariables("has", has_bit_index, &variables_); 541c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org} 542c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org 543c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.orgAccessorPrimitiveFieldGenerator::~AccessorPrimitiveFieldGenerator() {} 544e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 545c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.orgbool AccessorPrimitiveFieldGenerator::SavedDefaultNeeded() const { 546c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org return variables_.find("default_constant") != variables_.end(); 547c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org} 548c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org 549c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.orgvoid AccessorPrimitiveFieldGenerator:: 550c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.orgGenerateInitSavedDefaultCode(io::Printer* printer) const { 551c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org if (variables_.find("default_constant") != variables_.end()) { 552c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org printer->Print(variables_, 553c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org "$default_constant$ = $default_constant_value$;\n"); 554355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org } 5555f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org} 556ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 5575f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvoid AccessorPrimitiveFieldGenerator:: 558eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgGenerateMembers(io::Printer* printer, bool lazy_init) const { 5595f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org if (variables_.find("default_constant") != variables_.end()) { 56043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Those primitive types that need a saved default. 5619085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org if (lazy_init) { 562755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org printer->Print(variables_, 563ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org "private static $type$ $default_constant$;\n"); 564ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } else { 565755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org printer->Print(variables_, 566755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org "private static final $type$ $default_constant$ =\n" 567755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org " $default_constant_value$;\n"); 568755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 569381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org } 57043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen printer->Print(variables_, 5716f10e41fef1524c70846d970268de222e41c594cager@chromium.org "private $type$ $name$_;\n" 5726f10e41fef1524c70846d970268de222e41c594cager@chromium.org "public $type$ get$capitalized_name$() {\n" 5736f10e41fef1524c70846d970268de222e41c594cager@chromium.org " return $name$_;\n" 5746f10e41fef1524c70846d970268de222e41c594cager@chromium.org "}\n" 5756f10e41fef1524c70846d970268de222e41c594cager@chromium.org "public $message_name$ set$capitalized_name$($type$ value) {\n"); 576ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (IsReferenceType(GetJavaType(descriptor_))) { 577ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org printer->Print(variables_, 578381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org " if (value == null) {\n" 579381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org " throw new java.lang.NullPointerException();\n" 58043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen " }\n"); 58143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 58243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen printer->Print(variables_, 58343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen " $name$_ = value;\n" 584ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org " $set_has$;\n" 585ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org " return this;\n" 586ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org "}\n" 587ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org "public boolean has$capitalized_name$() {\n" 588f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org " return $get_has$;\n" 589f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org "}\n" 590f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org "public $message_name$ clear$capitalized_name$() {\n" 591f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org " $name$_ = $default_copy_if_needed$;\n" 592f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org " $clear_has$;\n" 593ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org " return this;\n" 594ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org "}\n"); 595ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 596381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 597381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.orgvoid AccessorPrimitiveFieldGenerator:: 59843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenGenerateClearCode(io::Printer* printer) const { 59943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen printer->Print(variables_, 60043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "$name$_ = $default_copy_if_needed$;\n"); 601f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org} 602ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 603ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid AccessorPrimitiveFieldGenerator:: 604f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.orgGenerateMergingCode(io::Printer* printer) const { 605f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org printer->Print(variables_, 606f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org "$name$_ = input.read$capitalized_type$();\n" 607f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org "$set_has$;\n"); 608f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org} 60943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 610ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid AccessorPrimitiveFieldGenerator:: 611ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgGenerateSerializationCode(io::Printer* printer) const { 612b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org printer->Print(variables_, 613381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org "if ($get_has$) {\n" 61443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen " output.write$capitalized_type$($number$, $name$_);\n" 61543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "}\n"); 61643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 61743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6189085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgvoid AccessorPrimitiveFieldGenerator:: 61943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenGenerateSerializedSizeCode(io::Printer* printer) const { 62043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen printer->Print(variables_, 621ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org "if ($get_has$) {\n" 622ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org " size += com.google.protobuf.nano.CodedOutputByteBufferNano\n" 62343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen " .compute$capitalized_type$Size($number$, $name$_);\n" 62443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "}\n"); 625eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 626381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 627381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.orgvoid AccessorPrimitiveFieldGenerator:: 62843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenGenerateEqualsCode(io::Printer* printer) const { 62943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch (GetJavaType(descriptor_)) { 63043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // For all Java primitive types below, the equality checks match the 63143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // results of BoxedType.valueOf(primitiveValue).equals(otherValue). 632ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case JAVATYPE_FLOAT: 63343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen printer->Print(variables_, 63483e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org "if ($different_has$\n" 63543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen " || java.lang.Float.floatToIntBits($name$_)\n" 63643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen " != java.lang.Float.floatToIntBits(other.$name$_)) {\n" 637750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org " return false;\n" 638f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org "}\n"); 639f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org break; 640f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org case JAVATYPE_DOUBLE: 641f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org printer->Print(variables_, 642f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org "if ($different_has$\n" 643f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org " || java.lang.Double.doubleToLongBits($name$_)\n" 644f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org " != java.lang.Double.doubleToLongBits(other.$name$_)) {\n" 645f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org " return false;\n" 646f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org "}\n"); 647f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org break; 648f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org case JAVATYPE_INT: 64943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case JAVATYPE_LONG: 65043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case JAVATYPE_BOOLEAN: 65143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen printer->Print(variables_, 65243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "if ($different_has$\n" 65343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen " || $name$_ != other.$name$_) {\n" 65443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen " return false;\n" 65543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "}\n"); 65643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 65743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case JAVATYPE_STRING: 6585aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Accessor style would guarantee $name$_ non-null 6595aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org printer->Print(variables_, 660ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org "if ($different_has$\n" 661ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org " || !$name$_.equals(other.$name$_)) {\n" 6625aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org " return false;\n" 6635aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org "}\n"); 6645aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org break; 6655aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org case JAVATYPE_BYTES: 666381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org // Accessor style would guarantee $name$_ non-null 66743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen printer->Print(variables_, 66843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "if ($different_has$\n" 66943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen " || !java.util.Arrays.equals($name$_, other.$name$_)) {\n" 67043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen " return false;\n" 6715aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org "}\n"); 6725aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org break; 673ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org default: 674ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org GOOGLE_LOG(ERROR) << "unknown java type for primitive field"; 6755aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org break; 6765aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org } 6775aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 6785aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 679381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.orgvoid AccessorPrimitiveFieldGenerator:: 68043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenGenerateHashCodeCode(io::Printer* printer) const { 68143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch (GetJavaType(descriptor_)) { 682b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org // For all Java primitive types below, the hash codes match the 683c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org // results of BoxedType.valueOf(primitiveValue).hashCode(). 684c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org case JAVATYPE_INT: 685c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org printer->Print(variables_, 686c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org "result = 31 * result + $name$_;\n"); 687c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org break; 688c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org case JAVATYPE_LONG: 689c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org printer->Print(variables_, 690c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org "result = 31 * result + (int) ($name$_ ^ ($name$_ >>> 32));\n"); 691c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org break; 692c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org case JAVATYPE_FLOAT: 693068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org printer->Print(variables_, 6941f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org "result = 31 * result +\n" 69532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org " java.lang.Float.floatToIntBits($name$_);\n"); 6968e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org break; 697068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case JAVATYPE_DOUBLE: 698068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org printer->Print(variables_, 699068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org "{\n" 700068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org " long v = java.lang.Double.doubleToLongBits($name$_);\n" 7018e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org " result = 31 * result + (int) (v ^ (v >>> 32));\n" 7028e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org "}\n"); 7038e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org break; 7048e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org case JAVATYPE_BOOLEAN: 705ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org printer->Print(variables_, 706ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org "result = 31 * result + ($name$_ ? 1231 : 1237);\n"); 707ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org break; 708ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org case JAVATYPE_STRING: 70983130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org // Accessor style would guarantee $name$_ non-null 71083130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org printer->Print(variables_, 71183130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org "result = 31 * result + $name$_.hashCode();\n"); 712ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org break; 713ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org case JAVATYPE_BYTES: 714ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org // Accessor style would guarantee $name$_ non-null 715ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org printer->Print(variables_, 71683130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org "result = 31 * result + java.util.Arrays.hashCode($name$_);\n"); 71783130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org break; 71883130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org default: 719068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org GOOGLE_LOG(ERROR) << "unknown java type for primitive field"; 720068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org break; 7211f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org } 7221f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org} 7231f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org 7248e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org// =================================================================== 7258e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 7268e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgRepeatedPrimitiveFieldGenerator:: 7278e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgRepeatedPrimitiveFieldGenerator(const FieldDescriptor* descriptor, const Params& params) 7288e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org : FieldGenerator(params), descriptor_(descriptor) { 7298e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org SetPrimitiveVariables(descriptor, params, &variables_); 7308e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org} 731068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org 7328e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgRepeatedPrimitiveFieldGenerator::~RepeatedPrimitiveFieldGenerator() {} 7338e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 734236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgvoid RepeatedPrimitiveFieldGenerator:: 735b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgGenerateMembers(io::Printer* printer, bool /*unused init_defaults*/) const { 736b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org printer->Print(variables_, 737ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org "public $type$[] $name$;\n"); 738b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org} 739b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 740b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgvoid RepeatedPrimitiveFieldGenerator:: 741381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.orgGenerateClearCode(io::Printer* printer) const { 742b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org printer->Print(variables_, 743b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org "$name$ = $default$;\n"); 744b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org} 7459fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org 74641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.orgvoid RepeatedPrimitiveFieldGenerator:: 747381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.orgGenerateMergingCode(io::Printer* printer) const { 74841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org // First, figure out the length of the array, then parse. 74941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org printer->Print(variables_, 75041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org "int arrayLength = com.google.protobuf.nano.WireFormatNano\n" 75141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org " .getRepeatedFieldArrayLength(input, $tag$);\n" 752381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org "int i = this.$name$ == null ? 0 : this.$name$.length;\n"); 753381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 754381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org if (GetJavaType(descriptor_) == JAVATYPE_BYTES) { 755b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org printer->Print(variables_, 756b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org "byte[][] newArray = new byte[i + arrayLength][];\n"); 757b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } else { 758b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org printer->Print(variables_, 759381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org "$type$[] newArray = new $type$[i + arrayLength];\n"); 760b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 761b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org printer->Print(variables_, 762b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org "if (i != 0) {\n" 763b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org " java.lang.System.arraycopy(this.$name$, 0, newArray, 0, i);\n" 764381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org "}\n" 765b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org "for (; i < newArray.length - 1; i++) {\n" 766b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org " newArray[i] = input.read$capitalized_type$();\n" 767b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org " input.readTag();\n" 768b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org "}\n" 769381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org "// Last one without readTag.\n" 770b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org "newArray[i] = input.read$capitalized_type$();\n" 771381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org "this.$name$ = newArray;\n"); 772381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org} 773b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 774b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgvoid RepeatedPrimitiveFieldGenerator:: 775b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgGenerateMergingCodeFromPacked(io::Printer* printer) const { 7769fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org printer->Print( 777ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org "int length = input.readRawVarint32();\n" 778ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org "int limit = input.pushLimit(length);\n"); 779381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 780b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org // If we know the elements will all be of the same size, the arrayLength 781381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org // can be calculated much more easily. However, FixedSize() returns 1 for 782381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org // repeated bool fields, which are guaranteed to have the fixed size of 783b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org // 1 byte per value only if we control the output. On the wire they can 784b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org // legally appear as variable-size integers, so we need to use the slow 785b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org // way for repeated bool fields. 786e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (descriptor_->type() == FieldDescriptor::TYPE_BOOL 787c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org || FixedSize(descriptor_->type()) == -1) { 788ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org printer->Print(variables_, 789e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org "// First pass to compute array length.\n" 790ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org "int arrayLength = 0;\n" 79137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com "int startPos = input.getPosition();\n" 79237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com "while (input.getBytesUntilLimit() > 0) {\n" 79337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com " input.read$capitalized_type$();\n" 79437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com " arrayLength++;\n" 79537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com "}\n" 796303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org "input.rewindToPosition(startPos);\n"); 797303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } else { 798303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org printer->Print(variables_, 799303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org "int arrayLength = length / $fixed_size$;\n"); 800303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 801303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org 80237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com printer->Print(variables_, 80337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com "int i = this.$name$ == null ? 0 : this.$name$.length;\n" 80437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com "$type$[] newArray = new $type$[i + arrayLength];\n" 805381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org "if (i != 0) {\n" 80637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com " java.lang.System.arraycopy(this.$name$, 0, newArray, 0, i);\n" 80737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com "}\n" 808381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org "for (; i < newArray.length; i++) {\n" 80937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com " newArray[i] = input.read$capitalized_type$();\n" 81037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com "}\n" 81137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com "this.$name$ = newArray;\n" 81237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com "input.popLimit(limit);\n"); 81337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com} 814381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 81537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comvoid RepeatedPrimitiveFieldGenerator:: 81637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comGenerateRepeatedDataSizeCode(io::Printer* printer) const { 817381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org // Creates a variable dataSize and puts the serialized size in there. 81837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com // If the element type is a Java reference type, also generates 81937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com // dataCount which stores the number of non-null elements in the field. 82037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com if (IsReferenceType(GetJavaType(descriptor_))) { 82137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com printer->Print(variables_, 82237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com "int dataCount = 0;\n" 823381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org "int dataSize = 0;\n" 82437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com "for (int i = 0; i < this.$name$.length; i++) {\n" 82537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com " $type$ element = this.$name$[i];\n" 826381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org " if (element != null) {\n" 827381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org " dataCount++;\n" 828b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org " dataSize += com.google.protobuf.nano.CodedOutputByteBufferNano\n" 829b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org " .compute$capitalized_type$SizeNoTag(element);\n" 830b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org " }\n" 83143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "}\n"); 832ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } else if (FixedSize(descriptor_->type()) == -1) { 83343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen printer->Print(variables_, 83443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "int dataSize = 0;\n" 83543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "for (int i = 0; i < this.$name$.length; i++) {\n" 83643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen " $type$ element = this.$name$[i];\n" 83743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen " dataSize += com.google.protobuf.nano.CodedOutputByteBufferNano\n" 83843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen " .compute$capitalized_type$SizeNoTag(element);\n" 83943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "}\n"); 840750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } else { 841ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org printer->Print(variables_, 84243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "int dataSize = $fixed_size$ * this.$name$.length;\n"); 84383e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org } 84443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 845750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 846750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgvoid RepeatedPrimitiveFieldGenerator:: 847750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgGenerateSerializationCode(io::Printer* printer) const { 848750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org printer->Print(variables_, 849750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org "if (this.$name$ != null && this.$name$.length > 0) {\n"); 850f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org printer->Indent(); 851f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 852f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org if (descriptor_->is_packable() && descriptor_->options().packed()) { 853f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org GenerateRepeatedDataSizeCode(printer); 854f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org printer->Print(variables_, 855f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org "output.writeRawVarint32($tag$);\n" 856f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org "output.writeRawVarint32(dataSize);\n" 857f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org "for (int i = 0; i < this.$name$.length; i++) {\n" 858f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org " output.write$capitalized_type$NoTag(this.$name$[i]);\n" 859f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org "}\n"); 860750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } else if (IsReferenceType(GetJavaType(descriptor_))) { 86143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen printer->Print(variables_, 86243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "for (int i = 0; i < this.$name$.length; i++) {\n" 86343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen " $type$ element = this.$name$[i];\n" 86443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen " if (element != null) {\n" 86543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen " output.write$capitalized_type$($number$, element);\n" 866ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org " }\n" 86743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "}\n"); 86883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org } else { 86943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen printer->Print(variables_, 8707979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org "for (int i = 0; i < this.$name$.length; i++) {\n" 87143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen " output.write$capitalized_type$($number$, this.$name$[i]);\n" 87243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "}\n"); 873e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org } 87443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 875ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org printer->Outdent(); 87643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen printer->Print("}\n"); 87783e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org} 87843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8797979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.orgvoid RepeatedPrimitiveFieldGenerator:: 88043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenGenerateSerializedSizeCode(io::Printer* printer) const { 88143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen printer->Print(variables_, 88243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "if (this.$name$ != null && this.$name$.length > 0) {\n"); 88343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen printer->Indent(); 884ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 8857979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org GenerateRepeatedDataSizeCode(printer); 88643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 88743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen printer->Print( 88843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "size += dataSize;\n"); 88943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (descriptor_->is_packable() && descriptor_->options().packed()) { 890ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org printer->Print(variables_, 891ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org "size += $tag_size$;\n" 892b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org "size += com.google.protobuf.nano.CodedOutputByteBufferNano\n" 893381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org " .computeRawVarint32Size(dataSize);\n"); 894381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org } else if (IsReferenceType(GetJavaType(descriptor_))) { 89543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen printer->Print(variables_, 89643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "size += $tag_size$ * dataCount;\n"); 89743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 89843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen printer->Print(variables_, 899ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org "size += $tag_size$ * this.$name$.length;\n"); 900ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 901b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 902381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org printer->Outdent(); 90343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 90443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen printer->Print( 90543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "}\n"); 906ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 907e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 908ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid RepeatedPrimitiveFieldGenerator:: 909ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgGenerateEqualsCode(io::Printer* printer) const { 910ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org printer->Print(variables_, 911ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org "if (!com.google.protobuf.nano.InternalNano.equals(\n" 912e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org " this.$name$, other.$name$)) {\n" 913ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org " return false;\n" 914ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org "}\n"); 915750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 916ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org 917ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid RepeatedPrimitiveFieldGenerator:: 918ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgGenerateHashCodeCode(io::Printer* printer) const { 9191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org printer->Print(variables_, 9205f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org "result = 31 * result\n" 9215f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org " + com.google.protobuf.nano.InternalNano.hashCode(this.$name$);\n"); 92201beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.org} 923750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 924750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} // namespace javanano 925750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} // namespace compiler 926750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} // namespace protobuf 927750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} // namespace google 928f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org