mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-06-19 07:11:14 +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.io.Serial;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
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.BlockType;
|
||||||
import com.dfsek.terra.api.block.state.BlockState;
|
import com.dfsek.terra.api.block.state.BlockState;
|
||||||
@@ -20,9 +27,7 @@ public class MaterialSet extends HashSet<BlockType> {
|
|||||||
private static final long serialVersionUID = 3056512763631017301L;
|
private static final long serialVersionUID = 3056512763631017301L;
|
||||||
|
|
||||||
public static MaterialSet singleton(BlockType material) {
|
public static MaterialSet singleton(BlockType material) {
|
||||||
MaterialSet set = new MaterialSet();
|
return new Singleton(material);
|
||||||
set.add(material);
|
|
||||||
return set;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MaterialSet get(BlockType... materials) {
|
public static MaterialSet get(BlockType... materials) {
|
||||||
@@ -44,4 +49,108 @@ public class MaterialSet extends HashSet<BlockType> {
|
|||||||
private void add(BlockState data) {
|
private void add(BlockState data) {
|
||||||
add(data.getBlockType());
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -36,6 +36,11 @@ public class MaterialSetLoader implements TypeLoader<MaterialSet> {
|
|||||||
@Override
|
@Override
|
||||||
public MaterialSet load(@NotNull AnnotatedType type, @NotNull Object o, @NotNull ConfigLoader configLoader, DepthTracker depthTracker) throws LoadException {
|
public MaterialSet load(@NotNull AnnotatedType type, @NotNull Object o, @NotNull ConfigLoader configLoader, DepthTracker depthTracker) throws LoadException {
|
||||||
List<String> stringData = (List<String>) o;
|
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();
|
MaterialSet set = new MaterialSet();
|
||||||
|
|
||||||
for(String string : stringData) {
|
for(String string : stringData) {
|
||||||
|
|||||||
Reference in New Issue
Block a user