package net.minecraft.core; import com.google.common.collect.Lists; import java.util.AbstractList; import java.util.Arrays; import java.util.List; import org.apache.commons.lang3.Validate; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class NonNullList extends AbstractList { private final List list; @Nullable private final E defaultValue; public static NonNullList create() { return new NonNullList<>(Lists.newArrayList(), null); } public static NonNullList createWithCapacity(int initialCapacity) { return new NonNullList<>(Lists.newArrayListWithCapacity(initialCapacity), null); } /** * Creates a new NonNullList with fixed size and default value. The list will be filled with the default value. */ public static NonNullList withSize(int size, E defaultValue) { Validate.notNull(defaultValue); Object[] objects = new Object[size]; Arrays.fill(objects, defaultValue); return new NonNullList<>(Arrays.asList(objects), defaultValue); } @SafeVarargs public static NonNullList of(E defaultValue, E... elements) { return new NonNullList<>(Arrays.asList(elements), defaultValue); } protected NonNullList(List list, @Nullable E defaultValue) { this.list = list; this.defaultValue = defaultValue; } @NotNull public E get(int i) { return (E)this.list.get(i); } public E set(int i, E object) { Validate.notNull(object); return (E)this.list.set(i, object); } public void add(int i, E object) { Validate.notNull(object); this.list.add(i, object); } public E remove(int i) { return (E)this.list.remove(i); } public int size() { return this.list.size(); } public void clear() { if (this.defaultValue == null) { super.clear(); } else { for (int i = 0; i < this.size(); i++) { this.set(i, this.defaultValue); } } } }