Home | History | Annotate | Download | only in binary
      1 // Protocol Buffers - Google's data interchange format
      2 // Copyright 2008 Google Inc.  All rights reserved.
      3 // https://developers.google.com/protocol-buffers/
      4 //
      5 // Redistribution and use in source and binary forms, with or without
      6 // modification, are permitted provided that the following conditions are
      7 // met:
      8 //
      9 //     * Redistributions of source code must retain the above copyright
     10 // notice, this list of conditions and the following disclaimer.
     11 //     * Redistributions in binary form must reproduce the above
     12 // copyright notice, this list of conditions and the following disclaimer
     13 // in the documentation and/or other materials provided with the
     14 // distribution.
     15 //     * Neither the name of Google Inc. nor the names of its
     16 // contributors may be used to endorse or promote products derived from
     17 // this software without specific prior written permission.
     18 //
     19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30 
     31 /**
     32  * @fileoverview This file contains constants and typedefs used by
     33  * jspb.BinaryReader and BinaryWriter.
     34  *
     35  * @author aappleby (a] google.com (Austin Appleby)
     36  */
     37 
     38 goog.provide('jspb.AnyFieldType');
     39 goog.provide('jspb.BinaryConstants');
     40 goog.provide('jspb.BinaryMessage');
     41 goog.provide('jspb.BuilderFunction');
     42 goog.provide('jspb.ByteSource');
     43 goog.provide('jspb.ClonerFunction');
     44 goog.provide('jspb.ComparerFunction');
     45 goog.provide('jspb.ConstBinaryMessage');
     46 goog.provide('jspb.PrunerFunction');
     47 goog.provide('jspb.ReaderFunction');
     48 goog.provide('jspb.RecyclerFunction');
     49 goog.provide('jspb.RepeatedFieldType');
     50 goog.provide('jspb.ScalarFieldType');
     51 goog.provide('jspb.WriterFunction');
     52 
     53 
     54 goog.forwardDeclare('jspb.Message');
     55 goog.forwardDeclare('jsproto.BinaryExtension');
     56 
     57 
     58 
     59 /**
     60  * Base interface class for all const messages. Does __not__ define any
     61  * methods, as doing so on a widely-used interface defeats dead-code
     62  * elimination.
     63  * @interface
     64  */
     65 jspb.ConstBinaryMessage = function() {};
     66 
     67 
     68 
     69 /**
     70  * Base interface class for all messages. Does __not__ define any methods, as
     71  * doing so on a widely-used interface defeats dead-code elimination.
     72  * @interface
     73  * @extends {jspb.ConstBinaryMessage}
     74  */
     75 jspb.BinaryMessage = function() {};
     76 
     77 
     78 /**
     79  * The types convertible to Uint8Arrays. Strings are assumed to be
     80  * base64-encoded.
     81  * @typedef {ArrayBuffer|Uint8Array|Array<number>|string}
     82  */
     83 jspb.ByteSource;
     84 
     85 
     86 /**
     87  * A scalar field in jspb can be a boolean, number, or string.
     88  * @typedef {boolean|number|string}
     89  */
     90 jspb.ScalarFieldType;
     91 
     92 
     93 /**
     94  * A repeated field in jspb is an array of scalars, blobs, or messages.
     95  * @typedef {!Array<jspb.ScalarFieldType>|
     96              !Array<!Uint8Array>|
     97              !Array<!jspb.BinaryMessage>}
     98  */
     99 jspb.RepeatedFieldType;
    100 
    101 
    102 /**
    103  * A field in jspb can be a scalar, a block of bytes, another proto, or an
    104  * array of any of the above.
    105  * @typedef {jspb.ScalarFieldType|
    106              jspb.RepeatedFieldType|
    107              !Uint8Array|
    108              !jspb.BinaryMessage|
    109              !jsproto.BinaryExtension}
    110  */
    111 jspb.AnyFieldType;
    112 
    113 
    114 /**
    115  * A builder function creates an instance of a message object.
    116  * @typedef {function():!jspb.BinaryMessage}
    117  */
    118 jspb.BuilderFunction;
    119 
    120 
    121 /**
    122  * A cloner function creates a deep copy of a message object.
    123  * @typedef {function(jspb.ConstBinaryMessage):jspb.BinaryMessage}
    124  */
    125 jspb.ClonerFunction;
    126 
    127 
    128 /**
    129  * A recycler function destroys an instance of a message object.
    130  * @typedef {function(!jspb.BinaryMessage):void}
    131  */
    132 jspb.RecyclerFunction;
    133 
    134 
    135 /**
    136  * A reader function initializes a message using data from a BinaryReader.
    137  * @typedef {function(!jspb.BinaryMessage, !jspb.BinaryReader):void}
    138  */
    139 jspb.ReaderFunction;
    140 
    141 
    142 /**
    143  * A writer function serializes a message to a BinaryWriter.
    144  * @typedef {!function(!jspb.Message, !jspb.BinaryWriter):void |
    145  *           !function(!jspb.ConstBinaryMessage, !jspb.BinaryWriter):void}
    146  */
    147 jspb.WriterFunction;
    148 
    149 
    150 /**
    151  * A pruner function removes default-valued fields and empty submessages from a
    152  * message and returns either the pruned message or null if the entire message
    153  * was pruned away.
    154  * @typedef {function(?jspb.BinaryMessage):?jspb.BinaryMessage}
    155  */
    156 jspb.PrunerFunction;
    157 
    158 
    159 /**
    160  * A comparer function returns true if two protos are equal.
    161  * @typedef {!function(?jspb.ConstBinaryMessage,
    162  *                     ?jspb.ConstBinaryMessage):boolean}
    163  */
    164 jspb.ComparerFunction;
    165 
    166 
    167 /**
    168  * Field type codes, taken from proto2/public/wire_format_lite.h.
    169  * @enum {number}
    170  */
    171 jspb.BinaryConstants.FieldType = {
    172   INVALID: -1,
    173   DOUBLE: 1,
    174   FLOAT: 2,
    175   INT64: 3,
    176   UINT64: 4,
    177   INT32: 5,
    178   FIXED64: 6,
    179   FIXED32: 7,
    180   BOOL: 8,
    181   STRING: 9,
    182   GROUP: 10,
    183   MESSAGE: 11,
    184   BYTES: 12,
    185   UINT32: 13,
    186   ENUM: 14,
    187   SFIXED32: 15,
    188   SFIXED64: 16,
    189   SINT32: 17,
    190   SINT64: 18,
    191 
    192   // Extended types for Javascript
    193 
    194   FHASH64: 30, // 64-bit hash string, fixed-length encoding.
    195   VHASH64: 31  // 64-bit hash string, varint encoding.
    196 };
    197 
    198 
    199 /**
    200  * Wire-format type codes, taken from proto2/public/wire_format_lite.h.
    201  * @enum {number}
    202  */
    203 jspb.BinaryConstants.WireType = {
    204   INVALID: -1,
    205   VARINT: 0,
    206   FIXED64: 1,
    207   DELIMITED: 2,
    208   START_GROUP: 3,
    209   END_GROUP: 4,
    210   FIXED32: 5
    211 };
    212 
    213 
    214 /**
    215  * Translates field type to wire type.
    216  * @param {jspb.BinaryConstants.FieldType} fieldType
    217  * @return {jspb.BinaryConstants.WireType}
    218  */
    219 jspb.BinaryConstants.FieldTypeToWireType = function(fieldType) {
    220   var fieldTypes = jspb.BinaryConstants.FieldType;
    221   var wireTypes = jspb.BinaryConstants.WireType;
    222   switch (fieldType) {
    223     case fieldTypes.INT32:
    224     case fieldTypes.INT64:
    225     case fieldTypes.UINT32:
    226     case fieldTypes.UINT64:
    227     case fieldTypes.SINT32:
    228     case fieldTypes.SINT64:
    229     case fieldTypes.BOOL:
    230     case fieldTypes.ENUM:
    231     case fieldTypes.VHASH64:
    232       return wireTypes.VARINT;
    233 
    234     case fieldTypes.DOUBLE:
    235     case fieldTypes.FIXED64:
    236     case fieldTypes.SFIXED64:
    237     case fieldTypes.FHASH64:
    238       return wireTypes.FIXED64;
    239 
    240     case fieldTypes.STRING:
    241     case fieldTypes.MESSAGE:
    242     case fieldTypes.BYTES:
    243       return wireTypes.DELIMITED;
    244 
    245     case fieldTypes.FLOAT:
    246     case fieldTypes.FIXED32:
    247     case fieldTypes.SFIXED32:
    248       return wireTypes.FIXED32;
    249 
    250     case fieldTypes.INVALID:
    251     case fieldTypes.GROUP:
    252     default:
    253       return wireTypes.INVALID;
    254   }
    255 };
    256 
    257 
    258 /**
    259  * Flag to indicate a missing field.
    260  * @const {number}
    261  */
    262 jspb.BinaryConstants.INVALID_FIELD_NUMBER = -1;
    263 
    264 
    265 /**
    266  * The smallest denormal float32 value.
    267  * @const {number}
    268  */
    269 jspb.BinaryConstants.FLOAT32_EPS = 1.401298464324817e-45;
    270 
    271 
    272 /**
    273  * The smallest normal float64 value.
    274  * @const {number}
    275  */
    276 jspb.BinaryConstants.FLOAT32_MIN = 1.1754943508222875e-38;
    277 
    278 
    279 /**
    280  * The largest finite float32 value.
    281  * @const {number}
    282  */
    283 jspb.BinaryConstants.FLOAT32_MAX = 3.4028234663852886e+38;
    284 
    285 
    286 /**
    287  * The smallest denormal float64 value.
    288  * @const {number}
    289  */
    290 jspb.BinaryConstants.FLOAT64_EPS = 5e-324;
    291 
    292 
    293 /**
    294  * The smallest normal float64 value.
    295  * @const {number}
    296  */
    297 jspb.BinaryConstants.FLOAT64_MIN = 2.2250738585072014e-308;
    298 
    299 
    300 /**
    301  * The largest finite float64 value.
    302  * @const {number}
    303  */
    304 jspb.BinaryConstants.FLOAT64_MAX = 1.7976931348623157e+308;
    305 
    306 
    307 /**
    308  * Convenience constant equal to 2^20.
    309  * @const {number}
    310  */
    311 jspb.BinaryConstants.TWO_TO_20 = 1048576;
    312 
    313 
    314 /**
    315  * Convenience constant equal to 2^23.
    316  * @const {number}
    317  */
    318 jspb.BinaryConstants.TWO_TO_23 = 8388608;
    319 
    320 
    321 /**
    322  * Convenience constant equal to 2^31.
    323  * @const {number}
    324  */
    325 jspb.BinaryConstants.TWO_TO_31 = 2147483648;
    326 
    327 
    328 /**
    329  * Convenience constant equal to 2^32.
    330  * @const {number}
    331  */
    332 jspb.BinaryConstants.TWO_TO_32 = 4294967296;
    333 
    334 
    335 /**
    336  * Convenience constant equal to 2^52.
    337  * @const {number}
    338  */
    339 jspb.BinaryConstants.TWO_TO_52 = 4503599627370496;
    340 
    341 
    342 /**
    343  * Convenience constant equal to 2^63.
    344  * @const {number}
    345  */
    346 jspb.BinaryConstants.TWO_TO_63 = 9223372036854775808;
    347 
    348 
    349 /**
    350  * Convenience constant equal to 2^64.
    351  * @const {number}
    352  */
    353 jspb.BinaryConstants.TWO_TO_64 = 18446744073709551616;
    354 
    355 
    356 /**
    357  * Eight-character string of zeros, used as the default 64-bit hash value.
    358  * @const {string}
    359  */
    360 jspb.BinaryConstants.ZERO_HASH = '\0\0\0\0\0\0\0\0';
    361