// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

/**
 * @fileoverview Definition of BinaryReader.
 * @private
 */

module.exports = BinaryReader;

/**
 * BinaryReader assists in reading from a Uint8Array by keeping track of the
 * position being read.
 * @private
 * @param {Uint8Array} The buffer to read from.
 * @constructor
 */
function BinaryReader(buf) {
  this.pos = 0;
  this.buf = buf;
}

/**
 * Reads a byte from the bufer.
 * @return {number} The byte value. EOF is represented by null.
 */
BinaryReader.prototype.readByte = function() {
  var val = this.buf[this.pos];
  this.pos++;
  if (val === undefined) {
  	throw new Error('Failed to read byte, reached end of buffer');
  }
  return val;
};

/**
 * Returns the next byte from the buffer without advancing the reader
 * @return {number} The byte value. EOF is represented by null.
 */
BinaryReader.prototype.peekByte = function() {
  var val = this.buf[this.pos];
  if (val === undefined) {
  	throw new Error('Failed to read byte, reached end of buffer');
  }
  return val;
};

/**
 * Reads an array of bytes from the buffer.
 * @param {number} amt. The number of bytes to read.
 * @return {Uint8Array} The byte array. If the whole size cannot be read, null
 * (representing EOF) is returned.
 */
BinaryReader.prototype.readByteArray = function(amt) {
  var arr = this.buf.subarray(this.pos, this.pos + amt);
  this.pos += amt;
  if (this.pos > this.buf) {
  	throw new Error('Failed to read ' + amt + ' bytes. Hit EOF.');
  }
  return arr;
};
