mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-02-16 10:30:42 +00:00
create MaterialSet$Singleton class
This commit is contained in:
@@ -9,7 +9,14 @@ package com.dfsek.terra.api.util.collection;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.Objects;
|
||||
import java.util.Spliterator;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
import com.dfsek.terra.api.block.BlockType;
|
||||
import com.dfsek.terra.api.block.state.BlockState;
|
||||
@@ -20,9 +27,7 @@ public class MaterialSet extends HashSet<BlockType> {
|
||||
private static final long serialVersionUID = 3056512763631017301L;
|
||||
|
||||
public static MaterialSet singleton(BlockType material) {
|
||||
MaterialSet set = new MaterialSet();
|
||||
set.add(material);
|
||||
return set;
|
||||
return new Singleton(material);
|
||||
}
|
||||
|
||||
public static MaterialSet get(BlockType... materials) {
|
||||
@@ -44,4 +49,108 @@ public class MaterialSet extends HashSet<BlockType> {
|
||||
private void add(BlockState data) {
|
||||
add(data.getBlockType());
|
||||
}
|
||||
|
||||
private static final class Singleton extends MaterialSet {
|
||||
private final BlockType element;
|
||||
|
||||
Singleton(BlockType e) {
|
||||
element = e;
|
||||
}
|
||||
|
||||
public Iterator<BlockType> iterator() {
|
||||
return new Iterator<>() {
|
||||
private boolean hasNext = true;
|
||||
|
||||
public boolean hasNext() {
|
||||
return hasNext;
|
||||
}
|
||||
|
||||
public BlockType next() {
|
||||
if(hasNext) {
|
||||
hasNext = false;
|
||||
return element;
|
||||
}
|
||||
throw new NoSuchElementException();
|
||||
}
|
||||
|
||||
public void remove() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void forEachRemaining(Consumer<? super BlockType> action) {
|
||||
Objects.requireNonNull(action);
|
||||
if(hasNext) {
|
||||
hasNext = false;
|
||||
action.accept(element);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public int size() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
public boolean contains(Object o) {
|
||||
return Objects.equals(o, element);
|
||||
}
|
||||
|
||||
// Override default methods for Collection
|
||||
@Override
|
||||
public void forEach(Consumer<? super BlockType> action) {
|
||||
action.accept(element);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Spliterator<BlockType> spliterator() {
|
||||
return new Spliterator<>() {
|
||||
long est = 1;
|
||||
|
||||
@Override
|
||||
public Spliterator<BlockType> trySplit() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean tryAdvance(Consumer<? super BlockType> consumer) {
|
||||
Objects.requireNonNull(consumer);
|
||||
if(est > 0) {
|
||||
est--;
|
||||
consumer.accept(element);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void forEachRemaining(Consumer<? super BlockType> consumer) {
|
||||
tryAdvance(consumer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long estimateSize() {
|
||||
return est;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int characteristics() {
|
||||
int value = (element != null) ? Spliterator.NONNULL : 0;
|
||||
|
||||
return value | Spliterator.SIZED | Spliterator.SUBSIZED | Spliterator.IMMUTABLE |
|
||||
Spliterator.DISTINCT | Spliterator.ORDERED;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean removeIf(Predicate<? super BlockType> filter) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(element);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,6 +36,11 @@ public class MaterialSetLoader implements TypeLoader<MaterialSet> {
|
||||
@Override
|
||||
public MaterialSet load(@NotNull AnnotatedType type, @NotNull Object o, @NotNull ConfigLoader configLoader, DepthTracker depthTracker) throws LoadException {
|
||||
List<String> stringData = (List<String>) o;
|
||||
|
||||
if(stringData.size() == 1) {
|
||||
return MaterialSet.singleton(configLoader.loadType(BlockType.class, stringData.get(0), depthTracker));
|
||||
}
|
||||
|
||||
MaterialSet set = new MaterialSet();
|
||||
|
||||
for(String string : stringData) {
|
||||
|
||||
Reference in New Issue
Block a user