package org.rrd4j.core;
import java.io.IOException;
abstract class RrdPrimitive {
static final int STRING_LENGTH = 20;
static final int RRD_INT = 0, RRD_LONG = 1, RRD_DOUBLE = 2, RRD_STRING = 3;
static final int[] RRD_PRIM_SIZES = {4, 8, 8, 2 * STRING_LENGTH};
private RrdBackend backend;
private int byteCount;
private final long pointer;
private final boolean cachingAllowed;
RrdPrimitive(RrdUpdater updater, int type, boolean isConstant) throws IOException {
this(updater, type, 1, isConstant);
}
RrdPrimitive(RrdUpdater updater, int type, int count, boolean isConstant) throws IOException {
this.backend = updater.getRrdBackend();
this.byteCount = RRD_PRIM_SIZES[type] * count;
this.pointer = updater.getRrdAllocator().allocate(byteCount);
this.cachingAllowed = isConstant || backend.isCachingAllowed();
}
final byte[] readBytes() throws IOException {
byte[] b = new byte[byteCount];
backend.read(pointer, b);
return b;
}
final void writeBytes(byte[] b) throws IOException {
assert b.length == byteCount : "Invalid number of bytes supplied to RrdPrimitive.write method";
backend.write(pointer, b);
}
final int readInt() throws IOException {
return backend.readInt(pointer);
}
final void writeInt(int value) throws IOException {
backend.writeInt(pointer, value);
}
final long readLong() throws IOException {
return backend.readLong(pointer);
}
final void writeLong(long value) throws IOException {
backend.writeLong(pointer, value);
}
final double readDouble() throws IOException {
return backend.readDouble(pointer);
}
final double readDouble(int index) throws IOException {
long offset = pointer + index * RRD_PRIM_SIZES[RRD_DOUBLE];
return backend.readDouble(offset);
}
final double[] readDouble(int index, int count) throws IOException {
long offset = pointer + index * RRD_PRIM_SIZES[RRD_DOUBLE];
return backend.readDouble(offset, count);
}
final void writeDouble(double value) throws IOException {
backend.writeDouble(pointer, value);
}
final void writeDouble(int index, double value) throws IOException {
long offset = pointer + index * RRD_PRIM_SIZES[RRD_DOUBLE];
backend.writeDouble(offset, value);
}
final void writeDouble(int index, double value, int count) throws IOException {
long offset = pointer + index * RRD_PRIM_SIZES[RRD_DOUBLE];
backend.writeDouble(offset, value, count);
}
final void writeDouble(int index, double[] values) throws IOException {
long offset = pointer + index * RRD_PRIM_SIZES[RRD_DOUBLE];
backend.writeDouble(offset, values);
}
final String readString() throws IOException {
return backend.readString(pointer);
}
final void writeString(String value) throws IOException {
backend.writeString(pointer, value);
}
final boolean isCachingAllowed() {
return cachingAllowed;
}
}