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