From 7a854e70cb9ec57f21a46df7fc52bad13487c010 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Sat, 18 Feb 2023 15:52:04 +0000 Subject: [PATCH] Add BdfReader methods for 32-bit ints. We use these a lot so it's convenient to have built-in support. Also make BdfReaderImpl and BdfWriterImpl final to enable compiler optimisations. --- .../bramble/api/data/BdfReader.java | 6 +++++ .../bramble/data/BdfReaderImpl.java | 27 ++++++++++++++++++- .../bramble/data/BdfWriterImpl.java | 2 +- .../bramble/data/BdfReaderImplTest.java | 25 ++++++++++++++++- 4 files changed, 57 insertions(+), 3 deletions(-) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/data/BdfReader.java b/bramble-api/src/main/java/org/briarproject/bramble/api/data/BdfReader.java index ab81a39cb..7e1ff0e50 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/data/BdfReader.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/data/BdfReader.java @@ -32,6 +32,12 @@ public interface BdfReader { void skipLong() throws IOException; + boolean hasInt() throws IOException; + + int readInt() throws IOException; + + void skipInt() throws IOException; + boolean hasDouble() throws IOException; double readDouble() throws IOException; diff --git a/bramble-core/src/main/java/org/briarproject/bramble/data/BdfReaderImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/data/BdfReaderImpl.java index 71734ec62..72fb8bd21 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/data/BdfReaderImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/data/BdfReaderImpl.java @@ -33,7 +33,7 @@ import static org.briarproject.bramble.util.StringUtils.fromUtf8; @NotThreadSafe @NotNullByDefault -class BdfReaderImpl implements BdfReader { +final class BdfReaderImpl implements BdfReader { private static final byte[] EMPTY_BUFFER = new byte[0]; @@ -232,6 +232,31 @@ class BdfReaderImpl implements BdfReader { hasLookahead = false; } + @Override + public boolean hasInt() throws IOException { + if (!hasLookahead) readLookahead(); + if (eof) return false; + return next == INT_8 || next == INT_16 || next == INT_32; + } + + @Override + public int readInt() throws IOException { + if (!hasInt()) throw new FormatException(); + hasLookahead = false; + if (next == INT_8) return readInt8(); + if (next == INT_16) return readInt16(); + return readInt32(); + } + + @Override + public void skipInt() throws IOException { + if (!hasInt()) throw new FormatException(); + if (next == INT_8) skip(1); + else if (next == INT_16) skip(2); + else skip(4); + hasLookahead = false; + } + @Override public boolean hasDouble() throws IOException { if (!hasLookahead) readLookahead(); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/data/BdfWriterImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/data/BdfWriterImpl.java index 54cc732ac..13812d6c1 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/data/BdfWriterImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/data/BdfWriterImpl.java @@ -38,7 +38,7 @@ import static org.briarproject.bramble.util.StringUtils.UTF_8; @NotThreadSafe @NotNullByDefault -class BdfWriterImpl implements BdfWriter { +final class BdfWriterImpl implements BdfWriter { private final OutputStream out; diff --git a/bramble-core/src/test/java/org/briarproject/bramble/data/BdfReaderImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/data/BdfReaderImplTest.java index ebd0af441..2b09189b7 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/data/BdfReaderImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/data/BdfReaderImplTest.java @@ -162,12 +162,35 @@ public class BdfReaderImplTest extends BrambleTestCase { } @Test - public void testSkipLong() throws Exception { + public void testSkipLong64() throws Exception { setContents("28" + "0000000080000000"); r.skipLong(); assertTrue(r.eof()); } + @Test + public void testReadInt() throws Exception { + setContents("21" + "7F" + "21" + "80" + + "22" + "7FFF" + "22" + "8000" + + "24" + "7FFFFFFF" + "24" + "80000000"); + assertEquals(Byte.MAX_VALUE, r.readInt()); + assertEquals(Byte.MIN_VALUE, r.readInt()); + assertEquals(Short.MAX_VALUE, r.readInt()); + assertEquals(Short.MIN_VALUE, r.readInt()); + assertEquals(Integer.MAX_VALUE, r.readInt()); + assertEquals(Integer.MIN_VALUE, r.readInt()); + assertTrue(r.eof()); + } + + @Test + public void testSkipInt() throws Exception { + setContents("21" + "7F" + "22" + "7FFF" + "24" + "7FFFFFFF"); + r.skipInt(); + r.skipInt(); + r.skipInt(); + assertTrue(r.eof()); + } + @Test public void testReadDouble() throws Exception { // http://babbage.cs.qc.edu/IEEE-754/Decimal.html