From 7b3833f3a792977f0b51a679459c12f1c0b6a7ea Mon Sep 17 00:00:00 2001 From: AndEditor7 <35620587+AndEditor7@users.noreply.github.com> Date: Sat, 18 Jan 2025 20:01:35 +1100 Subject: [PATCH] Merge pull request #3 from AndEditor7/improvements * API improvements * Add list iterator --- gradle.properties | 2 +- .../dev/ultreon/ubo/DataTypeRegistry.java | 16 +++++++++++++-- src/main/java/dev/ultreon/ubo/UsoParser.java | 7 ++----- .../java/dev/ultreon/ubo/types/ArrayType.java | 6 ++++-- .../dev/ultreon/ubo/types/BitSetType.java | 4 ++-- .../dev/ultreon/ubo/types/BooleanType.java | 8 ++++++++ .../java/dev/ultreon/ubo/types/ByteType.java | 8 ++++++++ .../java/dev/ultreon/ubo/types/CharType.java | 8 ++++++++ .../java/dev/ultreon/ubo/types/DataType.java | 2 ++ .../dev/ultreon/ubo/types/DoubleType.java | 8 ++++++++ .../dev/ultreon/ubo/types/FloatArrayType.java | 8 ++++++++ .../java/dev/ultreon/ubo/types/FloatType.java | 8 ++++++++ .../dev/ultreon/ubo/types/IntArrayType.java | 4 ++++ .../java/dev/ultreon/ubo/types/IntType.java | 8 ++++++++ .../java/dev/ultreon/ubo/types/ListType.java | 8 ++++++-- .../dev/ultreon/ubo/types/LongArrayType.java | 4 ++++ .../java/dev/ultreon/ubo/types/LongType.java | 8 ++++++++ .../java/dev/ultreon/ubo/types/MapType.java | 16 +++++++-------- .../dev/ultreon/ubo/types/ShortArrayType.java | 12 +++++++++++ .../java/dev/ultreon/ubo/types/ShortType.java | 8 ++++++++ .../dev/ultreon/ubo/types/StringType.java | 20 ++++++++++++++++++- .../java/dev/ultreon/ubo/types/UUIDType.java | 2 +- 22 files changed, 151 insertions(+), 24 deletions(-) diff --git a/gradle.properties b/gradle.properties index a85d2c5..26c1a3f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ group=dev.ultreon archivesBaseName=ubo -version=1.5.0 +version=1.6.0 diff --git a/src/main/java/dev/ultreon/ubo/DataTypeRegistry.java b/src/main/java/dev/ultreon/ubo/DataTypeRegistry.java index 0c72013..f4272cb 100644 --- a/src/main/java/dev/ultreon/ubo/DataTypeRegistry.java +++ b/src/main/java/dev/ultreon/ubo/DataTypeRegistry.java @@ -13,6 +13,10 @@ public class DataTypeRegistry { private static final Map ID_MAP = new HashMap<>(); static { + init(); + } + + public static void init() { register(DataTypes.BYTE, ByteType::read); register(DataTypes.SHORT, ShortType::read); register(DataTypes.INT, IntType::read); @@ -37,6 +41,12 @@ public class DataTypeRegistry { register(DataTypes.BIT_SET, BitSetType::read); } + public static void clear() { + READERS.clear(); + TYPES.clear(); + ID_MAP.clear(); + } + @SafeVarargs @SuppressWarnings("unchecked") public static > void register(int id, DataReader reader, T... type) { @@ -47,10 +57,12 @@ public static > void register(int id, DataReader reader } public static DataType read(int id, DataInput input) throws IOException { - if (!READERS.containsKey(id)) + DataReader> reader = READERS.get(id); + + if (reader == null) throw new DataTypeException("Unknown datatype id: " + id); - return READERS.get(id).read(input); + return reader.read(input); } public static Class> getType(int id) { diff --git a/src/main/java/dev/ultreon/ubo/UsoParser.java b/src/main/java/dev/ultreon/ubo/UsoParser.java index ebcaea4..d075ad1 100644 --- a/src/main/java/dev/ultreon/ubo/UsoParser.java +++ b/src/main/java/dev/ultreon/ubo/UsoParser.java @@ -10,13 +10,10 @@ import java.util.UUID; public class UsoParser { - private final String input; private final char[] chars; private int pos; - private char c; public UsoParser(String input) { - this.input = input; this.chars = input.toCharArray(); } @@ -609,7 +606,7 @@ private int unread() { return -1; } - return this.c = this.chars[--this.pos]; + return this.chars[--this.pos]; } private int read() { @@ -617,7 +614,7 @@ private int read() { return -1; } - return this.c = this.chars[this.pos++]; + return this.chars[this.pos++]; } public DataType parse() throws IOException { diff --git a/src/main/java/dev/ultreon/ubo/types/ArrayType.java b/src/main/java/dev/ultreon/ubo/types/ArrayType.java index 4386f04..dbc97f6 100644 --- a/src/main/java/dev/ultreon/ubo/types/ArrayType.java +++ b/src/main/java/dev/ultreon/ubo/types/ArrayType.java @@ -1,10 +1,12 @@ package dev.ultreon.ubo.types; -import org.jetbrains.annotations.NotNull; - public interface ArrayType extends DataType, Iterable { int size(); + default boolean isEmpty() { + return size() == 0; + } + B get(int index); void set(int index, B value); diff --git a/src/main/java/dev/ultreon/ubo/types/BitSetType.java b/src/main/java/dev/ultreon/ubo/types/BitSetType.java index 4631c84..08b5317 100644 --- a/src/main/java/dev/ultreon/ubo/types/BitSetType.java +++ b/src/main/java/dev/ultreon/ubo/types/BitSetType.java @@ -48,8 +48,8 @@ public int id() { @Override public void write(DataOutput output) throws IOException { - byte[] arr = this.obj.toByteArray(); - if (arr.length >= 32768) throw new IllegalArgumentException("Bitset is too big to be written"); + byte[] arr = obj.toByteArray(); + if (arr.length > 65535) throw new IllegalArgumentException("Bitset is too big to be written"); output.writeShort(arr.length); for (byte b : arr) { output.writeByte(b); diff --git a/src/main/java/dev/ultreon/ubo/types/BooleanType.java b/src/main/java/dev/ultreon/ubo/types/BooleanType.java index 93a7927..8fc89b1 100644 --- a/src/main/java/dev/ultreon/ubo/types/BooleanType.java +++ b/src/main/java/dev/ultreon/ubo/types/BooleanType.java @@ -18,12 +18,20 @@ public Boolean getValue() { return obj; } + public boolean getBooleanValue() { + return obj; + } + @Override public void setValue(Boolean obj) { if (obj == null) throw new IllegalArgumentException("Value can't be set to null"); this.obj = obj; } + public void setValue(boolean val) { + this.obj = val; + } + @Override public int id() { return DataTypes.BOOLEAN; diff --git a/src/main/java/dev/ultreon/ubo/types/ByteType.java b/src/main/java/dev/ultreon/ubo/types/ByteType.java index ba36a4e..54e744a 100644 --- a/src/main/java/dev/ultreon/ubo/types/ByteType.java +++ b/src/main/java/dev/ultreon/ubo/types/ByteType.java @@ -22,12 +22,20 @@ public Byte getValue() { return obj; } + public byte getByteValue() { + return obj; + } + @Override public void setValue(Byte obj) { if (obj == null) throw new IllegalArgumentException("Value can't be set to null"); this.obj = obj; } + public void setValue(byte val) { + this.obj = val; + } + @Override public int id() { return DataTypes.BYTE; diff --git a/src/main/java/dev/ultreon/ubo/types/CharType.java b/src/main/java/dev/ultreon/ubo/types/CharType.java index 9c4a451..7d1fb5f 100644 --- a/src/main/java/dev/ultreon/ubo/types/CharType.java +++ b/src/main/java/dev/ultreon/ubo/types/CharType.java @@ -18,12 +18,20 @@ public Character getValue() { return obj; } + public char getCharValue() { + return obj; + } + @Override public void setValue(Character obj) { if (obj == null) throw new IllegalArgumentException("Value can't be set to null"); this.obj = obj; } + public void setValue(char val) { + this.obj = val; + } + @Override public int id() { return DataTypes.CHAR; diff --git a/src/main/java/dev/ultreon/ubo/types/DataType.java b/src/main/java/dev/ultreon/ubo/types/DataType.java index 09084da..84231f3 100644 --- a/src/main/java/dev/ultreon/ubo/types/DataType.java +++ b/src/main/java/dev/ultreon/ubo/types/DataType.java @@ -15,8 +15,10 @@ public interface DataType { void write(DataOutput output) throws IOException; + @Override boolean equals(Object other); + @Override int hashCode(); DataType copy(); diff --git a/src/main/java/dev/ultreon/ubo/types/DoubleType.java b/src/main/java/dev/ultreon/ubo/types/DoubleType.java index bc71457..f9e7866 100644 --- a/src/main/java/dev/ultreon/ubo/types/DoubleType.java +++ b/src/main/java/dev/ultreon/ubo/types/DoubleType.java @@ -18,12 +18,20 @@ public Double getValue() { return obj; } + public double getDoubleValue() { + return obj; + } + @Override public void setValue(Double obj) { if (obj == null) throw new IllegalArgumentException("Value can't be set to null"); this.obj = obj; } + public void setValue(double val) { + this.obj = val; + } + @Override public int id() { return DataTypes.DOUBLE; diff --git a/src/main/java/dev/ultreon/ubo/types/FloatArrayType.java b/src/main/java/dev/ultreon/ubo/types/FloatArrayType.java index b332533..9bcfd12 100644 --- a/src/main/java/dev/ultreon/ubo/types/FloatArrayType.java +++ b/src/main/java/dev/ultreon/ubo/types/FloatArrayType.java @@ -86,6 +86,14 @@ public void set(int index, Float value) { obj[index] = value; } + public float getFloat(int index) { + return obj[index]; + } + + public void set(int index, float value) { + obj[index] = value; + } + @Override public String writeUso() { StringBuilder builder = new StringBuilder("(f;"); diff --git a/src/main/java/dev/ultreon/ubo/types/FloatType.java b/src/main/java/dev/ultreon/ubo/types/FloatType.java index 5121fd7..11ef7e9 100644 --- a/src/main/java/dev/ultreon/ubo/types/FloatType.java +++ b/src/main/java/dev/ultreon/ubo/types/FloatType.java @@ -18,12 +18,20 @@ public Float getValue() { return obj; } + public float getFloatValue() { + return obj; + } + @Override public void setValue(Float obj) { if (obj == null) throw new IllegalArgumentException("Value can't be set to null"); this.obj = obj; } + public void setValue(float val) { + this.obj = val; + } + @Override public int id() { return DataTypes.FLOAT; diff --git a/src/main/java/dev/ultreon/ubo/types/IntArrayType.java b/src/main/java/dev/ultreon/ubo/types/IntArrayType.java index ade7c7f..6eb0c2a 100644 --- a/src/main/java/dev/ultreon/ubo/types/IntArrayType.java +++ b/src/main/java/dev/ultreon/ubo/types/IntArrayType.java @@ -16,6 +16,10 @@ public IntArrayType(int[] obj) { this.obj = obj; } + public IntArrayType(int size) { + this.obj = new int[size]; + } + @Override public int[] getValue() { return obj; diff --git a/src/main/java/dev/ultreon/ubo/types/IntType.java b/src/main/java/dev/ultreon/ubo/types/IntType.java index afea6f3..7604be3 100644 --- a/src/main/java/dev/ultreon/ubo/types/IntType.java +++ b/src/main/java/dev/ultreon/ubo/types/IntType.java @@ -18,12 +18,20 @@ public Integer getValue() { return obj; } + public int getIntValue() { + return obj; + } + @Override public void setValue(Integer obj) { if (obj == null) throw new IllegalArgumentException("Value can't be set to null"); this.obj = obj; } + public void setValue(int val) { + this.obj = val; + } + @Override public int id() { return DataTypes.INT; diff --git a/src/main/java/dev/ultreon/ubo/types/ListType.java b/src/main/java/dev/ultreon/ubo/types/ListType.java index 8c09b7e..b7fc2a8 100644 --- a/src/main/java/dev/ultreon/ubo/types/ListType.java +++ b/src/main/java/dev/ultreon/ubo/types/ListType.java @@ -57,7 +57,7 @@ public List getValue() { @Override public void setValue(List obj) { int id = -1; - List list = new ArrayList<>(); + List list = new ArrayList<>(obj.size()); for (int i = 0, objSize = obj.size(); i < objSize; i++) { T iType = obj.get(i); if (id == -1) { @@ -106,7 +106,11 @@ public void add(T type) { @Override public @NotNull Iterator iterator() { - return getValue().listIterator(); + return obj.iterator(); + } + + public @NotNull ListIterator listIterator() { + return obj.listIterator(); } public int type() { diff --git a/src/main/java/dev/ultreon/ubo/types/LongArrayType.java b/src/main/java/dev/ultreon/ubo/types/LongArrayType.java index 9137d16..992e322 100644 --- a/src/main/java/dev/ultreon/ubo/types/LongArrayType.java +++ b/src/main/java/dev/ultreon/ubo/types/LongArrayType.java @@ -16,6 +16,10 @@ public LongArrayType(long[] obj) { this.obj = obj; } + public LongArrayType(int size) { + this.obj = new long[size]; + } + @Override public long[] getValue() { return obj; diff --git a/src/main/java/dev/ultreon/ubo/types/LongType.java b/src/main/java/dev/ultreon/ubo/types/LongType.java index 63c5544..c5fef29 100644 --- a/src/main/java/dev/ultreon/ubo/types/LongType.java +++ b/src/main/java/dev/ultreon/ubo/types/LongType.java @@ -18,12 +18,20 @@ public Long getValue() { return obj; } + public long getLongValue() { + return obj; + } + @Override public void setValue(Long obj) { if (obj == null) throw new IllegalArgumentException("Value can't be set to null"); this.obj = obj; } + public void setValue(long val) { + this.obj = val; + } + @Override public int id() { return DataTypes.LONG; diff --git a/src/main/java/dev/ultreon/ubo/types/MapType.java b/src/main/java/dev/ultreon/ubo/types/MapType.java index 658ecc7..6008b3a 100644 --- a/src/main/java/dev/ultreon/ubo/types/MapType.java +++ b/src/main/java/dev/ultreon/ubo/types/MapType.java @@ -197,7 +197,7 @@ public byte getByte(String key) { public byte getByte(String key, byte def) { DataType dataType = get(key); if (dataType instanceof ByteType) { - return ((ByteType) dataType).getValue(); + return ((ByteType) dataType).getByteValue(); } return def; } @@ -209,7 +209,7 @@ public short getShort(String key) { public short getShort(String key, short def) { DataType dataType = get(key); if (dataType instanceof ShortType) { - return ((ShortType) dataType).getValue(); + return ((ShortType) dataType).getShortValue(); } return def; } @@ -221,7 +221,7 @@ public int getInt(String key) { public int getInt(String key, int def) { DataType dataType = get(key); if (dataType instanceof IntType) { - return ((IntType) dataType).getValue(); + return ((IntType) dataType).getIntValue(); } return def; } @@ -233,7 +233,7 @@ public long getLong(String key) { public long getLong(String key, long def) { DataType dataType = get(key); if (dataType instanceof LongType) { - return ((LongType) dataType).getValue(); + return ((LongType) dataType).getLongValue(); } return def; } @@ -257,7 +257,7 @@ public float getFloat(String key) { public float getFloat(String key, float def) { DataType dataType = get(key); if (dataType instanceof FloatType) { - return ((FloatType) dataType).getValue(); + return ((FloatType) dataType).getFloatValue(); } return def; } @@ -269,7 +269,7 @@ public double getDouble(String key) { public double getDouble(String key, double def) { DataType dataType = get(key); if (dataType instanceof DoubleType) { - return ((DoubleType) dataType).getValue(); + return ((DoubleType) dataType).getDoubleValue(); } return def; } @@ -293,7 +293,7 @@ public char getChar(String key) { public char getChar(String key, char def) { DataType dataType = get(key); if (dataType instanceof CharType) { - return ((CharType) dataType).getValue(); + return ((CharType) dataType).getCharValue(); } return def; } @@ -305,7 +305,7 @@ public boolean getBoolean(String key) { public boolean getBoolean(String key, boolean def) { DataType dataType = get(key); if (dataType instanceof BooleanType) { - return ((BooleanType) dataType).getValue(); + return ((BooleanType) dataType).getBooleanValue(); } return def; } diff --git a/src/main/java/dev/ultreon/ubo/types/ShortArrayType.java b/src/main/java/dev/ultreon/ubo/types/ShortArrayType.java index f2d7d08..eb10190 100644 --- a/src/main/java/dev/ultreon/ubo/types/ShortArrayType.java +++ b/src/main/java/dev/ultreon/ubo/types/ShortArrayType.java @@ -16,6 +16,10 @@ public ShortArrayType(short[] obj) { this.obj = obj; } + public ShortArrayType(int size) { + this.obj = new short[size]; + } + @Override public short[] getValue() { return obj; @@ -82,6 +86,14 @@ public void set(int index, Short value) { obj[index] = value; } + public short getShort(int index) { + return obj[index]; + } + + public void set(int index, short value) { + obj[index] = value; + } + @Override public String writeUso() { StringBuilder builder = new StringBuilder("(s;"); diff --git a/src/main/java/dev/ultreon/ubo/types/ShortType.java b/src/main/java/dev/ultreon/ubo/types/ShortType.java index 6692608..c3c7c33 100644 --- a/src/main/java/dev/ultreon/ubo/types/ShortType.java +++ b/src/main/java/dev/ultreon/ubo/types/ShortType.java @@ -22,12 +22,20 @@ public Short getValue() { return obj; } + public short getShortValue() { + return obj; + } + @Override public void setValue(Short obj) { if (obj == null) throw new IllegalArgumentException("Value can't be set to null"); this.obj = obj; } + public void setValue(short val) { + this.obj = val; + } + @Override public int id() { return DataTypes.SHORT; diff --git a/src/main/java/dev/ultreon/ubo/types/StringType.java b/src/main/java/dev/ultreon/ubo/types/StringType.java index d22879c..a5e2f7c 100644 --- a/src/main/java/dev/ultreon/ubo/types/StringType.java +++ b/src/main/java/dev/ultreon/ubo/types/StringType.java @@ -1,6 +1,7 @@ package dev.ultreon.ubo.types; import dev.ultreon.ubo.DataTypes; +import org.jetbrains.annotations.NotNull; import java.io.DataInput; import java.io.DataOutput; @@ -8,7 +9,7 @@ import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -public class StringType implements DataType { +public class StringType implements DataType, CharSequence { private String obj; public StringType(String obj) { @@ -49,6 +50,7 @@ public int id() { @Override public void write(DataOutput output) throws IOException { + if (obj.length() > 65535) throw new IllegalArgumentException("String is too big to be written (length > 65535)"); output.writeShort(obj.length()); for (byte aByte : obj.getBytes(StandardCharsets.UTF_8)) { output.writeByte(aByte); @@ -87,6 +89,22 @@ public String writeUso() { return "\"" + obj.replace("\"", "\\\"") + "\""; } + @Override + public int length() { + return obj.length(); + } + + @Override + public char charAt(int index) { + return obj.charAt(index); + } + + @NotNull + @Override + public CharSequence subSequence(int start, int end) { + return obj.subSequence(start, end); + } + @Override public String toString() { return writeUso(); diff --git a/src/main/java/dev/ultreon/ubo/types/UUIDType.java b/src/main/java/dev/ultreon/ubo/types/UUIDType.java index adaa202..ad78972 100644 --- a/src/main/java/dev/ultreon/ubo/types/UUIDType.java +++ b/src/main/java/dev/ultreon/ubo/types/UUIDType.java @@ -58,7 +58,7 @@ public int hashCode() { @Override public UUIDType copy() { - return new UUIDType(new UUID(obj.getMostSignificantBits(), obj.getLeastSignificantBits())); + return new UUIDType(obj); } @Override