11package org .embeddedt .modernfix .blockstate ;
22
3+ import it .unimi .dsi .fastutil .objects .Object2ObjectOpenHashMap ;
34import net .minecraft .world .level .block .state .properties .Property ;
45import org .jetbrains .annotations .NotNull ;
56import org .jetbrains .annotations .Nullable ;
1415 */
1516public class FakeStateMap <S > implements Map <Map <Property <?>, Comparable <?>>, S > {
1617 private final Map <Property <?>, Comparable <?>>[] keys ;
18+ private Map <Map <Property <?>, Comparable <?>>, S > fastLookup ;
1719 private final Object [] values ;
1820 private int usedSlots ;
1921 public FakeStateMap (int numStates ) {
@@ -34,22 +36,39 @@ public boolean isEmpty() {
3436
3537 @ Override
3638 public boolean containsKey (Object o ) {
37- throw new UnsupportedOperationException ( );
39+ return getFastLookup (). containsKey ( o );
3840 }
3941
4042 @ Override
4143 public boolean containsValue (Object o ) {
42- throw new UnsupportedOperationException ();
44+ return getFastLookup ().containsValue (o );
45+ }
46+
47+ @ SuppressWarnings ("unchecked" )
48+ private Map <Map <Property <?>, Comparable <?>>, S > getFastLookup () {
49+ if (fastLookup == null ) {
50+ var map = new Object2ObjectOpenHashMap <Map <Property <?>, Comparable <?>>, S >(usedSlots );
51+ Map <Property <?>, Comparable <?>>[] keys = this .keys ;
52+ Object [] values = this .values ;
53+ for (int i = 0 ; i < usedSlots ; i ++) {
54+ map .put (keys [i ], (S )values [i ]);
55+ }
56+ fastLookup = map ;
57+ }
58+ return fastLookup ;
4359 }
4460
4561 @ Override
4662 public S get (Object o ) {
47- throw new UnsupportedOperationException ( );
63+ return getFastLookup (). get ( o );
4864 }
4965
5066 @ Nullable
5167 @ Override
5268 public S put (Map <Property <?>, Comparable <?>> propertyComparableMap , S s ) {
69+ if (fastLookup != null ) {
70+ throw new IllegalStateException ("Cannot populate map after fast lookup is built" );
71+ }
5372 keys [usedSlots ] = propertyComparableMap ;
5473 values [usedSlots ] = s ;
5574 usedSlots ++;
@@ -70,7 +89,7 @@ public void putAll(@NotNull Map<? extends Map<Property<?>, Comparable<?>>, ? ext
7089
7190 @ Override
7291 public void clear () {
73- for (int i = 0 ; i < this . keys . length ; i ++) {
92+ for (int i = 0 ; i < usedSlots ; i ++) {
7493 this .keys [i ] = null ;
7594 this .values [i ] = null ;
7695 }
0 commit comments