package org.nustaq.offheap.bytez.niobuffers;
import org.nustaq.offheap.bytez.BasicBytez;
import org.nustaq.offheap.bytez.onheap.HeapBytez;
import java.nio.ByteBuffer;
/**
* Created by moelrue on 5/5/15.
*/
public class ByteBufferBasicBytez implements BasicBytez {
ByteBuffer buffer;
public ByteBufferBasicBytez(ByteBuffer buffer) {
this.buffer = buffer;
}
@Override
public byte get(long byteIndex) {
return buffer.get((int) byteIndex);
}
@Override
public boolean getBool(long byteIndex) {
return buffer.get((int) byteIndex) != 0;
}
@Override
public char getChar(long byteIndex) {
return buffer.getChar((int) byteIndex);
}
@Override
public short getShort(long byteIndex) {
return buffer.getShort((int) byteIndex);
}
@Override
public int getInt(long byteIndex) {
return buffer.getInt((int) byteIndex);
}
@Override
public long getLong(long byteIndex) {
return buffer.getLong((int) byteIndex);
}
@Override
public float getFloat(long byteIndex) {
return buffer.getFloat((int) byteIndex);
}
@Override
public double getDouble(long byteIndex) {
return buffer.getDouble((int) byteIndex);
}
@Override
public void put(long byteIndex, byte value) {
buffer.put((int) byteIndex,value);
}
@Override
public void putBool(long byteIndex, boolean val) {
buffer.put((int) byteIndex, (byte) (val?1:0));
}
@Override
public void putChar(long byteIndex, char c) {
buffer.putChar((int) byteIndex, c);
}
@Override
public void putShort(long byteIndex, short s) {
buffer.putShort((int) byteIndex, s);
}
@Override
public void putInt(long byteIndex, int i) {
buffer.putInt((int) byteIndex, i);
}
@Override
public void putLong(long byteIndex, long l) {
buffer.putLong((int) byteIndex, l);
}
@Override
public void putFloat(long byteIndex, float f) {
buffer.putFloat((int) byteIndex, f);
}
@Override
public void putDouble(long byteIndex, double d) {
buffer.putDouble((int) byteIndex, d);
}
@Override
public long length() {
return buffer.limit();
}
@Override
public void getArr(long byteIndex, byte[] target, int elemoff, int numElems) {
int position = buffer.position();
buffer.position((int) byteIndex);
buffer.get(target,elemoff,numElems);
buffer.position(position);
}
@Override
public void getCharArr(long byteIndex, char[] target, int elemoff, int numElems) {
for ( int i=0; i <numElems; i++ ) {
target[i+elemoff] = buffer.getChar((int) (byteIndex+i*2));
}
}
@Override
public void getShortArr(long byteIndex, short[] target, int elemoff, int numElems) {
for ( int i=0; i <numElems; i++ ) {
target[i+elemoff] = buffer.getShort((int) (byteIndex+i * 2));
}
}
@Override
public void getIntArr(long byteIndex, int[] target, int elemoff, int numElems) {
for ( int i=0; i <numElems; i++ ) {
target[i+elemoff] = buffer.getInt((int) (byteIndex+i * 4));
}
}
@Override
public void getLongArr(long byteIndex, long[] target, int elemoff, int numElems) {
for ( int i=0; i <numElems; i++ ) {
target[i+elemoff] = buffer.getLong((int) (byteIndex+i * 8));
}
}
@Override
public void getFloatArr(long byteIndex, float[] target, int elemoff, int numElems) {
for ( int i=0; i <numElems; i++ ) {
target[i+elemoff] = buffer.getFloat((int) (byteIndex+i * 4));
}
}
@Override
public void getDoubleArr(long byteIndex, double[] target, int elemoff, int numElems) {
for ( int i=0; i <numElems; i++ ) {
target[i+elemoff] = buffer.getDouble((int) (byteIndex+i * 8));
}
}
@Override
public void getBooleanArr(long byteIndex, boolean[] target, int elemoff, int numElems) {
for ( int i=0; i <numElems; i++ ) {
target[i+elemoff] = buffer.getInt((int) (byteIndex+i)) != 0;
}
}
@Override
public void set(long byteIndex, byte[] source, int elemoff, int numElems) {
int position = buffer.position();
buffer.position((int) byteIndex);
buffer.put(source, elemoff, numElems);
buffer.position(position);
}
@Override
public void setChar(long byteIndex, char[] source, int elemoff, int numElems) {
for ( int i=0; i <numElems; i++ ) {
buffer.putChar((int) (byteIndex+2*i),source[i+elemoff]);
}
}
@Override
public void setShort(long byteIndex, short[] source, int elemoff, int numElems) {
for ( int i=0; i <numElems; i++ ) {
buffer.putShort((int) (byteIndex + 2 * i), source[i + elemoff]);
}
}
@Override
public void setInt(long byteIndex, int[] source, int elemoff, int numElems) {
for ( int i=0; i <numElems; i++ ) {
buffer.putInt((int) (byteIndex+4*i),source[i+elemoff]);
}
}
@Override
public void setLong(long byteIndex, long[] source, int elemoff, int numElems) {
for ( int i=0; i <numElems; i++ ) {
buffer.putLong((int) (byteIndex+8*i),source[i+elemoff]);
}
}
@Override
public void setFloat(long byteIndex, float[] source, int elemoff, int numElems) {
for ( int i=0; i <numElems; i++ ) {
buffer.putFloat((int) (byteIndex+4*i),source[i+elemoff]);
}
}
@Override
public void setDouble(long byteIndex, double[] source, int elemoff, int numElems) {
for ( int i=0; i <numElems; i++ ) {
buffer.putDouble((int) (byteIndex+8*i),source[i+elemoff]);
}
}
@Override
public void setBoolean(long byteIndex, boolean[] source, int elemoff, int siz) {
for ( int i=0; i <siz; i++ ) {
buffer.put((int) (byteIndex + i), (byte) (source[i + elemoff] ? 1 : 0));
}
}
@Override
public void copyTo(BasicBytez other, long otherByteIndex, long myByteIndex, long lenBytes) {
// could be optimized depending on "other" type
for ( long i = 0; i < lenBytes; i++ ) {
other.put(otherByteIndex+i,get(myByteIndex+i));
}
}
@Override
public BasicBytez newInstance(long size) {
return new ByteBufferBasicBytez(ByteBuffer.allocate((int) size));
}
public ByteBuffer getBuffer() {
return buffer;
}
public void setBuffer(ByteBuffer buffer) {
this.buffer = buffer;
}
}