package net.minecraft.util; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Codec; import com.mojang.serialization.DataResult; import com.mojang.serialization.DynamicOps; import net.minecraft.nbt.Tag; public class EncoderCache { final LoadingCache, DataResult> cache; public EncoderCache(int p_328135_) { this.cache = CacheBuilder.newBuilder() .maximumSize((long)p_328135_) .concurrencyLevel(1) .softValues() .build(new CacheLoader, DataResult>() { public DataResult load(EncoderCache.Key p_334212_) { return p_334212_.resolve(); } }); } public Codec wrap(final Codec p_332774_) { return new Codec() { @Override public DataResult> decode(DynamicOps p_335845_, T p_329817_) { return p_332774_.decode(p_335845_, p_329817_); } @Override public DataResult encode(A p_328409_, DynamicOps p_330058_, T p_328392_) { return (DataResult) EncoderCache.this.cache .getUnchecked(new EncoderCache.Key<>(p_332774_, p_328409_, p_330058_)) .map(p_336406_ -> p_336406_ instanceof Tag tag ? tag.copy() : p_336406_); } }; } static record Key(Codec codec, A value, DynamicOps ops) { public DataResult resolve() { return this.codec.encodeStart(this.ops, this.value); } @Override public boolean equals(Object p_334040_) { if (this == p_334040_) { return true; } else { return !(p_334040_ instanceof EncoderCache.Key key) ? false : this.codec == key.codec && this.value.equals(key.value) && this.ops.equals(key.ops); } } @Override public int hashCode() { int i = System.identityHashCode(this.codec); i = 31 * i + this.value.hashCode(); return 31 * i + this.ops.hashCode(); } } }