From c6f42da61bb9d0dbe687fea61bad1b2851ee1245 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 30 Dec 2021 16:35:51 -0700 Subject: [PATCH] create MaterialSet$Singleton class --- .../api/util/collection/MaterialSet.java | 115 +++++++++++++++++- .../config/loaders/MaterialSetLoader.java | 5 + 2 files changed, 117 insertions(+), 3 deletions(-) diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/collection/MaterialSet.java b/common/api/src/main/java/com/dfsek/terra/api/util/collection/MaterialSet.java index 6d53c30d3..a7f02a153 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/collection/MaterialSet.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/collection/MaterialSet.java @@ -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 { 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 { 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 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 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 action) { + action.accept(element); + } + + @Override + public Spliterator spliterator() { + return new Spliterator<>() { + long est = 1; + + @Override + public Spliterator trySplit() { + return null; + } + + @Override + public boolean tryAdvance(Consumer consumer) { + Objects.requireNonNull(consumer); + if(est > 0) { + est--; + consumer.accept(element); + return true; + } + return false; + } + + @Override + public void forEachRemaining(Consumer 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 filter) { + throw new UnsupportedOperationException(); + } + + @Override + public int hashCode() { + return Objects.hashCode(element); + } + } } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java index 09e574589..4fc466afd 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java @@ -36,6 +36,11 @@ public class MaterialSetLoader implements TypeLoader { @Override public MaterialSet load(@NotNull AnnotatedType type, @NotNull Object o, @NotNull ConfigLoader configLoader, DepthTracker depthTracker) throws LoadException { List stringData = (List) o; + + if(stringData.size() == 1) { + return MaterialSet.singleton(configLoader.loadType(BlockType.class, stringData.get(0), depthTracker)); + } + MaterialSet set = new MaterialSet(); for(String string : stringData) {