Skip to content

Commit 2bde9db

Browse files
committed
Add generic type parameters to ArrayTag and ParentTag
1 parent a443563 commit 2bde9db

6 files changed

Lines changed: 83 additions & 14 deletions

File tree

src/main/java/org/glavo/nbt/tag/ArrayTag.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
package org.glavo.nbt.tag;
1717

1818
/// An abstract tag that contains an ordered list of values.
19-
public sealed abstract class ArrayTag extends Tag
19+
public sealed abstract class ArrayTag<E extends Number> extends Tag implements Iterable<E>
2020
permits ByteArrayTag, IntArrayTag, LongArrayTag {
2121

2222
protected ArrayTag(String name) {

src/main/java/org/glavo/nbt/tag/ByteArrayTag.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@
1919

2020
import java.io.IOException;
2121
import java.util.Arrays;
22+
import java.util.Iterator;
23+
import java.util.NoSuchElementException;
2224

2325
/// An ordered list of 8-bit integers.
24-
public final class ByteArrayTag extends ArrayTag {
26+
public final class ByteArrayTag extends ArrayTag<Byte> {
2527
private static final byte[] EMPTY = new byte[0];
2628

2729
byte[] value;
@@ -74,6 +76,27 @@ public int size() {
7476
return value.length;
7577
}
7678

79+
@Override
80+
public Iterator<Byte> iterator() {
81+
final byte[] array = this.value;
82+
return new Iterator<>() {
83+
private int cursor;
84+
85+
@Override
86+
public boolean hasNext() {
87+
return cursor < array.length;
88+
}
89+
90+
@Override
91+
public Byte next() {
92+
if (cursor >= array.length) {
93+
throw new NoSuchElementException();
94+
}
95+
return array[cursor++];
96+
}
97+
};
98+
}
99+
77100
@Override
78101
protected void readContent(NBTReader reader) throws IOException {
79102
value = reader.readByteArray();

src/main/java/org/glavo/nbt/tag/IntArrayTag.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@
1616
package org.glavo.nbt.tag;
1717

1818
import org.glavo.nbt.internal.input.NBTReader;
19+
import org.jetbrains.annotations.NotNull;
1920

2021
import java.io.IOException;
21-
import java.util.Arrays;
22+
import java.util.*;
2223
import java.util.stream.IntStream;
2324

2425
/// An ordered list of 32-bit integers.
25-
public final class IntArrayTag extends ArrayTag {
26+
public final class IntArrayTag extends ArrayTag<Integer> {
2627
private static final int[] EMPTY = new int[0];
2728

2829
int[] value;
@@ -75,6 +76,27 @@ public int size() {
7576
return value.length;
7677
}
7778

79+
@Override
80+
public PrimitiveIterator.OfInt iterator() {
81+
final int[] array = this.value;
82+
return new PrimitiveIterator.OfInt() {
83+
private int cursor;
84+
85+
@Override
86+
public boolean hasNext() {
87+
return cursor < array.length;
88+
}
89+
90+
@Override
91+
public int nextInt() {
92+
if (cursor >= array.length) {
93+
throw new NoSuchElementException();
94+
}
95+
return array[cursor++];
96+
}
97+
};
98+
}
99+
78100
/// Returns a sequential [IntStream] with this value as its source.
79101
public IntStream stream() {
80102
return Arrays.stream(value);

src/main/java/org/glavo/nbt/tag/LongArrayTag.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919

2020
import java.io.IOException;
2121
import java.util.Arrays;
22+
import java.util.NoSuchElementException;
23+
import java.util.PrimitiveIterator;
2224
import java.util.stream.LongStream;
2325

2426
/// An ordered list of 64-bit integers.
25-
public final class LongArrayTag extends ArrayTag {
27+
public final class LongArrayTag extends ArrayTag<Long> {
2628
private static final long[] EMPTY = new long[0];
2729

2830
long[] value;
@@ -75,6 +77,27 @@ public int size() {
7577
return value.length;
7678
}
7779

80+
@Override
81+
public PrimitiveIterator.OfLong iterator() {
82+
final long[] array = this.value;
83+
return new PrimitiveIterator.OfLong() {
84+
private int cursor;
85+
86+
@Override
87+
public boolean hasNext() {
88+
return cursor < array.length;
89+
}
90+
91+
@Override
92+
public long nextLong() {
93+
if (cursor >= array.length) {
94+
throw new NoSuchElementException();
95+
}
96+
return array[cursor++];
97+
}
98+
};
99+
}
100+
78101
/// Returns a sequential [LongStream] with this value as its source.
79102
public LongStream stream() {
80103
return Arrays.stream(value);
@@ -94,6 +117,7 @@ protected int contentHashCode() {
94117
protected boolean contentEquals(Tag other) {
95118
return other instanceof LongArrayTag that && Arrays.equals(value, that.value);
96119
}
120+
97121
@Override
98122
protected void contentToString(StringBuilder builder) {
99123
if (value.length > 0) {

src/main/java/org/glavo/nbt/tag/ParentTag.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@
2020
import java.util.List;
2121

2222
/// An abstract tag that contains other tags.
23-
public sealed abstract class ParentTag<T extends Tag> extends Tag
24-
implements Iterable<T>
23+
public sealed abstract class ParentTag<E extends Tag> extends Tag
24+
implements Iterable<E>
2525
permits CompoundTag, ListTag {
2626

27-
final List<T> subTags = new ArrayList<>();
27+
final List<E> subTags = new ArrayList<>();
2828

2929
protected ParentTag(String name) {
3030
super(name);
@@ -61,7 +61,7 @@ public final int size() {
6161
/// Returns the subtag at the given index.
6262
///
6363
/// @throws IndexOutOfBoundsException if the index is out of bounds.
64-
public final T get(int index) throws IndexOutOfBoundsException {
64+
public final E get(int index) throws IndexOutOfBoundsException {
6565
return subTags.get(index);
6666
}
6767

@@ -70,7 +70,7 @@ public final T get(int index) throws IndexOutOfBoundsException {
7070
/// If the `tag` is already a child of this tag, does nothing.
7171
///
7272
/// If the `tag` is already a child of another tag, removes it from old parent and adds it to this tag.
73-
public abstract void add(T tag) throws IllegalArgumentException;
73+
public abstract void add(E tag) throws IllegalArgumentException;
7474

7575
/// Removes the `tag` from this tag.
7676
///
@@ -80,8 +80,8 @@ public final T get(int index) throws IndexOutOfBoundsException {
8080
// Iterable implementation
8181

8282
@Override
83-
public final Iterator<T> iterator() {
84-
Iterator<T> iterator = subTags.iterator();
83+
public final Iterator<E> iterator() {
84+
Iterator<E> iterator = subTags.iterator();
8585

8686
// Prevent calling Iterator#remove()
8787
return new Iterator<>() {
@@ -91,7 +91,7 @@ public boolean hasNext() {
9191
}
9292

9393
@Override
94-
public T next() {
94+
public E next() {
9595
return iterator.next();
9696
}
9797
};

src/main/java/org/glavo/nbt/tag/Tag.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ protected void toString(StringBuilder builder) {
174174
builder.append(')');
175175
}
176176

177-
if (this instanceof ArrayTag || this instanceof ParentTag<?>) {
177+
if (this instanceof ArrayTag<?> || this instanceof ParentTag<?>) {
178178
this.contentToString(builder);
179179
} else {
180180
builder.append('[');

0 commit comments

Comments
 (0)