From 7d410ea325129cc41ef193584b893a36b5b969dc Mon Sep 17 00:00:00 2001 From: Reider745 <70357814+Reider745@users.noreply.github.com> Date: Sat, 23 Sep 2023 22:06:00 +0300 Subject: [PATCH] ZotCore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлено api для работы с поинтерами --- .../reider745/api/pointers/PointerClass.java | 21 ++++++++ .../api/pointers/PointersStorage.java | 49 +++++++++++++++++++ .../pointers/pointer_gen/IBasePointerGen.java | 6 +++ .../pointer_gen/PointerGenFastest.java | 17 +++++++ .../pointer_gen/PointerGenSlowest.java | 25 ++++++++++ .../com/zhekasmirnov/apparatus/Apparatus.java | 8 +++ 6 files changed, 126 insertions(+) create mode 100644 src/main/java/com/reider745/api/pointers/PointerClass.java create mode 100644 src/main/java/com/reider745/api/pointers/PointersStorage.java create mode 100644 src/main/java/com/reider745/api/pointers/pointer_gen/IBasePointerGen.java create mode 100644 src/main/java/com/reider745/api/pointers/pointer_gen/PointerGenFastest.java create mode 100644 src/main/java/com/reider745/api/pointers/pointer_gen/PointerGenSlowest.java diff --git a/src/main/java/com/reider745/api/pointers/PointerClass.java b/src/main/java/com/reider745/api/pointers/PointerClass.java new file mode 100644 index 00000000..54335e30 --- /dev/null +++ b/src/main/java/com/reider745/api/pointers/PointerClass.java @@ -0,0 +1,21 @@ +package com.reider745.api.pointers; + +public class PointerClass { + public final long pointer; + public final PointersStorage storage; + + public PointerClass(){ + final Class cl = getClass(); + storage = PointersStorage.getStorageForClassType(cl.getPackage()+"."+cl.getName()); + pointer = storage.addPointer(this); + } + + public final long getPointer(){ + return pointer; + } + + @Override + protected final void finalize() throws Throwable { + storage.removePointer(pointer); + } +} diff --git a/src/main/java/com/reider745/api/pointers/PointersStorage.java b/src/main/java/com/reider745/api/pointers/PointersStorage.java new file mode 100644 index 00000000..febe80d0 --- /dev/null +++ b/src/main/java/com/reider745/api/pointers/PointersStorage.java @@ -0,0 +1,49 @@ +package com.reider745.api.pointers; + +import com.reider745.api.pointers.pointer_gen.IBasePointerGen; +import com.reider745.api.pointers.pointer_gen.PointerGenSlowest; + +import java.lang.ref.WeakReference; +import java.util.HashMap; + +public class PointersStorage { + private static final HashMap storages = new HashMap<>(); + private static final HashMap storagesByClassType = new HashMap<>(); + + private final HashMap> pointers = new HashMap<>(); + private final IBasePointerGen pointerGen; + + public PointersStorage(String type, Class class_type, final IBasePointerGen pointerGen){ + this.pointerGen = pointerGen; + storages.put(type, this); + final Class cl = getClass(); + storagesByClassType.put(cl.getPackage()+"."+cl.getName(), this); + } + + public PointersStorage(String type, Class class_type){ + this(type, class_type, new PointerGenSlowest()); + } + + public final long addPointer(PointerClass pointerClass){ + long ptr = pointerGen.next(); + pointers.put(ptr, new WeakReference<>(pointerClass)); + return ptr; + } + + public final PointerClass get(long ptr){ + return pointers.get(ptr).get(); + } + + public final void removePointer(long pointer){ + pointers.remove(pointer); + pointerGen.remove(pointer); + } + + public static PointersStorage getStorageForType(final String type){ + return storages.get(type); + } + + public static PointersStorage getStorageForClassType(final String class_type){ + return storagesByClassType.get(class_type); + } +} diff --git a/src/main/java/com/reider745/api/pointers/pointer_gen/IBasePointerGen.java b/src/main/java/com/reider745/api/pointers/pointer_gen/IBasePointerGen.java new file mode 100644 index 00000000..8266dd63 --- /dev/null +++ b/src/main/java/com/reider745/api/pointers/pointer_gen/IBasePointerGen.java @@ -0,0 +1,6 @@ +package com.reider745.api.pointers.pointer_gen; + +public interface IBasePointerGen { + long next(); + void remove(final long ptr); +} diff --git a/src/main/java/com/reider745/api/pointers/pointer_gen/PointerGenFastest.java b/src/main/java/com/reider745/api/pointers/pointer_gen/PointerGenFastest.java new file mode 100644 index 00000000..a74c8398 --- /dev/null +++ b/src/main/java/com/reider745/api/pointers/pointer_gen/PointerGenFastest.java @@ -0,0 +1,17 @@ +package com.reider745.api.pointers.pointer_gen; + +public class PointerGenFastest implements IBasePointerGen { + public long pre = Long.MIN_VALUE; + + @Override + public final long next() { + final long result = pre; + pre++; + return result; + } + + @Override + public final void remove(long ptr) { + + } +} diff --git a/src/main/java/com/reider745/api/pointers/pointer_gen/PointerGenSlowest.java b/src/main/java/com/reider745/api/pointers/pointer_gen/PointerGenSlowest.java new file mode 100644 index 00000000..4de73adb --- /dev/null +++ b/src/main/java/com/reider745/api/pointers/pointer_gen/PointerGenSlowest.java @@ -0,0 +1,25 @@ +package com.reider745.api.pointers.pointer_gen; + +import java.util.ArrayList; +import java.util.Random; + +public class PointerGenSlowest implements IBasePointerGen { + public final ArrayList usePointers = new ArrayList<>(); + public final Random random = new Random(); + + @Override + public final long next() { + while (true){ + final long ptr = random.nextLong(); + if(!usePointers.contains(ptr)){ + usePointers.add(ptr); + return ptr; + } + } + } + + @Override + public final void remove(long ptr) { + usePointers.remove(ptr); + } +} \ No newline at end of file diff --git a/src/main/java/com/zhekasmirnov/apparatus/Apparatus.java b/src/main/java/com/zhekasmirnov/apparatus/Apparatus.java index 58a0d85e..c01d849a 100644 --- a/src/main/java/com/zhekasmirnov/apparatus/Apparatus.java +++ b/src/main/java/com/zhekasmirnov/apparatus/Apparatus.java @@ -9,6 +9,9 @@ import com.google.common.io.ByteStreams; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.reider745.InnerCoreServer; +import com.reider745.api.pointers.PointerClass; +import com.reider745.api.pointers.PointersStorage; +import com.reider745.api.pointers.pointer_gen.PointerGenFastest; import com.reider745.block.CustomBlock; import com.reider745.item.CustomItem; import com.zhekasmirnov.apparatus.api.player.NetworkPlayerRegistry; @@ -95,6 +98,11 @@ public class Apparatus { CustomBlock.init(); Logger.info("INNERCORE", "end load, time: "+(System.currentTimeMillis()-start)); + + new PointersStorage("test", PointerClass.class); + + for(int i = 0;i < 100;i++) + new PointerClass(); } public static void initCreativeItems(){