package util;
public class ReferenceOffsets {
private short[] offsets;
private short top;
private short nextScanIndex;
public ReferenceOffsets() {
offsets = null;
}
public byte size() {
return (byte) top;
}
public void insert(short i) throws Exception {
if (i < 0) {
throw new IllegalArgumentException();
}
if (top > 255) {
throw new Exception("Too many references in object");
}
if (offsets == null) {
offsets = new short[10];
}
if (top < offsets.length) {
offsets[top++] = i;
} else {
extend();
insert(i);
}
}
private void extend() {
short[] nbyteOffsets = new short[offsets.length * 2];
for (byte i = 0; i < top; i++) {
nbyteOffsets[i] = offsets[i];
}
offsets = nbyteOffsets;
}
public byte byteOffsetsSize() {
short index = 0;
byte sum = 0;
while (index < top) {
if (offsets[index] < 256) {
sum++;
}
index++;
}
return sum;
}
public byte shortOffsetsSize() {
return (byte) (top - byteOffsetsSize());
}
public void startScanByteOffsets() {
nextScanIndex = 0;
}
public short getNextByteOffset() {
short res;
while (offsets[nextScanIndex] > 255) {
nextScanIndex++;
}
res = offsets[nextScanIndex++];
return res;
}
public void startScanShortOffsets() {
startScanByteOffsets();
}
public short getNextShortOffset() {
short res;
while (offsets[nextScanIndex] <= 255) {
nextScanIndex++;
}
res = offsets[nextScanIndex++];
return res;
}
}