mirror of
https://github.com/MinecraftForge/MinecraftForge.git
synced 2026-11-13 00:37:52 +00:00
Optimize ConcatenatedListView's Iterator and fix hidden CreativeTabs taking up page space.
This commit is contained in:
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); }
|
||||
|
||||
Reference in new issue
Block a user