diff --git a/core/src/com/riiablo/io/BitConstraints.java b/core/src/com/riiablo/io/BitConstraints.java index 1bec93c2..c1a047ca 100644 --- a/core/src/com/riiablo/io/BitConstraints.java +++ b/core/src/com/riiablo/io/BitConstraints.java @@ -1,6 +1,6 @@ package com.riiablo.io; -class BitConstraints { +public class BitConstraints { private BitConstraints() {} private static int _validateSize(int min, int max, int bits) { @@ -60,33 +60,65 @@ class BitConstraints { return _validateSize(Byte.SIZE - 1, Byte.SIZE, bits); } - public static byte safe8u(short i) { + public static byte safe8u(ByteInput byteInput, short i) { if (!BitUtils.isUnsigned(i, Byte.SIZE)) { - throw new UnsafeNarrowing(i); + throw new UnsafeNarrowing(byteInput, i); } return (byte) i; } - public static short safe16u(int i) { + public static short safe16u(ByteInput byteInput, int i) { if (!BitUtils.isUnsigned(i, Short.SIZE)) { - throw new UnsafeNarrowing(i); + throw new UnsafeNarrowing(byteInput, i); } return (short) i; } - public static int safe32u(long i) { + public static int safe32u(ByteInput byteInput, long i) { if (!BitUtils.isUnsigned(i, Integer.SIZE)) { - throw new UnsafeNarrowing(i); + throw new UnsafeNarrowing(byteInput, i); } return (int) i; } - public static long safe64u(long i) { + public static long safe64u(ByteInput byteInput, long i) { if (!BitUtils.isUnsigned(i, Long.SIZE)) { - throw new UnsafeNarrowing(i); + throw new UnsafeNarrowing(byteInput, i); + } + + return (long) i; + } + + public static byte safe8u(BitInput bitInput, short i) { + if (!BitUtils.isUnsigned(i, Byte.SIZE)) { + throw new UnsafeNarrowing(bitInput.byteInput(), i); + } + + return (byte) i; + } + + public static short safe16u(BitInput bitInput, int i) { + if (!BitUtils.isUnsigned(i, Short.SIZE)) { + throw new UnsafeNarrowing(bitInput.byteInput(), i); + } + + return (short) i; + } + + public static int safe32u(BitInput bitInput, long i) { + if (!BitUtils.isUnsigned(i, Integer.SIZE)) { + throw new UnsafeNarrowing(bitInput.byteInput(), i); + } + + return (int) i; + } + + public static long safe64u(BitInput bitInput, long i) { + if (!BitUtils.isUnsigned(i, Long.SIZE)) { + throw new UnsafeNarrowing(bitInput.byteInput(), i); } return (long) i; diff --git a/core/src/com/riiablo/io/BitInput.java b/core/src/com/riiablo/io/BitInput.java index b37c0a34..c9b24582 100644 --- a/core/src/com/riiablo/io/BitInput.java +++ b/core/src/com/riiablo/io/BitInput.java @@ -459,7 +459,7 @@ public class BitInput { public byte readSafe8u() { try { final short value = read8u(); - return BitConstraints.safe8u(value); + return BitConstraints.safe8u(byteInput, value); } catch (IndexOutOfBoundsException t) { throw new EndOfInput(t); } @@ -475,7 +475,7 @@ public class BitInput { public short readSafe16u() { try { final int value = read16u(); - return BitConstraints.safe16u(value); + return BitConstraints.safe16u(byteInput, value); } catch (IndexOutOfBoundsException t) { throw new EndOfInput(t); } @@ -491,7 +491,7 @@ public class BitInput { public int readSafe32u() { try { final long value = read32u(); - return BitConstraints.safe32u(value); + return BitConstraints.safe32u(byteInput, value); } catch (IndexOutOfBoundsException t) { throw new EndOfInput(t); } @@ -507,7 +507,7 @@ public class BitInput { public long readSafe64u() { try { final long value = read64(); - return BitConstraints.safe64u(value); + return BitConstraints.safe64u(byteInput, value); } catch (IndexOutOfBoundsException t) { throw new EndOfInput(t); } diff --git a/core/src/com/riiablo/io/ByteInput.java b/core/src/com/riiablo/io/ByteInput.java index e904d411..0f9c34e3 100644 --- a/core/src/com/riiablo/io/ByteInput.java +++ b/core/src/com/riiablo/io/ByteInput.java @@ -401,7 +401,7 @@ public class ByteInput { assert aligned() : "not aligned"; try { final short value = read8u(); // increments bits - return BitConstraints.safe8u(value); + return BitConstraints.safe8u(this, value); } catch (IndexOutOfBoundsException t) { throw new EndOfInput(t); } @@ -418,7 +418,7 @@ public class ByteInput { assert aligned() : "not aligned"; try { final int value = read16u(); // increments bits - return BitConstraints.safe16u(value); + return BitConstraints.safe16u(this, value); } catch (IndexOutOfBoundsException t) { throw new EndOfInput(t); } @@ -435,7 +435,7 @@ public class ByteInput { assert aligned() : "not aligned"; try { final long value = read32u(); // increments bits - return BitConstraints.safe32u(value); + return BitConstraints.safe32u(this, value); } catch (IndexOutOfBoundsException t) { throw new EndOfInput(t); } @@ -452,7 +452,7 @@ public class ByteInput { assert aligned() : "not aligned"; try { final long value = read64(); // increments bits - return BitConstraints.safe64u(value); + return BitConstraints.safe64u(this, value); } catch (IndexOutOfBoundsException t) { throw new EndOfInput(t); } diff --git a/core/src/com/riiablo/io/UnsafeNarrowing.java b/core/src/com/riiablo/io/UnsafeNarrowing.java index 0d5dec86..25d99bd4 100644 --- a/core/src/com/riiablo/io/UnsafeNarrowing.java +++ b/core/src/com/riiablo/io/UnsafeNarrowing.java @@ -1,13 +1,19 @@ package com.riiablo.io; public class UnsafeNarrowing extends RuntimeException { + public final ByteInput byteInput; public final long value; - UnsafeNarrowing(long value) { + UnsafeNarrowing(ByteInput byteInput, long value) { super("value(" + value + ") cannot be safely narrowed!"); + this.byteInput = byteInput; this.value = value; } + public ByteInput byteInput() { + return byteInput; + } + public short u8() { return (short) value; }