Commit b83e20b5 authored by Skylot's avatar Skylot

core: improve immutable list implementation

parent 160ad64e
...@@ -6,6 +6,7 @@ import java.util.Comparator; ...@@ -6,6 +6,7 @@ import java.util.Comparator;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.ListIterator; import java.util.ListIterator;
import java.util.NoSuchElementException;
import java.util.Objects; import java.util.Objects;
import java.util.RandomAccess; import java.util.RandomAccess;
import java.util.function.Consumer; import java.util.function.Consumer;
...@@ -21,9 +22,13 @@ import org.jetbrains.annotations.NotNull; ...@@ -21,9 +22,13 @@ import org.jetbrains.annotations.NotNull;
public final class ImmutableList<E> implements List<E>, RandomAccess { public final class ImmutableList<E> implements List<E>, RandomAccess {
private final E[] arr; private final E[] arr;
@SuppressWarnings("unchecked") @SuppressWarnings({"unchecked", "SuspiciousArrayCast"})
public ImmutableList(Object[] arr) { public ImmutableList(Collection<E> col) {
this.arr = (E[]) Objects.requireNonNull(arr); this((E[]) Objects.requireNonNull(col).toArray());
}
public ImmutableList(E[] arr) {
this.arr = Objects.requireNonNull(arr);
} }
@Override @Override
...@@ -88,7 +93,11 @@ public final class ImmutableList<E> implements List<E>, RandomAccess { ...@@ -88,7 +93,11 @@ public final class ImmutableList<E> implements List<E>, RandomAccess {
@Override @Override
public E next() { public E next() {
return arr[index++]; try {
return arr[index++];
} catch (IndexOutOfBoundsException e) {
throw new NoSuchElementException(e.getMessage());
}
} }
}; };
} }
...@@ -103,14 +112,14 @@ public final class ImmutableList<E> implements List<E>, RandomAccess { ...@@ -103,14 +112,14 @@ public final class ImmutableList<E> implements List<E>, RandomAccess {
@NotNull @NotNull
@Override @Override
public Object[] toArray() { public Object[] toArray() {
return arr; return Arrays.copyOf(arr, arr.length);
} }
@NotNull @NotNull
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public <T> T[] toArray(@NotNull T[] a) { public <T> T[] toArray(@NotNull T[] a) {
return (T[]) arr; return (T[]) Arrays.copyOf(arr, arr.length);
} }
@Override @Override
......
...@@ -118,6 +118,6 @@ public class Utils { ...@@ -118,6 +118,6 @@ public class Utils {
if (list.size() == 1) { if (list.size() == 1) {
return Collections.singletonList(list.get(0)); return Collections.singletonList(list.get(0));
} }
return new ImmutableList<>(list.toArray()); return new ImmutableList<>(list);
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment