javanano_primitive_field.cc revision 35d9fd84ff1d9ecdb91156b757cc9fdcc3f25249
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Protocol Buffers - Google's data interchange format
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Copyright 2008 Google Inc.  All rights reserved.
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// http://code.google.com/p/protobuf/
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
55f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Redistribution and use in source and binary forms, with or without
65f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// modification, are permitted provided that the following conditions are
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// met:
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//     * Redistributions of source code must retain the above copyright
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// notice, this list of conditions and the following disclaimer.
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//     * Redistributions in binary form must reproduce the above
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// copyright notice, this list of conditions and the following disclaimer
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// in the documentation and/or other materials provided with the
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// distribution.
155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//     * Neither the name of Google Inc. nor the names of its
165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// contributors may be used to endorse or promote products derived from
175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// this software without specific prior written permission.
185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Author: kenton@google.com (Kenton Varda)
325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//  Based on original Protocol Buffers design by
335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//  Sanjay Ghemawat, Jeff Dean, and others.
345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <map>
365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <math.h>
375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <string>
38fa2eaabd304172dd8afc561f6156a65f8d0e442bSteve Naroff
3977ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek#include <google/protobuf/compiler/javanano/javanano_primitive_field.h>
405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <google/protobuf/stubs/common.h>
415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <google/protobuf/compiler/javanano/javanano_helpers.h>
425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <google/protobuf/io/printer.h>
435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <google/protobuf/wire_format.h>
445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <google/protobuf/stubs/strutil.h>
455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <google/protobuf/stubs/substitute.h>
465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace google {
485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace protobuf {
495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace compiler {
505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace javanano {
515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing internal::WireFormat;
535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing internal::WireFormatLite;
545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace {
565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerconst char* PrimitiveTypeName(JavaType type) {
585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (type) {
595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_INT    : return "int";
605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_LONG   : return "long";
615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_FLOAT  : return "float";
625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_DOUBLE : return "double";
635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_BOOLEAN: return "boolean";
6408ad47cbd1f81fcb31dbc731c13b885a07e12704Bill Wendling    case JAVATYPE_STRING : return "java.lang.String";
655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_BYTES  : return "byte[]";
665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_ENUM   : return NULL;
675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_MESSAGE: return NULL;
685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // No default because we want the compiler to complain if any new
70fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff    // JavaTypes are added.
715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
73ca51c97fbb10b9d48e1857e01c532493f87cd5f0Bill Wendling  GOOGLE_LOG(FATAL) << "Can't get here.";
745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return NULL;
755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool IsReferenceType(JavaType type) {
785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (type) {
795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_INT    : return false;
805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_LONG   : return false;
815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_FLOAT  : return false;
825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_DOUBLE : return false;
835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_BOOLEAN: return false;
84fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff    case JAVATYPE_STRING : return true;
855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_BYTES  : return true;
865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_ENUM   : return false;
875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_MESSAGE: return true;
885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // No default because we want the compiler to complain if any new
90ca51c97fbb10b9d48e1857e01c532493f87cd5f0Bill Wendling    // JavaTypes are added.
915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
92590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner
935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  GOOGLE_LOG(FATAL) << "Can't get here.";
945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool IsArrayType(JavaType type) {
98590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner  switch (type) {
99590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner    case JAVATYPE_INT    : return false;
1005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_LONG   : return false;
101590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner    case JAVATYPE_FLOAT  : return false;
1025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_DOUBLE : return false;
103590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner    case JAVATYPE_BOOLEAN: return false;
1045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_STRING : return false;
1055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_BYTES  : return true;
1065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_ENUM   : return false;
1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_MESSAGE: return false;
1085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // No default because we want the compiler to complain if any new
1105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // JavaTypes are added.
1115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  GOOGLE_LOG(FATAL) << "Can't get here.";
1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerconst char* GetCapitalizedType(const FieldDescriptor* field) {
1185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (field->type()) {
1195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_INT32   : return "Int32"   ;
1205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_UINT32  : return "UInt32"  ;
1215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_SINT32  : return "SInt32"  ;
1225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_FIXED32 : return "Fixed32" ;
1235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_SFIXED32: return "SFixed32";
1245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_INT64   : return "Int64"   ;
1255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_UINT64  : return "UInt64"  ;
1265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_SINT64  : return "SInt64"  ;
1275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_FIXED64 : return "Fixed64" ;
1285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_SFIXED64: return "SFixed64";
1295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_FLOAT   : return "Float"   ;
1305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_DOUBLE  : return "Double"  ;
1315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_BOOL    : return "Bool"    ;
1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_STRING  : return "String"  ;
1335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_BYTES   : return "Bytes"   ;
1345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_ENUM    : return "Enum"    ;
13577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    case FieldDescriptor::TYPE_GROUP   : return "Group"   ;
13677ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    case FieldDescriptor::TYPE_MESSAGE : return "Message" ;
13777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek
13877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    // No default because we want the compiler to complain if any new
1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // types are added.
1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
141ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner
142227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson  GOOGLE_LOG(FATAL) << "Can't get here.";
143227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson  return NULL;
144227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson}
145227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson
146227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson// For encodings with fixed sizes, returns that size in bytes.  Otherwise
147227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson// returns -1.
148227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlssonint FixedSize(FieldDescriptor::Type type) {
149227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson  switch (type) {
150227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    case FieldDescriptor::TYPE_INT32   : return -1;
151227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    case FieldDescriptor::TYPE_INT64   : return -1;
152227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    case FieldDescriptor::TYPE_UINT32  : return -1;
153227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    case FieldDescriptor::TYPE_UINT64  : return -1;
154227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    case FieldDescriptor::TYPE_SINT32  : return -1;
155227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    case FieldDescriptor::TYPE_SINT64  : return -1;
156227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    case FieldDescriptor::TYPE_FIXED32 : return WireFormatLite::kFixed32Size;
157227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    case FieldDescriptor::TYPE_FIXED64 : return WireFormatLite::kFixed64Size;
158227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    case FieldDescriptor::TYPE_SFIXED32: return WireFormatLite::kSFixed32Size;
159227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    case FieldDescriptor::TYPE_SFIXED64: return WireFormatLite::kSFixed64Size;
160227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    case FieldDescriptor::TYPE_FLOAT   : return WireFormatLite::kFloatSize;
161227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    case FieldDescriptor::TYPE_DOUBLE  : return WireFormatLite::kDoubleSize;
162227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson
163227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    case FieldDescriptor::TYPE_BOOL    : return WireFormatLite::kBoolSize;
16477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    case FieldDescriptor::TYPE_ENUM    : return -1;
16577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek
16677ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    case FieldDescriptor::TYPE_STRING  : return -1;
16777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    case FieldDescriptor::TYPE_BYTES   : return -1;
16877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    case FieldDescriptor::TYPE_GROUP   : return -1;
169227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    case FieldDescriptor::TYPE_MESSAGE : return -1;
170227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson
1715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // No default because we want the compiler to complain if any new
1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // types are added.
1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  GOOGLE_LOG(FATAL) << "Can't get here.";
1755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return -1;
1765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Returns true if the field has a default value equal to NaN.
1795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool IsDefaultNaN(const FieldDescriptor* field) {
1805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (field->type()) {
1815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_INT32   : return false;
1825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_UINT32  : return false;
1835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_SINT32  : return false;
1845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_FIXED32 : return false;
1855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_SFIXED32: return false;
1865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_INT64   : return false;
1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_UINT64  : return false;
18877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    case FieldDescriptor::TYPE_SINT64  : return false;
18977ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    case FieldDescriptor::TYPE_FIXED64 : return false;
19077ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    case FieldDescriptor::TYPE_SFIXED64: return false;
19177ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    case FieldDescriptor::TYPE_FLOAT   :
1925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return isnan(field->default_value_float());
1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_DOUBLE  :
1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return isnan(field->default_value_double());
1955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_BOOL    : return false;
1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_STRING  : return false;
1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_BYTES   : return false;
1985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_ENUM    : return false;
1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_GROUP   : return false;
2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case FieldDescriptor::TYPE_MESSAGE : return false;
2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2022eadfb638eb1bb6ccfd6fd0453e764d47e27eed9Chris Lattner    // No default because we want the compiler to complain if any new
2032eadfb638eb1bb6ccfd6fd0453e764d47e27eed9Chris Lattner    // types are added.
2045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  GOOGLE_LOG(FATAL) << "Can't get here.";
2075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Return true if the type is a that has variable length
2115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// for instance String's.
21277ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenekbool IsVariableLenType(JavaType type) {
21377ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  switch (type) {
21477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    case JAVATYPE_INT    : return false;
21577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    case JAVATYPE_LONG   : return false;
2165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_FLOAT  : return false;
2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_DOUBLE : return false;
2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_BOOLEAN: return false;
2195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_STRING : return true;
2205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_BYTES  : return true;
2215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_ENUM   : return false;
2225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case JAVATYPE_MESSAGE: return true;
2235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // No default because we want the compiler to complain if any new
2255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // JavaTypes are added.
2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  GOOGLE_LOG(FATAL) << "Can't get here.";
2295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
2305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool AllAscii(const string& text) {
23377ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  for (int i = 0; i < text.size(); i++) {
23477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    if ((text[i] & 0x80) != 0) {
23577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek      return false;
23677ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    }
2375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return true;
239e6a82b2c29ad05534841e5f8fd033fb17b6f61e2Ted Kremenek}
240e6a82b2c29ad05534841e5f8fd033fb17b6f61e2Ted Kremenek
241e6a82b2c29ad05534841e5f8fd033fb17b6f61e2Ted Kremenekvoid SetPrimitiveVariables(const FieldDescriptor* descriptor, const Params params,
242e6a82b2c29ad05534841e5f8fd033fb17b6f61e2Ted Kremenek                           map<string, string>* variables) {
2435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  (*variables)["name"] =
2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    RenameJavaKeywords(UnderscoresToCamelCase(descriptor));
2455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  (*variables)["capitalized_name"] =
2465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    RenameJavaKeywords(UnderscoresToCapitalizedCamelCase(descriptor));
2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  (*variables)["number"] = SimpleItoa(descriptor->number());
2485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  (*variables)["type"] = PrimitiveTypeName(GetJavaType(descriptor));
2495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  (*variables)["default"] = DefaultValue(params, descriptor);
2505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  (*variables)["default_constant"] = FieldDefaultConstantName(descriptor);
2515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // For C++-string types (string and bytes), we might need to have
2525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // the generated code do the unicode decoding (see comments in
2535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // InternalNano.java for gory details.). We would like to do this
2545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // once into a "private static final" field and re-use that from
2555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // then on.
2565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (descriptor->cpp_type() == FieldDescriptor::CPPTYPE_STRING &&
2575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      !descriptor->default_value_string().empty()) {
2585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    string default_value;
2595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (descriptor->type() == FieldDescriptor::TYPE_BYTES) {
2605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      default_value = strings::Substitute(
2615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer          "com.google.protobuf.nano.InternalNano.bytesDefaultValue(\"$0\")",
2625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer          CEscape(descriptor->default_value_string()));
2635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    } else {
2645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      if (AllAscii(descriptor->default_value_string())) {
2655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // All chars are ASCII.  In this case CEscape() works fine.
2665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        default_value = "\"" + CEscape(descriptor->default_value_string()) + "\"";
26777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek      } else {
26877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek        default_value = strings::Substitute(
26977ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek            "com.google.protobuf.nano.InternalNano.stringDefaultValue(\"$0\")",
27077ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek            CEscape(descriptor->default_value_string()));
2715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      }
2725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
2735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    (*variables)["default_constant_value"] = default_value;
2745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  (*variables)["boxed_type"] = BoxedPrimitiveTypeName(GetJavaType(descriptor));
2765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  (*variables)["capitalized_type"] = GetCapitalizedType(descriptor);
2775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  (*variables)["tag"] = SimpleItoa(WireFormat::MakeTag(descriptor));
2785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  (*variables)["tag_size"] = SimpleItoa(
2795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      WireFormat::TagSize(descriptor->number(), descriptor->type()));
2805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (IsReferenceType(GetJavaType(descriptor))) {
2815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    (*variables)["null_check"] =
2825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        "  if (value == null) {\n"
2835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        "    throw new NullPointerException();\n"
2845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        "  }\n";
2855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
2865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    (*variables)["null_check"] = "";
2875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  int fixed_size = FixedSize(descriptor->type());
2895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (fixed_size != -1) {
29077ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    (*variables)["fixed_size"] = SimpleItoa(fixed_size);
29177ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  }
29277ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  (*variables)["message_name"] = descriptor->containing_type()->name();
29377ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  (*variables)["empty_array_name"] = EmptyArrayName(params, descriptor);
2945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}  // namespace
2965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// ===================================================================
2985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerPrimitiveFieldGenerator::
3005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerPrimitiveFieldGenerator(const FieldDescriptor* descriptor, const Params& params)
3015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  : FieldGenerator(params), descriptor_(descriptor) {
30213d130c3d225cdb5b1e6d9e86cea12eea718c707Chris Lattner  SetPrimitiveVariables(descriptor, params, &variables_);
3035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerPrimitiveFieldGenerator::~PrimitiveFieldGenerator() {}
3065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid PrimitiveFieldGenerator::
3085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerGenerateMembers(io::Printer* printer) const {
3095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (variables_.find("default_constant_value") != variables_.end()) {
3105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Those primitive types that need a saved default.
3115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    printer->Print(variables_,
3125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "private static final $type$ $default_constant$ = $default_constant_value$;\n");
3135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (descriptor_->type() == FieldDescriptor::TYPE_BYTES) {
3145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      printer->Print(variables_,
3155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        "public $type$ $name$ = $default$.clone();\n");
3165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    } else {
3175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      printer->Print(variables_,
3185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        "public $type$ $name$ = $default$;\n");
3195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
3205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
3215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    printer->Print(variables_,
3225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "public $type$ $name$ = $default$;\n");
3235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (params_.generate_has()) {
3265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    printer->Print(variables_,
3275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "public boolean has$capitalized_name$ = false;\n");
3285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid PrimitiveFieldGenerator::
3325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerGenerateParsingCode(io::Printer* printer) const {
3335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  printer->Print(variables_,
3345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    "this.$name$ = input.read$capitalized_type$();\n");
3355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (params_.generate_has()) {
3375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    printer->Print(variables_,
3385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "has$capitalized_name$ = true;\n");
3395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid PrimitiveFieldGenerator::
3435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerGenerateSerializationConditional(io::Printer* printer) const {
3445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (params_.generate_has()) {
3455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    printer->Print(variables_,
3465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "if (has$capitalized_name$ || ");
3475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
3485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    printer->Print(variables_,
3495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "if (");
3505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (IsArrayType(GetJavaType(descriptor_))) {
3525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    printer->Print(variables_,
3535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "!java.util.Arrays.equals(this.$name$, $default$)) {\n");
3545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else if (IsReferenceType(GetJavaType(descriptor_))) {
3555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    printer->Print(variables_,
3565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "!this.$name$.equals($default$)) {\n");
35777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  } else if (IsDefaultNaN(descriptor_)) {
35877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    printer->Print(variables_,
35977ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek      "!$capitalized_type$.isNaN(this.$name$)) {\n");
36077ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  } else {
3615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    printer->Print(variables_,
3625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "this.$name$ != $default$) {\n");
3635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid PrimitiveFieldGenerator::
3675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerGenerateSerializationCode(io::Printer* printer) const {
3685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (descriptor_->is_required()) {
3695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    printer->Print(variables_,
3705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "output.write$capitalized_type$($number$, this.$name$);\n");
3715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
3725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    GenerateSerializationConditional(printer);
3735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    printer->Print(variables_,
3745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "  output.write$capitalized_type$($number$, this.$name$);\n"
3755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "}\n");
3765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
37776e773a443be9f006610f46529e07d4c8d857680Chris Lattner}
37876e773a443be9f006610f46529e07d4c8d857680Chris Lattner
3795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid PrimitiveFieldGenerator::
3805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerGenerateSerializedSizeCode(io::Printer* printer) const {
3815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (descriptor_->is_required()) {
3825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    printer->Print(variables_,
3835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "size += com.google.protobuf.nano.CodedOutputByteBufferNano\n"
3845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "    .compute$capitalized_type$Size($number$, this.$name$);\n");
38577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  } else {
38677ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    GenerateSerializationConditional(printer);
38777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    printer->Print(variables_,
38877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek      "  size += com.google.protobuf.nano.CodedOutputByteBufferNano\n"
3895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "      .compute$capitalized_type$Size($number$, this.$name$);\n"
3905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "}\n");
3915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstring PrimitiveFieldGenerator::GetBoxedType() const {
3955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return BoxedPrimitiveTypeName(GetJavaType(descriptor_));
3965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
39777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek
39877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// ===================================================================
3995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerRepeatedPrimitiveFieldGenerator::
4012324512285caac0332bbbc6e4cab6245d2a370a1Ted KremenekRepeatedPrimitiveFieldGenerator(const FieldDescriptor* descriptor, const Params& params)
4025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  : FieldGenerator(params), descriptor_(descriptor) {
4035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SetPrimitiveVariables(descriptor, params, &variables_);
40477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek}
40577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek
40677ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted KremenekRepeatedPrimitiveFieldGenerator::~RepeatedPrimitiveFieldGenerator() {}
40777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek
4085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid RepeatedPrimitiveFieldGenerator::
4092324512285caac0332bbbc6e4cab6245d2a370a1Ted KremenekGenerateMembers(io::Printer* printer) const {
4102324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  printer->Print(variables_,
4112324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek    "public $type$[] $name$ = $default$;\n");
4122324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  if (descriptor_->options().packed()) {
4132324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek    printer->Print(variables_,
41477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek      "private int $name$MemoizedSerializedSize;\n");
41577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  }
41677ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek}
41777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek
41877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenekvoid RepeatedPrimitiveFieldGenerator::
41977ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted KremenekGenerateParsingCode(io::Printer* printer) const {
4202324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  // First, figure out the length of the array, then parse.
42177ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  if (descriptor_->options().packed()) {
42277ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    printer->Print(variables_,
42377ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek      "int length = input.readRawVarint32();\n"
42477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek      "int limit = input.pushLimit(length);\n"
4252324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek      "// First pass to compute array length.\n"
42677ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek      "int arrayLength = 0;\n"
4272324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek      "int startPos = input.getPosition();\n"
4282324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek      "while (input.getBytesUntilLimit() > 0) {\n"
42977ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek      "  input.read$capitalized_type$();\n"
43077ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek      "  arrayLength++;\n"
4312324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek      "}\n"
4322324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek      "input.rewindToPosition(startPos);\n"
43377ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek      "this.$name$ = new $type$[arrayLength];\n"
43477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek      "for (int i = 0; i < arrayLength; i++) {\n"
43577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek      "  this.$name$[i] = input.read$capitalized_type$();\n"
43677ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek      "}\n"
4375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "input.popLimit(limit);\n");
4385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
43977ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    printer->Print(variables_,
4405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "int arrayLength = com.google.protobuf.nano.WireFormatNano.getRepeatedFieldArrayLength(input, $tag$);\n"
4415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "int i = this.$name$.length;\n");
4425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (GetJavaType(descriptor_) == JAVATYPE_BYTES) {
4445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      printer->Print(variables_,
4455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        "byte[][] newArray = new byte[i + arrayLength][];\n"
4465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        "System.arraycopy(this.$name$, 0, newArray, 0, i);\n"
44777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek        "this.$name$ = newArray;\n");
44877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    } else {
44977ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek      printer->Print(variables_,
45077ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek        "$type$[] newArray = new $type$[i + arrayLength];\n"
4515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        "System.arraycopy(this.$name$, 0, newArray, 0, i);\n"
4525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        "this.$name$ = newArray;\n");
4535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
4545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    printer->Print(variables_,
4555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "for (; i < this.$name$.length - 1; i++) {\n"
4565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "  this.$name$[i] = input.read$capitalized_type$();\n"
45777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek      "  input.readTag();\n"
45877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek      "}\n"
4595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "// Last one without readTag.\n"
4605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "this.$name$[i] = input.read$capitalized_type$();\n");
4615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
4625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
4635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid RepeatedPrimitiveFieldGenerator::
46577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted KremenekGenerateSerializationCode(io::Printer* printer) const {
4665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (descriptor_->options().packed()) {
4675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    printer->Print(variables_,
46877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek      "if (this.$name$.length > 0) {\n"
46977ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek      "  output.writeRawVarint32($tag$);\n"
4705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "  output.writeRawVarint32($name$MemoizedSerializedSize);\n"
4715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "}\n");
4725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    printer->Print(variables_,
4735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "for ($type$ element : this.$name$) {\n"
4745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "  output.write$capitalized_type$NoTag(element);\n"
4755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "}\n");
4765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
4775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    printer->Print(variables_,
47877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek      "for ($type$ element : this.$name$) {\n"
4795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "  output.write$capitalized_type$($number$, element);\n"
4805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "}\n");
4815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
48277ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek}
4835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid RepeatedPrimitiveFieldGenerator::
4855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerGenerateSerializedSizeCode(io::Printer* printer) const {
4865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  printer->Print(variables_,
4875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    "if (this.$name$.length > 0) {\n");
4885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  printer->Indent();
48913b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff
49013b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff  if (FixedSize(descriptor_->type()) == -1) {
4915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    printer->Print(variables_,
49277ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek      "int dataSize = 0;\n"
4935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "for ($type$ element : this.$name$) {\n"
4945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "  dataSize += com.google.protobuf.nano.CodedOutputByteBufferNano\n"
4955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "    .compute$capitalized_type$SizeNoTag(element);\n"
4965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "}\n");
4975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
4985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    printer->Print(variables_,
49977ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek      "int dataSize = $fixed_size$ * this.$name$.length;\n");
50077ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  }
50177ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek
50277ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  printer->Print(
5035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    "size += dataSize;\n");
5045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (descriptor_->options().packed()) {
5055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // cache the data size for packed fields.
5065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    printer->Print(variables_,
5075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "size += $tag_size$;\n"
5085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "size += com.google.protobuf.nano.CodedOutputByteBufferNano\n"
5095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "  .computeRawVarint32Size(dataSize);\n"
5105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "$name$MemoizedSerializedSize = dataSize;\n");
5115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
5125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    printer->Print(variables_,
5135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        "size += $tag_size$ * this.$name$.length;\n");
5145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
5155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  printer->Outdent();
5175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // set cached size to 0 for empty packed fields.
5195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (descriptor_->options().packed()) {
5205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    printer->Print(variables_,
5215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "} else {\n"
5225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "  $name$MemoizedSerializedSize = 0;\n"
5235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "}\n");
5245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
5255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    printer->Print(
5265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      "}\n");
5275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
5285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstring RepeatedPrimitiveFieldGenerator::GetBoxedType() const {
5315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return BoxedPrimitiveTypeName(GetJavaType(descriptor_));
5326481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattner}
533cb92a118145c2a425666068d37c4049c38e24914Chris Lattner
534cb92a118145c2a425666068d37c4049c38e24914Chris Lattner}  // namespace javanano
53531a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff}  // namespace compiler
5366481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattner}  // namespace protobuf
537fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff}  // namespace google
538fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff