/* * Copyright 2012 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.typedarrays.shared; /** * A stream of heterogeneous values on top of a {@link DataViewStream}. */ public class DataViewStream { // TODO: add methods to pack/unpack strings in various formats private final DataView dataView; private int offset; public DataViewStream(DataView dataView) { this.dataView = dataView; offset = 0; } public float getFloat32() { return getFloat32(false); } public float getFloat32(boolean littleEndian) { float val = dataView.getFloat32(offset, littleEndian); offset += 4; return val; } public double getFloat64() { return getFloat64(false); } public double getFloat64(boolean littleEndian) { double val = dataView.getFloat64(offset, littleEndian); offset += 8; return val; } public short getInt16() { return getInt16(false); } public short getInt16(boolean littleEndian) { short val = dataView.getInt16(offset, littleEndian); offset += 2; return val; } public int getInt32() { return getInt32(false); } public int getInt32(boolean littleEndian) { int val = dataView.getInt32(offset, littleEndian); offset += 4; return val; } public byte getInt8() { return dataView.getInt8(offset++); } public int getUint16() { return getUint16(false); } public int getUint16(boolean littleEndian) { int val = dataView.getUint16(offset, littleEndian); offset += 2; return val; } public long getUint32() { return getUint32(false); } public long getUint32(boolean littleEndian) { long val = dataView.getUint32(offset, littleEndian); offset += 4; return val; } /** * @return unsigned 32-bit int as a double */ public double getUint32AsDouble() { return getUint32AsDouble(false); } /** * @param littleEndian * @return unsigned 32-bit int as a double */ public double getUint32AsDouble(boolean littleEndian) { double val = dataView.getUint32AsDouble(offset, littleEndian); offset += 4; return val; } public short getUint8() { return dataView.getUint8(offset++); } public int position() { return offset; } public void putFloat32(float value) { putFloat32(value, false); } public void putFloat32(float value, boolean littleEndian) { dataView.setFloat32(offset, value, littleEndian); offset += 4; } public void putFloat64(double value) { putFloat64(value, false); } public void putFloat64(double value, boolean littleEndian) { dataView.setFloat64(offset, value, littleEndian); offset += 8; } public void putInt16(int value) { putInt16(value, false); } public void putInt16(int value, boolean littleEndian) { dataView.setInt16(offset, value, littleEndian); offset += 2; } public void putInt32(int value) { putInt32(value, false); } public void putInt32(int value, boolean littleEndian) { dataView.setInt32(offset, value, littleEndian); offset += 4; } public void putInt8(int value) { dataView.setInt8(offset++, value); } public void putUint16(int value) { putUint16(value, false); } public void putUint16(int value, boolean littleEndian) { dataView.setUint16(offset, value, littleEndian); offset += 2; } public void putUint32(long value) { putUint32(value, false); } public void putUint32(long value, boolean littleEndian) { dataView.setUint32(offset, value, littleEndian); offset += 4; } /** * @param value */ public void putUint32FromDouble(double value) { putUint32FromDouble(value, false); } /** * @param value * @param littleEndian */ public void putUint32FromDouble(double value, boolean littleEndian) { dataView.setUint32FromDouble(offset, value, littleEndian); offset += 4; } public void putUint8(int value) { dataView.setUint8(offset++, value); } public void rewind() { offset = 0; } public void setPosition(int position) { if (position < 0 || position >= dataView.byteLength()) { throw new IndexOutOfBoundsException(); } offset = position; } }