Optimize ConcatenatedListView's Iterator and fix hidden CreativeTabs taking up page space.

This commit is contained in:
LexManos committed 2025-09-23 13:37:53 -07:00
1 parent 0a885a77e7
commit 728fd6ff24
2 files changed
+50 -39

No files matched your search

@@ -5,11 +5,17 @@
package net.minecraftforge.common.util;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import org.jetbrains.annotations.NotNull;
import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.NoSuchElementException;
import java.util.function.Supplier;
/**
@@ -18,16 +24,13 @@ import java.util.function.Supplier;
* for each of your collections.<p/>
* This list does not support modification operations, but the underlying lists may be mutated safely externally.
*/
public class ConcatenatedListView<T> implements List<T>
{
public class ConcatenatedListView<T> implements List<T> {
@SafeVarargs
public static <T> ConcatenatedListView<T> of(List<T>... lists)
{
public static <T> ConcatenatedListView<T> of(List<T>... lists) {
return new ConcatenatedListView<>(List.of(lists));
}
public static <T> List<T> of(List<? extends List<? extends T>> members)
{
public static <T> List<T> of(List<? extends List<? extends T>> members) {
return switch (members.size()) {
case 0 -> List.of();
case 1 -> Collections.unmodifiableList(members.getFirst());
@@ -37,14 +40,12 @@ public class ConcatenatedListView<T> implements List<T>
private final List<? extends List<? extends T>> lists;
private ConcatenatedListView(List<? extends List<? extends T>> lists)
{
private ConcatenatedListView(List<? extends List<? extends T>> lists) {
this.lists = lists;
}
@Override
public int size()
{
public int size() {
int size = 0;
for (var list : lists)
size += list.size();
@@ -52,8 +53,7 @@ public class ConcatenatedListView<T> implements List<T>
}
@Override
public boolean isEmpty()
{
public boolean isEmpty() {
for (List<? extends T> list : lists)
if (!list.isEmpty())
return false;
@@ -61,8 +61,7 @@ public class ConcatenatedListView<T> implements List<T>
}
@Override
public boolean contains(Object o)
{
public boolean contains(Object o) {
for (var list : lists)
if (list.contains(o))
return true;
@@ -70,10 +69,8 @@ public class ConcatenatedListView<T> implements List<T>
}
@Override
public T get(int index)
{
for (var list : lists)
{
public T get(int index) {
for (var list : lists) {
int size = list.size();
if (index < size)
return list.get(index);
@@ -83,11 +80,9 @@ public class ConcatenatedListView<T> implements List<T>
}
@Override
public int indexOf(Object o)
{
public int indexOf(Object o) {
int offset = 0;
for (var list : lists)
{
for (var list : lists) {
int foundIndex = list.indexOf(o);
if (foundIndex >= 0)
return offset + foundIndex;
@@ -97,11 +92,9 @@ public class ConcatenatedListView<T> implements List<T>
}
@Override
public int lastIndexOf(Object o)
{
public int lastIndexOf(Object o) {
int offset = 0;
for (var list : Lists.reverse(lists))
{
for (var list : Lists.reverse(lists)) {
int foundIndex = list.lastIndexOf(o);
if (foundIndex >= 0)
return offset + foundIndex;
@@ -112,25 +105,42 @@ public class ConcatenatedListView<T> implements List<T>
@NotNull
@Override
public Iterator<T> iterator()
{
return Iterables.unmodifiableIterable(Iterables.concat(lists)).iterator();
}
public Iterator<T> iterator() {
return new Iterator<T>() {
private Iterator<? extends List<? extends T>> listItr = lists.iterator();
private Iterator<? extends T> current;
@Override
public Spliterator<T> spliterator()
{
return Iterables.unmodifiableIterable(Iterables.concat(lists)).spliterator();
@Override
public boolean hasNext() {
while ((current == null || !current.hasNext()) && listItr.hasNext()) {
var nextList = listItr.next();
if (nextList != null)
current = nextList.iterator();
}
return current != null;
}
@Override
public T next() {
if (!hasNext())
throw new NoSuchElementException();
T next = current.next();
if (!current.hasNext())
current = null;
return next;
}
};
}
// Delegate to a concatenated collection
private <C extends Collection<T>> C concatenate(Supplier<C> collectionFactory)
{
private <C extends Collection<T>> C concatenate(Supplier<C> collectionFactory) {
var concat = collectionFactory.get();
for (var list : lists)
concat.addAll(list);
return concat;
}
@NotNull @Override public Object[] toArray() { return concatenate(ArrayList::new).toArray(); }
@NotNull @Override public <T1> T1[] toArray(@NotNull T1[] a) { return concatenate(ArrayList::new).toArray(a); }
@Override public boolean containsAll(@NotNull Collection<?> c) { return concatenate(HashSet::new).containsAll(c); }