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