1b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Protocol Buffers - Google's data interchange format
2b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Copyright 2008 Google Inc.  All rights reserved.
3b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// https://developers.google.com/protocol-buffers/
4b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//
5b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Redistribution and use in source and binary forms, with or without
6b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// modification, are permitted provided that the following conditions are
7b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// met:
8b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//
9b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//     * Redistributions of source code must retain the above copyright
10b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// notice, this list of conditions and the following disclaimer.
11b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//     * Redistributions in binary form must reproduce the above
12b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// copyright notice, this list of conditions and the following disclaimer
13b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// in the documentation and/or other materials provided with the
14b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// distribution.
15b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//     * Neither the name of Google Inc. nor the names of its
16b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// contributors may be used to endorse or promote products derived from
17b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// this software without specific prior written permission.
18b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//
19b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
31b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
32b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @fileoverview This file contains utilities for converting binary,
33b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * wire-format protocol buffers into Javascript data structures.
34b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
35b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * jspb's BinaryReader class wraps the BinaryDecoder class to add methods
36b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * that understand the protocol buffer syntax and can do the type checking and
37b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * bookkeeping necessary to parse trees of nested messages.
38b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
39b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Major caveat - Users of this library _must_ keep their Javascript proto
40b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * parsing code in sync with the original .proto file - presumably you'll be
41b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * using the typed jspb code generator, but if you bypass that you'll need
42b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * to keep things in sync by hand.
43b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
44b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @author aappleby@google.com (Austin Appleby)
45b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
46b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
47b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammergoog.provide('jspb.BinaryReader');
48b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
49b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammergoog.require('goog.asserts');
50b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammergoog.require('jspb.BinaryConstants');
51b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammergoog.require('jspb.BinaryDecoder');
52b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
53b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
54b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
55b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
56b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * BinaryReader implements the decoders for all the wire types specified in
57b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * https://developers.google.com/protocol-buffers/docs/encoding.
58b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
59b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {jspb.ByteSource=} opt_bytes The bytes we're reading from.
60b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {number=} opt_start The optional offset to start reading at.
61b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {number=} opt_length The optional length of the block to read -
62b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *     we'll throw an assertion if we go off the end of the block.
63b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @constructor
64b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @struct
65b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
66b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader = function(opt_bytes, opt_start, opt_length) {
67b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  /**
68b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * Wire-format decoder.
69b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * @private {!jspb.BinaryDecoder}
70b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   */
71b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.decoder_ = jspb.BinaryDecoder.alloc(opt_bytes, opt_start, opt_length);
72b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
73b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  /**
74b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * Cursor immediately before the field tag.
75b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * @private {number}
76b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   */
77b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.fieldCursor_ = this.decoder_.getCursor();
78b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
79b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  /**
80b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * Field number of the next field in the buffer, filled in by nextField().
81b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * @private {number}
82b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   */
83b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.nextField_ = jspb.BinaryConstants.INVALID_FIELD_NUMBER;
84b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
85b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  /**
86b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * Wire type of the next proto field in the buffer, filled in by
87b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * nextField().
88b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * @private {jspb.BinaryConstants.WireType}
89b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   */
90b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.nextWireType_ = jspb.BinaryConstants.WireType.INVALID;
91b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
92b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  /**
93b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * Set to true if this reader encountered an error due to corrupt data.
94b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * @private {boolean}
95b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   */
96b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.error_ = false;
97b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
98b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  /**
99b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * User-defined reader callbacks.
100b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * @private {Object.<string, function(!jspb.BinaryReader):*>}
101b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   */
102b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.readCallbacks_ = null;
103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
104b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
105b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
106b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
107b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Global pool of BinaryReader instances.
108b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @private {!Array.<!jspb.BinaryReader>}
109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.instanceCache_ = [];
111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
112b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
113b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
114b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Pops an instance off the instance cache, or creates one if the cache is
115b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * empty.
116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {jspb.ByteSource=} opt_bytes The bytes we're reading from.
117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {number=} opt_start The optional offset to start reading at.
118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {number=} opt_length The optional length of the block to read -
119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *     we'll throw an assertion if we go off the end of the block.
120b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!jspb.BinaryReader}
121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.alloc =
123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    function(opt_bytes, opt_start, opt_length) {
124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (jspb.BinaryReader.instanceCache_.length) {
125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    var newReader = jspb.BinaryReader.instanceCache_.pop();
126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (opt_bytes) {
127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      newReader.decoder_.setBlock(opt_bytes, opt_start, opt_length);
128b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
129b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return newReader;
130b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else {
131b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return new jspb.BinaryReader(opt_bytes, opt_start, opt_length);
132b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
133b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
134b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
135b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
136b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
137b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Alias for the above method.
138b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {jspb.ByteSource=} opt_bytes The bytes we're reading from.
139b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {number=} opt_start The optional offset to start reading at.
140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {number=} opt_length The optional length of the block to read -
141b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *     we'll throw an assertion if we go off the end of the block.
142b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!jspb.BinaryReader}
143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
144b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.alloc = jspb.BinaryReader.alloc;
145b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
146b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
147b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
148b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Puts this instance back in the instance cache.
149b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
150b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.free = function() {
151b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.decoder_.clear();
152b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.nextField_ = jspb.BinaryConstants.INVALID_FIELD_NUMBER;
153b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.nextWireType_ = jspb.BinaryConstants.WireType.INVALID;
154b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.error_ = false;
155b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.readCallbacks_ = null;
156b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
157b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (jspb.BinaryReader.instanceCache_.length < 100) {
158b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    jspb.BinaryReader.instanceCache_.push(this);
159b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
160b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
161b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
162b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
163b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
164b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Returns the cursor immediately before the current field's tag.
165b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {number} The internal read cursor.
166b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
167b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.getFieldCursor = function() {
168b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.fieldCursor_;
169b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
170b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
171b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
172b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
173b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Returns the internal read cursor.
174b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {number} The internal read cursor.
175b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
176b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.getCursor = function() {
177b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.getCursor();
178b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
179b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
180b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
181b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
182b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Returns the raw buffer.
183b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {?Uint8Array} The raw buffer.
184b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
185b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.getBuffer = function() {
186b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.getBuffer();
187b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
188b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
189b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
190b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
191b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {number} The field number of the next field in the buffer, or
192b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *     INVALID_FIELD_NUMBER if there is no next field.
193b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
194b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.getFieldNumber = function() {
195b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.nextField_;
196b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
197b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
198b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
199b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
200b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {jspb.BinaryConstants.WireType} The wire type of the next field
201b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *     in the stream, or WireType.INVALID if there is no next field.
202b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
203b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.getWireType = function() {
204b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.nextWireType_;
205b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
206b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
207b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
208b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
209b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {boolean} Whether the current wire type is an end-group tag. Used as
210b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * an exit condition in decoder loops in generated code.
211b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
212b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.isEndGroup = function() {
213b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.nextWireType_ == jspb.BinaryConstants.WireType.END_GROUP;
214b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
215b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
216b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
217b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
218b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Returns true if this reader hit an error due to corrupt data.
219b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {boolean}
220b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
221b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.getError = function() {
222b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.error_ || this.decoder_.getError();
223b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
224b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
225b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
226b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
227b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Points this reader at a new block of bytes.
228b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {!Uint8Array} bytes The block of bytes we're reading from.
229b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {number} start The offset to start reading at.
230b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {number} length The length of the block to read.
231b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
232b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.setBlock = function(bytes, start, length) {
233b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.decoder_.setBlock(bytes, start, length);
234b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.nextField_ = jspb.BinaryConstants.INVALID_FIELD_NUMBER;
235b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.nextWireType_ = jspb.BinaryConstants.WireType.INVALID;
236b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
237b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
238b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
239b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
240b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Rewinds the stream cursor to the beginning of the buffer and resets all
241b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * internal state.
242b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
243b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.reset = function() {
244b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.decoder_.reset();
245b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.nextField_ = jspb.BinaryConstants.INVALID_FIELD_NUMBER;
246b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.nextWireType_ = jspb.BinaryConstants.WireType.INVALID;
247b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
248b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
249b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
250b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
251b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Advances the stream cursor by the given number of bytes.
252b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {number} count The number of bytes to advance by.
253b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
254b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.advance = function(count) {
255b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.decoder_.advance(count);
256b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
257b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
258b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
259b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
260b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads the next field header in the stream if there is one, returns true if
261b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * we saw a valid field header or false if we've read the whole stream.
262b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Throws an error if we encountered a deprecated START_GROUP/END_GROUP field.
263b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {boolean} True if the stream contains more fields.
264b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
265b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.nextField = function() {
266b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // If we're at the end of the block, there are no more fields.
267b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (this.decoder_.atEnd()) {
268b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return false;
269b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
270b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
271b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // If we hit an error decoding the previous field, stop now before we
272b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // try to decode anything else
273b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (this.getError()) {
274b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    goog.asserts.fail('Decoder hit an error');
275b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return false;
276b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
277b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
278b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Otherwise just read the header of the next field.
279b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.fieldCursor_ = this.decoder_.getCursor();
280b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var header = this.decoder_.readUnsignedVarint32();
281b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
282b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var nextField = header >>> 3;
283b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var nextWireType = /** @type {jspb.BinaryConstants.WireType} */
284b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      (header & 0x7);
285b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
286b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // If the wire type isn't one of the valid ones, something's broken.
287b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (nextWireType != jspb.BinaryConstants.WireType.VARINT &&
288b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      nextWireType != jspb.BinaryConstants.WireType.FIXED32 &&
289b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      nextWireType != jspb.BinaryConstants.WireType.FIXED64 &&
290b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      nextWireType != jspb.BinaryConstants.WireType.DELIMITED &&
291b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      nextWireType != jspb.BinaryConstants.WireType.START_GROUP &&
292b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      nextWireType != jspb.BinaryConstants.WireType.END_GROUP) {
293b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    goog.asserts.fail('Invalid wire type');
294b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    this.error_ = true;
295b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return false;
296b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
297b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
298b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.nextField_ = nextField;
299b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.nextWireType_ = nextWireType;
300b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
301b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return true;
302b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
303b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
304b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
305b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
306b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Winds the reader back to just before this field's header.
307b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
308b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.unskipHeader = function() {
309b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.decoder_.unskipVarint((this.nextField_ << 3) | this.nextWireType_);
310b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
311b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
312b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
313b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
314b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Skips all contiguous fields whose header matches the one we just read.
315b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
316b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.skipMatchingFields = function() {
317b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var field = this.nextField_;
318b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.unskipHeader();
319b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
320b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  while (this.nextField() && (this.getFieldNumber() == field)) {
321b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    this.skipField();
322b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
323b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
324b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!this.decoder_.atEnd()) {
325b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    this.unskipHeader();
326b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
327b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
328b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
329b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
330b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
331b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Skips over the next varint field in the binary stream.
332b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
333b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.skipVarintField = function() {
334b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (this.nextWireType_ != jspb.BinaryConstants.WireType.VARINT) {
335b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    goog.asserts.fail('Invalid wire type for skipVarintField');
336b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    this.skipField();
337b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return;
338b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
339b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
340b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.decoder_.skipVarint();
341b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
342b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
343b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
344b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
345b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Skips over the next delimited field in the binary stream.
346b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
347b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.skipDelimitedField = function() {
348b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (this.nextWireType_ != jspb.BinaryConstants.WireType.DELIMITED) {
349b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    goog.asserts.fail('Invalid wire type for skipDelimitedField');
350b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    this.skipField();
351b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return;
352b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
353b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
354b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var length = this.decoder_.readUnsignedVarint32();
355b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.decoder_.advance(length);
356b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
357b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
358b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
359b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
360b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Skips over the next fixed32 field in the binary stream.
361b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
362b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.skipFixed32Field = function() {
363b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (this.nextWireType_ != jspb.BinaryConstants.WireType.FIXED32) {
364b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    goog.asserts.fail('Invalid wire type for skipFixed32Field');
365b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    this.skipField();
366b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return;
367b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
368b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
369b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.decoder_.advance(4);
370b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
371b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
372b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
373b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
374b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Skips over the next fixed64 field in the binary stream.
375b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
376b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.skipFixed64Field = function() {
377b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (this.nextWireType_ != jspb.BinaryConstants.WireType.FIXED64) {
378b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    goog.asserts.fail('Invalid wire type for skipFixed64Field');
379b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    this.skipField();
380b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return;
381b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
382b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
383b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.decoder_.advance(8);
384b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
385b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
386b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
387b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
388b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Skips over the next group field in the binary stream.
389b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
390b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.skipGroup = function() {
391b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Keep a stack of start-group tags that must be matched by end-group tags.
392b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var nestedGroups = [this.nextField_];
393b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  do {
394b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (!this.nextField()) {
395b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      goog.asserts.fail('Unmatched start-group tag: stream EOF');
396b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.error_ = true;
397b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return;
398b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
399b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (this.nextWireType_ ==
400b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryConstants.WireType.START_GROUP) {
401b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // Nested group start.
402b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      nestedGroups.push(this.nextField_);
403b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    } else if (this.nextWireType_ ==
404b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer               jspb.BinaryConstants.WireType.END_GROUP) {
405b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // Group end: check that it matches top-of-stack.
406b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      if (this.nextField_ != nestedGroups.pop()) {
407b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        goog.asserts.fail('Unmatched end-group tag');
408b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        this.error_ = true;
409b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return;
410b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      }
411b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
412b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } while (nestedGroups.length > 0);
413b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
414b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
415b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
416b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
417b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Skips over the next field in the binary stream - this is useful if we're
418b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * decoding a message that contain unknown fields.
419b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
420b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.skipField = function() {
421b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  switch (this.nextWireType_) {
422b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case jspb.BinaryConstants.WireType.VARINT:
423b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.skipVarintField();
424b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      break;
425b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case jspb.BinaryConstants.WireType.FIXED64:
426b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.skipFixed64Field();
427b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      break;
428b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case jspb.BinaryConstants.WireType.DELIMITED:
429b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.skipDelimitedField();
430b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      break;
431b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case jspb.BinaryConstants.WireType.FIXED32:
432b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.skipFixed32Field();
433b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      break;
434b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case jspb.BinaryConstants.WireType.START_GROUP:
435b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.skipGroup();
436b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      break;
437b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    default:
438b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      goog.asserts.fail('Invalid wire encoding for field.');
439b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
440b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
441b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
442b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
443b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
444b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Registers a user-defined read callback.
445b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {string} callbackName
446b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {function(!jspb.BinaryReader):*} callback
447b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
448b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.registerReadCallback =
449b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    function(callbackName, callback) {
450b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (goog.isNull(this.readCallbacks_)) {
451b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    this.readCallbacks_ = {};
452b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
453b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(!this.readCallbacks_[callbackName]);
454b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.readCallbacks_[callbackName] = callback;
455b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
456b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
457b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
458b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
459b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Runs a registered read callback.
460b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {string} callbackName The name the callback is registered under.
461b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {*} The value returned by the callback.
462b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
463b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.runReadCallback = function(callbackName) {
464b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(!goog.isNull(this.readCallbacks_));
465b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var callback = this.readCallbacks_[callbackName];
466b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(callback);
467b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return callback(this);
468b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
469b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
470b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
471b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
472b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a field of any valid non-message type from the binary stream.
473b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {jspb.BinaryConstants.FieldType} fieldType
474b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {jspb.AnyFieldType}
475b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
476b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readAny = function(fieldType) {
477b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.nextWireType_ = jspb.BinaryConstants.FieldTypeToWireType(fieldType);
478b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var fieldTypes = jspb.BinaryConstants.FieldType;
479b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  switch (fieldType) {
480b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case fieldTypes.DOUBLE:
481b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return this.readDouble();
482b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case fieldTypes.FLOAT:
483b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return this.readFloat();
484b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case fieldTypes.INT64:
485b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return this.readInt64();
486b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case fieldTypes.UINT64:
487b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return this.readUint64();
488b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case fieldTypes.INT32:
489b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return this.readInt32();
490b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case fieldTypes.FIXED64:
491b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return this.readFixed64();
492b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case fieldTypes.FIXED32:
493b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return this.readFixed32();
494b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case fieldTypes.BOOL:
495b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return this.readBool();
496b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case fieldTypes.STRING:
497b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return this.readString();
498b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case fieldTypes.GROUP:
499b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      goog.asserts.fail('Group field type not supported in readAny()');
500b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case fieldTypes.MESSAGE:
501b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      goog.asserts.fail('Message field type not supported in readAny()');
502b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case fieldTypes.BYTES:
503b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return this.readBytes();
504b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case fieldTypes.UINT32:
505b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return this.readUint32();
506b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case fieldTypes.ENUM:
507b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return this.readEnum();
508b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case fieldTypes.SFIXED32:
509b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return this.readSfixed32();
510b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case fieldTypes.SFIXED64:
511b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return this.readSfixed64();
512b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case fieldTypes.SINT32:
513b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return this.readSint32();
514b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case fieldTypes.SINT64:
515b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return this.readSint64();
516b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case fieldTypes.FHASH64:
517b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return this.readFixedHash64();
518b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case fieldTypes.VHASH64:
519b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return this.readVarintHash64();
520b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    default:
521b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      goog.asserts.fail('Invalid field type in readAny()');
522b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
523b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return 0;
524b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
525b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
526b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
527b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
528b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Deserialize a proto into the provided message object using the provided
529b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * reader function. This function is templated as we currently have one client
530b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * who is using manual deserialization instead of the code-generated versions.
531b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @template T
532b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {T} message
533b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {function(T, !jspb.BinaryReader)} reader
534b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
535b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readMessage = function(message, reader) {
536b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
537b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.DELIMITED);
538b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
539b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Save the current endpoint of the decoder and move it to the end of the
540b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // embedded message.
541b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var oldEnd = this.decoder_.getEnd();
542b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var length = this.decoder_.readUnsignedVarint32();
543b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var newEnd = this.decoder_.getCursor() + length;
544b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.decoder_.setEnd(newEnd);
545b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
546b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Deserialize the embedded message.
547b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  reader(message, this);
548b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
549b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Advance the decoder past the embedded message and restore the endpoint.
550b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.decoder_.setCursor(newEnd);
551b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.decoder_.setEnd(oldEnd);
552b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
553b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
554b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
555b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
556b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Deserialize a proto into the provided message object using the provided
557b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * reader function, assuming that the message is serialized as a group
558b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * with the given tag.
559b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @template T
560b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {number} field
561b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {T} message
562b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {function(T, !jspb.BinaryReader)} reader
563b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
564b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readGroup =
565b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    function(field, message, reader) {
566b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Ensure that the wire type is correct.
567b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
568b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.START_GROUP);
569b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Ensure that the field number is correct.
570b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(this.nextField_ == field);
571b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
572b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Deserialize the message. The deserialization will stop at an END_GROUP tag.
573b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  reader(message, this);
574b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
575b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!this.error_ &&
576b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ != jspb.BinaryConstants.WireType.END_GROUP) {
577b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    goog.asserts.fail('Group submessage did not end with an END_GROUP tag');
578b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    this.error_ = true;
579b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
580b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
581b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
582b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
583b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
584b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Return a decoder that wraps the current delimited field.
585b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!jspb.BinaryDecoder}
586b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
587b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.getFieldDecoder = function() {
588b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
589b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.DELIMITED);
590b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
591b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var length = this.decoder_.readUnsignedVarint32();
592b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var start = this.decoder_.getCursor();
593b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var end = start + length;
594b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
595b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var innerDecoder =
596b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      jspb.BinaryDecoder.alloc(this.decoder_.getBuffer(), start, length);
597b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  this.decoder_.setCursor(end);
598b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return innerDecoder;
599b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
600b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
601b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
602b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
603b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a signed 32-bit integer field from the binary stream, or throws an
604b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * error if the next field in the stream is not of the correct wire type.
605b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
606b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {number} The value of the signed 32-bit integer field.
607b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
608b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readInt32 = function() {
609b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
610b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
611b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.readSignedVarint32();
612b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
613b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
614b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
615b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
616b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a signed 32-bit integer field from the binary stream, or throws an
617b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * error if the next field in the stream is not of the correct wire type.
618b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
619b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Returns the value as a string.
620b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
621b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {string} The value of the signed 32-bit integer field as a decimal
622b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * string.
623b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
624b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readInt32String = function() {
625b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
626b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
627b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.readSignedVarint32String();
628b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
629b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
630b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
631b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
632b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a signed 64-bit integer field from the binary stream, or throws an
633b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * error if the next field in the stream is not of the correct wire type.
634b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
635b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {number} The value of the signed 64-bit integer field.
636b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
637b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readInt64 = function() {
638b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
639b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
640b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.readSignedVarint64();
641b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
642b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
643b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
644b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
645b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a signed 64-bit integer field from the binary stream, or throws an
646b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * error if the next field in the stream is not of the correct wire type.
647b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
648b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Returns the value as a string.
649b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
650b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {string} The value of the signed 64-bit integer field as a decimal
651b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * string.
652b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
653b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readInt64String = function() {
654b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
655b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
656b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.readSignedVarint64String();
657b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
658b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
659b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
660b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
661b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads an unsigned 32-bit integer field from the binary stream, or throws an
662b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * error if the next field in the stream is not of the correct wire type.
663b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
664b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {number} The value of the unsigned 32-bit integer field.
665b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
666b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readUint32 = function() {
667b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
668b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
669b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.readUnsignedVarint32();
670b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
671b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
672b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
673b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
674b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads an unsigned 32-bit integer field from the binary stream, or throws an
675b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * error if the next field in the stream is not of the correct wire type.
676b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
677b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Returns the value as a string.
678b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
679b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {string} The value of the unsigned 32-bit integer field as a decimal
680b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * string.
681b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
682b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readUint32String = function() {
683b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
684b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
685b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.readUnsignedVarint32String();
686b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
687b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
688b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
689b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
690b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads an unsigned 64-bit integer field from the binary stream, or throws an
691b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * error if the next field in the stream is not of the correct wire type.
692b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
693b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {number} The value of the unsigned 64-bit integer field.
694b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
695b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readUint64 = function() {
696b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
697b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
698b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.readUnsignedVarint64();
699b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
700b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
701b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
702b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
703b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads an unsigned 64-bit integer field from the binary stream, or throws an
704b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * error if the next field in the stream is not of the correct wire type.
705b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
706b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Returns the value as a string.
707b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
708b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {string} The value of the unsigned 64-bit integer field as a decimal
709b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * string.
710b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
711b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readUint64String = function() {
712b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
713b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
714b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.readUnsignedVarint64String();
715b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
716b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
717b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
718b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
719b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a signed zigzag-encoded 32-bit integer field from the binary stream,
720b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * or throws an error if the next field in the stream is not of the correct
721b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * wire type.
722b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
723b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {number} The value of the signed 32-bit integer field.
724b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
725b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readSint32 = function() {
726b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
727b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
728b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.readZigzagVarint32();
729b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
730b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
731b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
732b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
733b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a signed zigzag-encoded 64-bit integer field from the binary stream,
734b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * or throws an error if the next field in the stream is not of the correct
735b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * wire type.
736b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
737b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {number} The value of the signed 64-bit integer field.
738b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
739b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readSint64 = function() {
740b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
741b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
742b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.readZigzagVarint64();
743b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
744b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
745b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
746b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
747b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads an unsigned 32-bit fixed-length integer fiield from the binary stream,
748b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * or throws an error if the next field in the stream is not of the correct
749b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * wire type.
750b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
751b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {number} The value of the double field.
752b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
753b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readFixed32 = function() {
754b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
755b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.FIXED32);
756b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.readUint32();
757b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
758b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
759b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
760b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
761b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads an unsigned 64-bit fixed-length integer fiield from the binary stream,
762b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * or throws an error if the next field in the stream is not of the correct
763b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * wire type.
764b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
765b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {number} The value of the float field.
766b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
767b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readFixed64 = function() {
768b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
769b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.FIXED64);
770b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.readUint64();
771b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
772b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
773b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
774b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
775b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a signed 32-bit fixed-length integer fiield from the binary stream, or
776b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * throws an error if the next field in the stream is not of the correct wire
777b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * type.
778b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
779b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {number} The value of the double field.
780b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
781b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readSfixed32 = function() {
782b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
783b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.FIXED32);
784b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.readInt32();
785b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
786b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
787b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
788b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
789b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a signed 64-bit fixed-length integer fiield from the binary stream, or
790b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * throws an error if the next field in the stream is not of the correct wire
791b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * type.
792b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
793b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {number} The value of the float field.
794b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
795b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readSfixed64 = function() {
796b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
797b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.FIXED64);
798b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.readInt64();
799b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
800b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
801b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
802b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
803b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a 32-bit floating-point field from the binary stream, or throws an
804b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * error if the next field in the stream is not of the correct wire type.
805b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
806b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {number} The value of the float field.
807b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
808b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readFloat = function() {
809b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
810b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.FIXED32);
811b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.readFloat();
812b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
813b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
814b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
815b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
816b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a 64-bit floating-point field from the binary stream, or throws an
817b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * error if the next field in the stream is not of the correct wire type.
818b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
819b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {number} The value of the double field.
820b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
821b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readDouble = function() {
822b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
823b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.FIXED64);
824b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.readDouble();
825b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
826b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
827b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
828b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
829b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a boolean field from the binary stream, or throws an error if the next
830b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * field in the stream is not of the correct wire type.
831b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
832b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {boolean} The value of the boolean field.
833b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
834b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readBool = function() {
835b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
836b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
837b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return !!this.decoder_.readUnsignedVarint32();
838b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
839b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
840b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
841b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
842b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads an enum field from the binary stream, or throws an error if the next
843b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * field in the stream is not of the correct wire type.
844b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
845b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {number} The value of the enum field.
846b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
847b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readEnum = function() {
848b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
849b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
850b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.readSignedVarint64();
851b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
852b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
853b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
854b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
855b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a string field from the binary stream, or throws an error if the next
856b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * field in the stream is not of the correct wire type.
857b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
858b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {string} The value of the string field.
859b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
860b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readString = function() {
861b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
862b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.DELIMITED);
863b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var length = this.decoder_.readUnsignedVarint32();
864b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.readString(length);
865b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
866b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
867b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
868b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
869b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a length-prefixed block of bytes from the binary stream, or returns
870b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * null if the next field in the stream has an invalid length value.
871b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
872b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!Uint8Array} The block of bytes.
873b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
874b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readBytes = function() {
875b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
876b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.DELIMITED);
877b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var length = this.decoder_.readUnsignedVarint32();
878b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.readBytes(length);
879b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
880b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
881b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
882b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
883b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a 64-bit varint or fixed64 field from the stream and returns it as a
884b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * 8-character Unicode string for use as a hash table key, or throws an error
885b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * if the next field in the stream is not of the correct wire type.
886b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
887b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {string} The hash value.
888b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
889b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readVarintHash64 = function() {
890b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
891b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
892b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.readVarintHash64();
893b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
894b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
895b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
896b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
897b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a 64-bit varint or fixed64 field from the stream and returns it as a
898b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * 8-character Unicode string for use as a hash table key, or throws an error
899b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * if the next field in the stream is not of the correct wire type.
900b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
901b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {string} The hash value.
902b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
903b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readFixedHash64 = function() {
904b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
905b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.FIXED64);
906b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.decoder_.readFixedHash64();
907b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
908b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
909b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
910b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
911b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a packed scalar field using the supplied raw reader function.
912b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {function()} decodeMethod
913b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!Array}
914b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @private
915b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
916b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readPackedField_ = function(decodeMethod) {
917b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  goog.asserts.assert(
918b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.nextWireType_ == jspb.BinaryConstants.WireType.DELIMITED);
919b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var length = this.decoder_.readUnsignedVarint32();
920b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var end = this.decoder_.getCursor() + length;
921b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var result = [];
922b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  while (this.decoder_.getCursor() < end) {
923b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // TODO(aappleby): .call is slow
924b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    result.push(decodeMethod.call(this.decoder_));
925b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
926b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return result;
927b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
928b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
929b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
930b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
931b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a packed int32 field, which consists of a length header and a list of
932b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * signed varints.
933b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!Array.<number>}
934b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
935b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readPackedInt32 = function() {
936b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.readPackedField_(this.decoder_.readSignedVarint32);
937b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
938b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
939b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
940b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
941b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a packed int32 field, which consists of a length header and a list of
942b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * signed varints. Returns a list of strings.
943b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!Array.<string>}
944b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
945b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readPackedInt32String = function() {
946b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.readPackedField_(this.decoder_.readSignedVarint32String);
947b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
948b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
949b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
950b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
951b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a packed int64 field, which consists of a length header and a list of
952b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * signed varints.
953b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!Array.<number>}
954b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
955b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readPackedInt64 = function() {
956b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.readPackedField_(this.decoder_.readSignedVarint64);
957b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
958b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
959b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
960b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
961b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a packed int64 field, which consists of a length header and a list of
962b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * signed varints. Returns a list of strings.
963b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!Array.<string>}
964b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
965b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readPackedInt64String = function() {
966b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.readPackedField_(this.decoder_.readSignedVarint64String);
967b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
968b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
969b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
970b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
971b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a packed uint32 field, which consists of a length header and a list of
972b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * unsigned varints.
973b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!Array.<number>}
974b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
975b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readPackedUint32 = function() {
976b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.readPackedField_(this.decoder_.readUnsignedVarint32);
977b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
978b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
979b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
980b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
981b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a packed uint32 field, which consists of a length header and a list of
982b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * unsigned varints. Returns a list of strings.
983b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!Array.<string>}
984b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
985b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readPackedUint32String = function() {
986b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.readPackedField_(this.decoder_.readUnsignedVarint32String);
987b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
988b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
989b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
990b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
991b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a packed uint64 field, which consists of a length header and a list of
992b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * unsigned varints.
993b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!Array.<number>}
994b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
995b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readPackedUint64 = function() {
996b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.readPackedField_(this.decoder_.readUnsignedVarint64);
997b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
998b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
999b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1000b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
1001b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a packed uint64 field, which consists of a length header and a list of
1002b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * unsigned varints. Returns a list of strings.
1003b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!Array.<string>}
1004b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
1005b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readPackedUint64String = function() {
1006b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.readPackedField_(this.decoder_.readUnsignedVarint64String);
1007b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
1008b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1009b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1010b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
1011b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a packed sint32 field, which consists of a length header and a list of
1012b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * zigzag varints.
1013b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!Array.<number>}
1014b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
1015b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readPackedSint32 = function() {
1016b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.readPackedField_(this.decoder_.readZigzagVarint32);
1017b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
1018b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1019b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1020b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
1021b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a packed sint64 field, which consists of a length header and a list of
1022b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * zigzag varints.
1023b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!Array.<number>}
1024b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
1025b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readPackedSint64 = function() {
1026b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.readPackedField_(this.decoder_.readZigzagVarint64);
1027b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
1028b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1029b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1030b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
1031b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a packed fixed32 field, which consists of a length header and a list
1032b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * of unsigned 32-bit ints.
1033b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!Array.<number>}
1034b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
1035b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readPackedFixed32 = function() {
1036b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.readPackedField_(this.decoder_.readUint32);
1037b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
1038b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1039b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1040b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
1041b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a packed fixed64 field, which consists of a length header and a list
1042b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * of unsigned 64-bit ints.
1043b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!Array.<number>}
1044b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
1045b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readPackedFixed64 = function() {
1046b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.readPackedField_(this.decoder_.readUint64);
1047b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
1048b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1049b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1050b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
1051b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a packed sfixed32 field, which consists of a length header and a list
1052b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * of 32-bit ints.
1053b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!Array.<number>}
1054b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
1055b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readPackedSfixed32 = function() {
1056b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.readPackedField_(this.decoder_.readInt32);
1057b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
1058b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1059b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1060b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
1061b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a packed sfixed64 field, which consists of a length header and a list
1062b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * of 64-bit ints.
1063b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!Array.<number>}
1064b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
1065b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readPackedSfixed64 = function() {
1066b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.readPackedField_(this.decoder_.readInt64);
1067b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
1068b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1069b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1070b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
1071b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a packed float field, which consists of a length header and a list of
1072b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * floats.
1073b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!Array.<number>}
1074b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
1075b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readPackedFloat = function() {
1076b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.readPackedField_(this.decoder_.readFloat);
1077b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
1078b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1079b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1080b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
1081b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a packed double field, which consists of a length header and a list of
1082b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * doubles.
1083b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!Array.<number>}
1084b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
1085b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readPackedDouble = function() {
1086b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.readPackedField_(this.decoder_.readDouble);
1087b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
1088b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1089b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1090b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
1091b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a packed bool field, which consists of a length header and a list of
1092b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * unsigned varints.
1093b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!Array.<boolean>}
1094b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
1095b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readPackedBool = function() {
1096b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.readPackedField_(this.decoder_.readBool);
1097b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
1098b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1099b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1100b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
1101b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a packed enum field, which consists of a length header and a list of
1102b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * unsigned varints.
1103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!Array.<number>}
1104b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
1105b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readPackedEnum = function() {
1106b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.readPackedField_(this.decoder_.readEnum);
1107b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
1108b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
1111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a packed varint hash64 field, which consists of a length header and a
1112b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * list of varint hash64s.
1113b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!Array.<string>}
1114b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
1115b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readPackedVarintHash64 = function() {
1116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.readPackedField_(this.decoder_.readVarintHash64);
1117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
1118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1120b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
1121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Reads a packed fixed hash64 field, which consists of a length header and a
1122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * list of fixed hash64s.
1123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {!Array.<string>}
1124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
1125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerjspb.BinaryReader.prototype.readPackedFixedHash64 = function() {
1126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return this.readPackedField_(this.decoder_.readFixedHash64);
1127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer};
1128