package com.oracle.truffle.js.runtime.array;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import com.oracle.truffle.js.runtime.Boundaries;
abstract class ByteBufferAccess {
@SuppressWarnings("static-method")
public final int getInt8(ByteBuffer buffer, int index) {
return buffer.get(index);
}
public final int getUint8(ByteBuffer buffer, int index) {
return getInt8(buffer, index) & 0xff;
}
public abstract int getInt16(ByteBuffer buffer, int index);
public final int getUint16(ByteBuffer buffer, int index) {
return getInt16(buffer, index) & 0xffff;
}
public abstract int getInt32(ByteBuffer buffer, int index);
public final long getUint32(ByteBuffer buffer, int index) {
return getInt32(buffer, index) & 0xffffffffL;
}
public abstract float getFloat(ByteBuffer buffer, int index);
public abstract double getDouble(ByteBuffer buffer, int index);
public abstract long getInt64(ByteBuffer buffer, int index);
@SuppressWarnings("static-method")
public final void putInt8(ByteBuffer buffer, int index, int value) {
buffer.put(index, (byte) value);
}
public abstract void putInt16(ByteBuffer buffer, int index, int value);
public abstract void putInt32(ByteBuffer buffer, int index, int value);
public abstract void putFloat(ByteBuffer buffer, int index, float value);
public abstract void putDouble(ByteBuffer buffer, int index, double value);
public abstract void putInt64(ByteBuffer buffer, int index, long value);
static final ByteBufferAccess littleEndian() {
return ByteBufferSupport.littleEndian();
}
static final ByteBufferAccess bigEndian() {
return ByteBufferSupport.bigEndian();
}
static final ByteBufferAccess nativeOrder() {
return ByteBufferSupport.nativeOrder();
}
static final ByteBufferAccess forOrder(boolean littleEndian) {
return littleEndian ? littleEndian() : bigEndian();
}
}
abstract class AbstractByteBufferAccess extends ByteBufferAccess {
@Override
public final int getInt16(ByteBuffer buffer, int index) {
return wrap(buffer).getShort(index);
}
@Override
public final int getInt32(ByteBuffer buffer, int index) {
return wrap(buffer).getInt(index);
}
@Override
public final float getFloat(ByteBuffer buffer, int index) {
return wrap(buffer).getFloat(index);
}
@Override
public final double getDouble(ByteBuffer buffer, int index) {
return wrap(buffer).getDouble(index);
}
@Override
public long getInt64(ByteBuffer buffer, int index) {
return wrap(buffer).getLong(index);
}
@Override
public final void putInt16(ByteBuffer buffer, int index, int value) {
wrap(buffer).putShort(index, (short) value);
}
@Override
public final void putInt32(ByteBuffer buffer, int index, int value) {
wrap(buffer).putInt(index, value);
}
@Override
public final void putInt64(ByteBuffer buffer, int index, long value) {
wrap(buffer).putLong(index, value);
}
@Override
public final void putFloat(ByteBuffer buffer, int index, float value) {
wrap(buffer).putFloat(index, value);
}
@Override
public final void putDouble(ByteBuffer buffer, int index, double value) {
wrap(buffer).putDouble(index, value);
}
protected ByteBuffer wrap(ByteBuffer buffer) {
return buffer;
}
}
final class NativeByteBufferAccess extends AbstractByteBufferAccess {
static final ByteBufferAccess INSTANCE = new NativeByteBufferAccess();
@Override
protected ByteBuffer wrap(ByteBuffer buffer) {
return Boundaries.byteBufferDuplicate(buffer).order(ByteOrder.nativeOrder());
}
}
final class LittleEndianByteBufferAccess extends AbstractByteBufferAccess {
static final ByteBufferAccess INSTANCE = new LittleEndianByteBufferAccess();
@Override
protected ByteBuffer wrap(ByteBuffer buffer) {
return Boundaries.byteBufferDuplicate(buffer).order(ByteOrder.LITTLE_ENDIAN);
}
}
final class BigEndianByteBufferAccess extends AbstractByteBufferAccess {
static final ByteBufferAccess INSTANCE = new BigEndianByteBufferAccess();
@Override
protected ByteBuffer wrap(ByteBuffer buffer) {
return Boundaries.byteBufferDuplicate(buffer).order(ByteOrder.BIG_ENDIAN);
}
}