package emu.grasscutter.utils; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.TreeSet; public final class SparseSet { private final List rangeEntries; private final Set denseEntries; public SparseSet(String csv) { this.rangeEntries = new ArrayList<>(); this.denseEntries = new TreeSet<>(); for (String token : csv.replace("\n", "").replace(" ", "").split(",")) { String[] tokens = token.split("-"); switch (tokens.length) { case 1: this.denseEntries.add(Integer.parseInt(tokens[0])); break; case 2: this.rangeEntries.add( new Range(Integer.parseInt(tokens[0]), Integer.parseInt(tokens[1]))); break; default: throw new IllegalArgumentException( "Invalid token passed to SparseSet initializer - " + token + " (split length " + tokens.length + ")"); } } } public boolean contains(int i) { for (Range range : this.rangeEntries) { if (range.check(i)) { return true; } } return this.denseEntries.contains(i); } /* * A convenience class for constructing integer sets out of large ranges * Designed to be fed literal strings from this project only - * can and will throw exceptions to tell you to fix your code if you feed it garbage. :) */ private static class Range { private final int min, max; public Range(int min, int max) { if (min > max) { throw new IllegalArgumentException( "Range passed minimum higher than maximum - " + min + " > " + max); } this.min = min; this.max = max; } public boolean check(int value) { return value >= this.min && value <= this.max; } } }