blob: 8d5d1b7a6ee86b2e80607e3a227659f8bd8cff06 [file] [log] [blame]
/*
* 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;
}
}