Created
March 11, 2019 02:36
-
-
Save Daomephsta/d4f05b89b722b2a14a0e2c7e753e3dd5 to your computer and use it in GitHub Desktop.
ItemStackMapBuilder
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package daomephsta.umbra.item.stack; | |
import java.util.Map; | |
import java.util.Objects; | |
import daomephsta.umbra.item.stack.ItemStackMapBuilderStages.*; | |
import it.unimi.dsi.fastutil.Hash; | |
import it.unimi.dsi.fastutil.Hash.Strategy; | |
import it.unimi.dsi.fastutil.objects.*; | |
import net.minecraft.item.ItemStack; | |
public class ItemStackMapBuilder implements ChooseLinked, ChooseLoadFactor, ChooseValueType | |
{ | |
private final Hash.Strategy<ItemStack> strategy; | |
private float loadFactor = Float.NaN; | |
private boolean linked = false; | |
private ItemStackMapBuilder(Strategy<ItemStack> strategy) | |
{ | |
this.strategy = strategy; | |
} | |
public static ChooseLinked criteria(int criteria) | |
{ | |
return new ItemStackMapBuilder(new ItemStackStrategy(criteria)); | |
} | |
@Override | |
public ChooseLoadFactor linked() | |
{ | |
this.linked = true; | |
return this; | |
} | |
@Override | |
public ChooseLoadFactor nonlinked() | |
{ | |
this.linked = false; | |
return this; | |
} | |
@Override | |
public ChooseValueType defaultLoadFactor() | |
{ | |
return loadFactor(Hash.DEFAULT_LOAD_FACTOR); | |
} | |
@Override | |
public ChooseValueType loadFactor(float loadFactor) | |
{ | |
this.loadFactor = loadFactor; | |
return this; | |
} | |
@Override | |
public <V> FinalStageObjectValued<V> objectValued() | |
{ | |
return objectValued(Hash.DEFAULT_INITIAL_SIZE); | |
} | |
@Override | |
public <V> FinalStageObjectValued<V> objectValued(int expectedSize) | |
{ | |
return () -> linked | |
? new Object2ObjectLinkedOpenCustomHashMap<ItemStack, V>(expectedSize, loadFactor, strategy) | |
: new Object2ObjectOpenCustomHashMap<ItemStack, V>(expectedSize, loadFactor, strategy); | |
} | |
@Override | |
public <V> FinalStageObjectValued<V> objectValued(Map<? extends ItemStack, V> source) | |
{ | |
return () -> linked | |
? new Object2ObjectLinkedOpenCustomHashMap<ItemStack, V>(source, loadFactor, strategy) | |
: new Object2ObjectOpenCustomHashMap<ItemStack, V>(source, loadFactor, strategy); | |
} | |
@Override | |
public <V> FinalStageObjectValued<V> objectValued(ItemStack[] keys, V[] values) | |
{ | |
return () -> linked | |
? new Object2ObjectLinkedOpenCustomHashMap<ItemStack, V>(keys, values, loadFactor, strategy) | |
: new Object2ObjectOpenCustomHashMap<ItemStack, V>(keys, values, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageLongValued longValued() | |
{ | |
return longValued(Hash.DEFAULT_INITIAL_SIZE); | |
} | |
@Override | |
public FinalStageLongValued longValued(int expectedSize) | |
{ | |
return () -> linked | |
? new Object2LongLinkedOpenCustomHashMap<ItemStack>(expectedSize, loadFactor, strategy) | |
: new Object2LongOpenCustomHashMap<ItemStack>(expectedSize, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageLongValued longValued(Object2LongMap<? extends ItemStack> source) | |
{ | |
return () -> linked | |
? new Object2LongLinkedOpenCustomHashMap<ItemStack>(source, loadFactor, strategy) | |
: new Object2LongOpenCustomHashMap<ItemStack>(source, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageLongValued longValued(Map<? extends ItemStack, ? extends Long> source) | |
{ | |
return () -> linked | |
? new Object2LongLinkedOpenCustomHashMap<ItemStack>(source, loadFactor, strategy) | |
: new Object2LongOpenCustomHashMap<ItemStack>(source, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageLongValued longValued(ItemStack[] keys, long[] values) | |
{ | |
return () -> linked | |
? new Object2LongLinkedOpenCustomHashMap<ItemStack>(keys, values, loadFactor, strategy) | |
: new Object2LongOpenCustomHashMap<ItemStack>(keys, values, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageIntValued intValued() | |
{ | |
return intValued(Hash.DEFAULT_INITIAL_SIZE); | |
} | |
@Override | |
public FinalStageIntValued intValued(int expectedSize) | |
{ | |
return () -> linked | |
? new Object2IntLinkedOpenCustomHashMap<ItemStack>(expectedSize, loadFactor, strategy) | |
: new Object2IntOpenCustomHashMap<ItemStack>(expectedSize, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageIntValued intValued(Object2IntMap<? extends ItemStack> source) | |
{ | |
return () -> linked | |
? new Object2IntLinkedOpenCustomHashMap<ItemStack>(source, loadFactor, strategy) | |
: new Object2IntOpenCustomHashMap<ItemStack>(source, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageIntValued intValued(Map<? extends ItemStack, ? extends Integer> source) | |
{ | |
return () -> linked | |
? new Object2IntLinkedOpenCustomHashMap<ItemStack>(source, loadFactor, strategy) | |
: new Object2IntOpenCustomHashMap<ItemStack>(source, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageIntValued intValued(ItemStack[] keys, int[] values) | |
{ | |
return () -> linked | |
? new Object2IntLinkedOpenCustomHashMap<ItemStack>(keys, values, loadFactor, strategy) | |
: new Object2IntOpenCustomHashMap<ItemStack>(keys, values, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageShortValued shortValued() | |
{ | |
return shortValued(Hash.DEFAULT_INITIAL_SIZE); | |
} | |
@Override | |
public FinalStageShortValued shortValued(int expectedSize) | |
{ | |
return () -> linked | |
? new Object2ShortLinkedOpenCustomHashMap<ItemStack>(expectedSize, loadFactor, strategy) | |
: new Object2ShortOpenCustomHashMap<ItemStack>(expectedSize, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageShortValued shortValued(Object2ShortMap<? extends ItemStack> source) | |
{ | |
return () -> linked | |
? new Object2ShortLinkedOpenCustomHashMap<ItemStack>(source, loadFactor, strategy) | |
: new Object2ShortOpenCustomHashMap<ItemStack>(source, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageShortValued shortValued(Map<? extends ItemStack, ? extends Short> source) | |
{ | |
return () -> linked | |
? new Object2ShortLinkedOpenCustomHashMap<ItemStack>(source, loadFactor, strategy) | |
: new Object2ShortOpenCustomHashMap<ItemStack>(source, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageShortValued shortValued(ItemStack[] keys, short[] values) | |
{ | |
return () -> linked | |
? new Object2ShortLinkedOpenCustomHashMap<ItemStack>(keys, values, loadFactor, strategy) | |
: new Object2ShortOpenCustomHashMap<ItemStack>(keys, values, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageCharValued charValued() | |
{ | |
return charValued(Hash.DEFAULT_INITIAL_SIZE); | |
} | |
@Override | |
public FinalStageCharValued charValued(int expectedSize) | |
{ | |
return () -> linked | |
? new Object2CharLinkedOpenCustomHashMap<ItemStack>(expectedSize, loadFactor, strategy) | |
: new Object2CharOpenCustomHashMap<ItemStack>(expectedSize, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageCharValued charValued(Object2CharMap<? extends ItemStack> source) | |
{ | |
return () -> linked | |
? new Object2CharLinkedOpenCustomHashMap<ItemStack>(source, loadFactor, strategy) | |
: new Object2CharOpenCustomHashMap<ItemStack>(source, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageCharValued charValued(Map<? extends ItemStack, ? extends Character> source) | |
{ | |
return () -> linked | |
? new Object2CharLinkedOpenCustomHashMap<ItemStack>(source, loadFactor, strategy) | |
: new Object2CharOpenCustomHashMap<ItemStack>(source, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageCharValued charValued(ItemStack[] keys, char[] values) | |
{ | |
return () -> linked | |
? new Object2CharLinkedOpenCustomHashMap<ItemStack>(keys, values, loadFactor, strategy) | |
: new Object2CharOpenCustomHashMap<ItemStack>(keys, values, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageByteValued byteValued() | |
{ | |
return byteValued(Hash.DEFAULT_INITIAL_SIZE); | |
} | |
@Override | |
public FinalStageByteValued byteValued(int expectedSize) | |
{ | |
return () -> linked | |
? new Object2ByteLinkedOpenCustomHashMap<ItemStack>(expectedSize, loadFactor, strategy) | |
: new Object2ByteOpenCustomHashMap<ItemStack>(expectedSize, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageByteValued byteValued(Object2ByteMap<? extends ItemStack> source) | |
{ | |
return () -> linked | |
? new Object2ByteLinkedOpenCustomHashMap<ItemStack>(source, loadFactor, strategy) | |
: new Object2ByteOpenCustomHashMap<ItemStack>(source, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageByteValued byteValued(Map<? extends ItemStack, ? extends Byte> source) | |
{ | |
return () -> linked | |
? new Object2ByteLinkedOpenCustomHashMap<ItemStack>(source, loadFactor, strategy) | |
: new Object2ByteOpenCustomHashMap<ItemStack>(source, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageByteValued byteValued(ItemStack[] keys, byte[] values) | |
{ | |
return () -> linked | |
? new Object2ByteLinkedOpenCustomHashMap<ItemStack>(keys, values, loadFactor, strategy) | |
: new Object2ByteOpenCustomHashMap<ItemStack>(keys, values, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageBooleanValued booleanValued() | |
{ | |
return booleanValued(Hash.DEFAULT_INITIAL_SIZE); | |
} | |
@Override | |
public FinalStageBooleanValued booleanValued(int expectedSize) | |
{ | |
return () -> linked | |
? new Object2BooleanLinkedOpenCustomHashMap<ItemStack>(expectedSize, loadFactor, strategy) | |
: new Object2BooleanOpenCustomHashMap<ItemStack>(expectedSize, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageBooleanValued booleanValued(Object2BooleanMap<? extends ItemStack> source) | |
{ | |
return () -> linked | |
? new Object2BooleanLinkedOpenCustomHashMap<ItemStack>(source, loadFactor, strategy) | |
: new Object2BooleanOpenCustomHashMap<ItemStack>(source, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageBooleanValued booleanValued(Map<? extends ItemStack, ? extends Boolean> source) | |
{ | |
return () -> linked | |
? new Object2BooleanLinkedOpenCustomHashMap<ItemStack>(source, loadFactor, strategy) | |
: new Object2BooleanOpenCustomHashMap<ItemStack>(source, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageBooleanValued booleanValued(ItemStack[] keys, boolean[] values) | |
{ | |
return () -> linked | |
? new Object2BooleanLinkedOpenCustomHashMap<ItemStack>(keys, values, loadFactor, strategy) | |
: new Object2BooleanOpenCustomHashMap<ItemStack>(keys, values, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageFloatValued floatValued() | |
{ | |
return floatValued(Hash.DEFAULT_INITIAL_SIZE); | |
} | |
@Override | |
public FinalStageFloatValued floatValued(int expectedSize) | |
{ | |
return () -> linked | |
? new Object2FloatLinkedOpenCustomHashMap<ItemStack>(expectedSize, loadFactor, strategy) | |
: new Object2FloatOpenCustomHashMap<ItemStack>(expectedSize, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageFloatValued floatValued(Object2FloatMap<? extends ItemStack> source) | |
{ | |
return () -> linked | |
? new Object2FloatLinkedOpenCustomHashMap<ItemStack>(source, loadFactor, strategy) | |
: new Object2FloatOpenCustomHashMap<ItemStack>(source, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageFloatValued floatValued(Map<? extends ItemStack, ? extends Float> source) | |
{ | |
return () -> linked | |
? new Object2FloatLinkedOpenCustomHashMap<ItemStack>(source, loadFactor, strategy) | |
: new Object2FloatOpenCustomHashMap<ItemStack>(source, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageFloatValued floatValued(ItemStack[] keys, float[] values) | |
{ | |
return () -> linked | |
? new Object2FloatLinkedOpenCustomHashMap<ItemStack>(keys, values, loadFactor, strategy) | |
: new Object2FloatOpenCustomHashMap<ItemStack>(keys, values, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageDoubleValued doubleValued() | |
{ | |
return doubleValued(Hash.DEFAULT_INITIAL_SIZE); | |
} | |
@Override | |
public FinalStageDoubleValued doubleValued(int expectedSize) | |
{ | |
return () -> linked | |
? new Object2DoubleLinkedOpenCustomHashMap<ItemStack>(expectedSize, loadFactor, strategy) | |
: new Object2DoubleOpenCustomHashMap<ItemStack>(expectedSize, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageDoubleValued doubleValued(Object2DoubleMap<? extends ItemStack> source) | |
{ | |
return () -> linked | |
? new Object2DoubleLinkedOpenCustomHashMap<ItemStack>(source, loadFactor, strategy) | |
: new Object2DoubleOpenCustomHashMap<ItemStack>(source, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageDoubleValued doubleValued(Map<? extends ItemStack, ? extends Double> source) | |
{ | |
return () -> linked | |
? new Object2DoubleLinkedOpenCustomHashMap<ItemStack>(source, loadFactor, strategy) | |
: new Object2DoubleOpenCustomHashMap<ItemStack>(source, loadFactor, strategy); | |
} | |
@Override | |
public FinalStageDoubleValued doubleValued(ItemStack[] keys, double[] values) | |
{ | |
return () -> linked | |
? new Object2DoubleLinkedOpenCustomHashMap<ItemStack>(keys, values, loadFactor, strategy) | |
: new Object2DoubleOpenCustomHashMap<ItemStack>(keys, values, loadFactor, strategy); | |
} | |
private static class ItemStackStrategy implements Hash.Strategy<ItemStack> | |
{ | |
private final int criteria; | |
private ItemStackStrategy(int criteria) | |
{ | |
this.criteria = criteria; | |
} | |
@Override | |
public int hashCode(ItemStack o) | |
{ | |
final int prime = 31; | |
int result = 1; | |
if ((criteria & StackEquality.CHECK_ITEM) != 0) | |
result = prime * result + o.getItem().hashCode(); | |
if ((criteria & StackEquality.CHECK_METADATA) != 0) | |
result = prime * result + Objects.hashCode(o.getMetadata()); | |
if ((criteria & StackEquality.CHECK_COUNT) != 0) | |
result = prime * result + Objects.hashCode(o.getCount()); | |
if ((criteria & StackEquality.CHECK_NBT) != 0) | |
result = prime * result + Objects.hashCode(o.getTagCompound()); | |
return result; | |
} | |
@Override | |
public boolean equals(ItemStack a, ItemStack b) | |
{ | |
return StackEquality.check(a, b, criteria); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment