aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSHsuperCM <shsupercm@gmail.com>2022-02-13 12:49:48 +0200
committerSHsuperCM <shsupercm@gmail.com>2022-02-13 12:49:48 +0200
commitcf735c9f3205208801a9675e6b6217dc84b1ea3c (patch)
treedc2ac518c145668343593952d6256327a35c7e87
parentfe02178b220ebf57225bd092bfdb0d8b88067c33 (diff)
downloadCITResewn-cf735c9f3205208801a9675e6b6217dc84b1ea3c.tar.gz
CITResewn-cf735c9f3205208801a9675e6b6217dc84b1ea3c.tar.bz2
CITResewn-cf735c9f3205208801a9675e6b6217dc84b1ea3c.zip
Implemented caching
-rw-r--r--defaults/src/main/java/shcm/shsupercm/fabric/citresewn/defaults/cit/types/TypeItem.java22
-rw-r--r--defaults/src/main/java/shcm/shsupercm/fabric/citresewn/defaults/mixin/types/item/ItemStackMixin.java16
-rw-r--r--src/main/java/shcm/shsupercm/fabric/citresewn/cit/CITCache.java50
3 files changed, 85 insertions, 3 deletions
diff --git a/defaults/src/main/java/shcm/shsupercm/fabric/citresewn/defaults/cit/types/TypeItem.java b/defaults/src/main/java/shcm/shsupercm/fabric/citresewn/defaults/cit/types/TypeItem.java
index 1b0e98e..730c713 100644
--- a/defaults/src/main/java/shcm/shsupercm/fabric/citresewn/defaults/cit/types/TypeItem.java
+++ b/defaults/src/main/java/shcm/shsupercm/fabric/citresewn/defaults/cit/types/TypeItem.java
@@ -3,11 +3,9 @@ package shcm.shsupercm.fabric.citresewn.defaults.cit.types;
import io.shcm.shsupercm.fabric.fletchingtable.api.Entrypoint;
import net.minecraft.item.Item;
import shcm.shsupercm.fabric.citresewn.api.CITTypeContainer;
+import shcm.shsupercm.fabric.citresewn.cit.*;
import shcm.shsupercm.fabric.citresewn.defaults.cit.conditions.ConditionItems;
import shcm.shsupercm.fabric.citresewn.ex.CITParsingException;
-import shcm.shsupercm.fabric.citresewn.cit.CIT;
-import shcm.shsupercm.fabric.citresewn.cit.CITCondition;
-import shcm.shsupercm.fabric.citresewn.cit.CITType;
import shcm.shsupercm.fabric.citresewn.pack.format.PropertyGroup;
import java.util.*;
@@ -42,5 +40,23 @@ public class TypeItem extends CITType {
public void dispose() {
loaded.clear();
}
+
+ public CIT<TypeItem> getCIT(CITContext context) {
+ return ((CITCacheItem) (Object) context.stack).citresewn$getCacheTypeItem().get(context).get();
+ }
+
+ public CIT<TypeItem> getRealTimeCIT(CITContext context) {
+ Set<CIT<TypeItem>> loadedForItemType = loaded.get(context.stack.getItem());
+ if (loadedForItemType != null)
+ for (CIT<TypeItem> cit : loadedForItemType)
+ if (cit.test(context))
+ return cit;
+
+ return null;
+ }
+ }
+
+ public interface CITCacheItem {
+ CITCache.Single<TypeItem> citresewn$getCacheTypeItem();
}
} \ No newline at end of file
diff --git a/defaults/src/main/java/shcm/shsupercm/fabric/citresewn/defaults/mixin/types/item/ItemStackMixin.java b/defaults/src/main/java/shcm/shsupercm/fabric/citresewn/defaults/mixin/types/item/ItemStackMixin.java
new file mode 100644
index 0000000..450d8a3
--- /dev/null
+++ b/defaults/src/main/java/shcm/shsupercm/fabric/citresewn/defaults/mixin/types/item/ItemStackMixin.java
@@ -0,0 +1,16 @@
+package shcm.shsupercm.fabric.citresewn.defaults.mixin.types.item;
+
+import net.minecraft.item.ItemStack;
+import org.spongepowered.asm.mixin.Mixin;
+import shcm.shsupercm.fabric.citresewn.cit.CITCache;
+import shcm.shsupercm.fabric.citresewn.defaults.cit.types.TypeItem;
+
+@Mixin(ItemStack.class)
+public class ItemStackMixin implements TypeItem.CITCacheItem {
+ private final CITCache.Single<TypeItem> citresewn$cacheTypeItem = new CITCache.Single<>(TypeItem.CONTAINER::getRealTimeCIT);
+
+ @Override
+ public CITCache.Single<TypeItem> citresewn$getCacheTypeItem() {
+ return this.citresewn$cacheTypeItem;
+ }
+}
diff --git a/src/main/java/shcm/shsupercm/fabric/citresewn/cit/CITCache.java b/src/main/java/shcm/shsupercm/fabric/citresewn/cit/CITCache.java
new file mode 100644
index 0000000..5fc6f5a
--- /dev/null
+++ b/src/main/java/shcm/shsupercm/fabric/citresewn/cit/CITCache.java
@@ -0,0 +1,50 @@
+package shcm.shsupercm.fabric.citresewn.cit;
+
+import shcm.shsupercm.fabric.citresewn.config.CITResewnConfig;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Function;
+
+public abstract class CITCache<T extends CITType> {
+ public long lastCachedStamp = 0;
+
+ public static class Single<T extends CITType> extends CITCache<T> {
+ public WeakReference<CIT<T>> cit = null;
+ public final Function<CITContext, CIT<T>> realtime;
+
+ public Single(Function<CITContext, CIT<T>> realtime) {
+ this.realtime = realtime;
+ }
+
+ public WeakReference<CIT<T>> get(CITContext context) {
+ if (this.cit == null || System.currentTimeMillis() - this.lastCachedStamp >= CITResewnConfig.INSTANCE.cache_ms) {
+ this.cit = new WeakReference<>(this.realtime.apply(context));
+ this.lastCachedStamp = System.currentTimeMillis();
+ }
+
+ return this.cit;
+ }
+ }
+
+ public static class MultiList<T extends CITType> extends CITCache<T> {
+ public List<WeakReference<CIT<T>>> cit = null;
+ public final Function<CITContext, List<CIT<T>>> realtime;
+
+ public MultiList(Function<CITContext, List<CIT<T>>> realtime) {
+ this.realtime = realtime;
+ }
+
+ public List<WeakReference<CIT<T>>> get(CITContext context) {
+ if (this.cit == null || System.currentTimeMillis() - this.lastCachedStamp >= CITResewnConfig.INSTANCE.cache_ms) {
+ this.cit = new ArrayList<>();
+ for (CIT<T> realtimeCIT : this.realtime.apply(context))
+ this.cit.add(new WeakReference<>(realtimeCIT));
+ this.lastCachedStamp = System.currentTimeMillis();
+ }
+
+ return cit;
+ }
+ }
+}