From 6c0e2c160a3ab103511b2893575306be3690279d Mon Sep 17 00:00:00 2001 From: javasabr Date: Fri, 5 Sep 2025 20:36:11 +0200 Subject: [PATCH] finish extracting reusable and references --- .../common/concurrent/GroupThreadFactory.java | 6 +- .../atomic/ReusableAtomicInteger.java | 41 -- .../atomic/ReusableAtomicReference.java | 26 -- .../concurrent/lock/impl/AtomicLock.java | 6 +- .../lock/impl/AtomicReadWriteLock.java | 14 +- .../lock/impl/ReentrantAtomicLock.java | 12 +- .../concurrent/util/ConcurrentUtils.java | 21 - .../common/function/ObjectLongFunction.java | 21 - .../rlib/common/util/ObjectUtils.java | 12 - .../javasabr/rlib/common/util/Reusable.java | 17 + .../rlib/common/util/array/Array.java | 8 +- .../common/util/array/impl/AbstractArray.java | 5 - .../array/impl/AbstractConcurrentArray.java | 6 +- .../util/array/impl/CopyOnModifyArray.java | 8 +- .../util/array/impl/SynchronizedArray.java | 6 +- .../AbstractConcurrentIntegerDictionary.java | 6 +- .../AbstractConcurrentLongDictionary.java | 6 +- .../AbstractConcurrentObjectDictionary.java | 6 +- .../util/dictionary/AbstractDictionary.java | 9 +- .../dictionary/AbstractIntegerDictionary.java | 4 +- .../dictionary/AbstractLongDictionary.java | 9 +- .../dictionary/AbstractObjectDictionary.java | 4 +- .../common/util/dictionary/Dictionary.java | 8 +- .../rlib/common/util/dictionary/Entry.java | 2 +- .../common/util/dictionary/IntegerEntry.java | 6 - .../common/util/dictionary/LongEntry.java | 6 - .../common/util/dictionary/ObjectEntry.java | 8 - .../common/util/linkedlist/LinkedList.java | 3 +- .../linkedlist/impl/AbstractLinkedList.java | 5 - .../util/linkedlist/impl/FastLinkedList.java | 38 +- .../common/util/linkedlist/impl/Node.java | 4 +- .../javasabr/rlib/common/util/pools/Pool.java | 119 ----- .../rlib/common/util/pools/PoolFactory.java | 118 ----- .../rlib/common/util/pools/Reusable.java | 32 -- .../rlib/common/util/pools/ReusablePool.java | 9 - .../impl/ConcurrentAtomicARSWLockPool.java | 26 -- .../ConcurrentAtomicARSWLockReusablePool.java | 28 -- .../util/pools/impl/ConcurrentPool.java | 64 --- .../impl/ConcurrentReentrantRWLockPool.java | 28 -- .../pools/impl/ConcurrentReusablePool.java | 39 -- .../pools/impl/ConcurrentStampedLockPool.java | 26 -- .../ConcurrentStampedLockReusablePool.java | 28 -- .../rlib/common/util/pools/impl/FastPool.java | 57 --- .../util/pools/impl/FastReusablePool.java | 37 -- .../pools/impl/SynchronizedReusablePool.java | 40 -- .../common/util/ref/AbstractReference.java | 8 - .../rlib/common/util/ref/ByteReference.java | 32 -- .../rlib/common/util/ref/CharReference.java | 32 -- .../rlib/common/util/ref/DoubleReference.java | 32 -- .../rlib/common/util/ref/FloatReference.java | 32 -- .../common/util/ref/GlobalByteReference.java | 14 - .../common/util/ref/GlobalCharReference.java | 14 - .../util/ref/GlobalDoubleReference.java | 14 - .../common/util/ref/GlobalFloatReference.java | 14 - .../common/util/ref/GlobalIntReference.java | 14 - .../common/util/ref/GlobalLongReference.java | 14 - .../util/ref/GlobalObjectReference.java | 14 - .../common/util/ref/GlobalShortReference.java | 14 - .../rlib/common/util/ref/IntReference.java | 32 -- .../rlib/common/util/ref/LongReference.java | 32 -- .../rlib/common/util/ref/ObjectReference.java | 32 -- .../rlib/common/util/ref/Reference.java | 10 - .../common/util/ref/ReferenceFactory.java | 414 ------------------ .../rlib/common/util/ref/TLByteReference.java | 14 - .../rlib/common/util/ref/TLCharReference.java | 14 - .../common/util/ref/TLDoubleReference.java | 14 - .../common/util/ref/TLFloatReference.java | 14 - .../rlib/common/util/ref/TLIntReference.java | 14 - .../rlib/common/util/ref/TLLongReference.java | 14 - .../common/util/ref/TLObjectReference.java | 14 - .../common/util/ref/TLShortReference.java | 14 - .../executor/TestThreadPoolTaskExecutor.java | 4 +- .../rlib/common/util/ReferencesTest.java | 151 ------- .../rlib/common/util/array/ArrayTest.java | 4 +- .../util/array/ConcurrentArrayTest.java | 4 +- .../rlib/functions/ObjectLongFunction.java | 10 + rlib-fx/build.gradle | 1 + .../rlib/fx/input/InternalContent.java | 2 +- .../java/javasabr/rlib/geometry/Matrix3f.java | 3 +- .../java/javasabr/rlib/geometry/Ray3f.java | 3 +- rlib-network/build.gradle | 1 + .../network/impl/DefaultBufferAllocator.java | 10 +- .../network/impl/ReuseBufferAllocator.java | 10 +- .../packet/ReusableWritablePacket.java | 4 +- .../impl/AbstractReusableWritablePacket.java | 19 +- .../rlib/network/StringNetworkTest.java | 14 +- rlib-reference/build.gradle | 6 + .../rlib/reference/AbstractReference.java | 6 + .../rlib/reference/ByteReference.java | 15 + .../rlib/reference/CharReference.java | 15 + .../rlib/reference/DoubleReference.java | 15 + .../rlib/reference/FloatReference.java | 15 + .../javasabr/rlib/reference/IntReference.java | 15 + .../rlib/reference/LongReference.java | 15 + .../rlib/reference/ObjectReference.java | 19 + .../javasabr/rlib/reference/Reference.java | 8 + .../rlib/reference/ReferenceFactory.java | 151 +++++++ .../rlib/reference}/ShortReference.java | 22 +- .../rlib/reference/TLByteReference.java | 22 + .../rlib/reference/TLCharReference.java | 22 + .../rlib/reference/TLDoubleReference.java | 22 + .../rlib/reference/TLFloatReference.java | 22 + .../rlib/reference/TLIntReference.java | 22 + .../rlib/reference/TLLongReference.java | 22 + .../rlib/reference/TLObjectReference.java | 23 + .../rlib/reference/TLShortReference.java | 22 + .../javasabr/rlib/reference/package-info.java | 4 + .../rlib/reference/ReferencesTest.java | 99 +++++ rlib-reusable/build.gradle | 5 + .../javasabr/rlib/reusable/BoundReusable.java | 6 + .../java/javasabr/rlib/reusable/Reusable.java | 17 + .../javasabr/rlib/reusable/package-info.java | 4 + .../javasabr/rlib/reusable/pool/Pool.java | 50 +++ .../rlib/reusable/pool/PoolFactory.java | 21 + .../rlib/reusable/pool/ReusablePool.java | 8 + .../reusable/pool/impl/ArrayBasedPool.java | 42 ++ .../pool/impl/ArrayBasedReusablePool.java | 20 + .../pool/impl/LockableArrayBasePool.java | 49 +++ .../rlib/reusable/pool/impl/package-info.java | 4 + .../rlib/reusable/pool/package-info.java | 4 + settings.gradle | 4 +- 121 files changed, 911 insertions(+), 2009 deletions(-) delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/concurrent/atomic/ReusableAtomicInteger.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/concurrent/atomic/ReusableAtomicReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/function/ObjectLongFunction.java create mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/Reusable.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/pools/Pool.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/pools/PoolFactory.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/pools/Reusable.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/pools/ReusablePool.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentAtomicARSWLockPool.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentAtomicARSWLockReusablePool.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentPool.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentReentrantRWLockPool.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentReusablePool.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentStampedLockPool.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentStampedLockReusablePool.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/FastPool.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/FastReusablePool.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/SynchronizedReusablePool.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/AbstractReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/ByteReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/CharReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/DoubleReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/FloatReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalByteReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalCharReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalDoubleReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalFloatReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalIntReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalLongReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalObjectReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalShortReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/IntReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/LongReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/ObjectReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/Reference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/ReferenceFactory.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLByteReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLCharReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLDoubleReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLFloatReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLIntReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLLongReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLObjectReference.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLShortReference.java delete mode 100644 rlib-common/src/test/java/javasabr/rlib/common/util/ReferencesTest.java create mode 100644 rlib-functions/src/main/java/javasabr/rlib/functions/ObjectLongFunction.java create mode 100644 rlib-reference/build.gradle create mode 100644 rlib-reference/src/main/java/javasabr/rlib/reference/AbstractReference.java create mode 100644 rlib-reference/src/main/java/javasabr/rlib/reference/ByteReference.java create mode 100644 rlib-reference/src/main/java/javasabr/rlib/reference/CharReference.java create mode 100644 rlib-reference/src/main/java/javasabr/rlib/reference/DoubleReference.java create mode 100644 rlib-reference/src/main/java/javasabr/rlib/reference/FloatReference.java create mode 100644 rlib-reference/src/main/java/javasabr/rlib/reference/IntReference.java create mode 100644 rlib-reference/src/main/java/javasabr/rlib/reference/LongReference.java create mode 100644 rlib-reference/src/main/java/javasabr/rlib/reference/ObjectReference.java create mode 100644 rlib-reference/src/main/java/javasabr/rlib/reference/Reference.java create mode 100644 rlib-reference/src/main/java/javasabr/rlib/reference/ReferenceFactory.java rename {rlib-common/src/main/java/javasabr/rlib/common/util/ref => rlib-reference/src/main/java/javasabr/rlib/reference}/ShortReference.java (53%) create mode 100644 rlib-reference/src/main/java/javasabr/rlib/reference/TLByteReference.java create mode 100644 rlib-reference/src/main/java/javasabr/rlib/reference/TLCharReference.java create mode 100644 rlib-reference/src/main/java/javasabr/rlib/reference/TLDoubleReference.java create mode 100644 rlib-reference/src/main/java/javasabr/rlib/reference/TLFloatReference.java create mode 100644 rlib-reference/src/main/java/javasabr/rlib/reference/TLIntReference.java create mode 100644 rlib-reference/src/main/java/javasabr/rlib/reference/TLLongReference.java create mode 100644 rlib-reference/src/main/java/javasabr/rlib/reference/TLObjectReference.java create mode 100644 rlib-reference/src/main/java/javasabr/rlib/reference/TLShortReference.java create mode 100644 rlib-reference/src/main/java/javasabr/rlib/reference/package-info.java create mode 100644 rlib-reference/src/test/java/javasabr/rlib/reference/ReferencesTest.java create mode 100644 rlib-reusable/build.gradle create mode 100644 rlib-reusable/src/main/java/javasabr/rlib/reusable/BoundReusable.java create mode 100644 rlib-reusable/src/main/java/javasabr/rlib/reusable/Reusable.java create mode 100644 rlib-reusable/src/main/java/javasabr/rlib/reusable/package-info.java create mode 100644 rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/Pool.java create mode 100644 rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/PoolFactory.java create mode 100644 rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/ReusablePool.java create mode 100644 rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/impl/ArrayBasedPool.java create mode 100644 rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/impl/ArrayBasedReusablePool.java create mode 100644 rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/impl/LockableArrayBasePool.java create mode 100644 rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/impl/package-info.java create mode 100644 rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/package-info.java diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/GroupThreadFactory.java b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/GroupThreadFactory.java index b44cc71b..caf1ee3c 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/GroupThreadFactory.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/GroupThreadFactory.java @@ -1,7 +1,7 @@ package javasabr.rlib.common.concurrent; import java.util.concurrent.ThreadFactory; -import javasabr.rlib.common.concurrent.atomic.ReusableAtomicInteger; +import java.util.concurrent.atomic.AtomicInteger; import org.jspecify.annotations.NullMarked; /** @@ -18,7 +18,7 @@ public interface ThreadConstructor { Thread create(ThreadGroup group, Runnable runnable, String name); } - private final ReusableAtomicInteger ordinal; + private final AtomicInteger ordinal; private final String name; private final ThreadGroup group; private final ThreadConstructor constructor; @@ -43,7 +43,7 @@ public GroupThreadFactory(String name, ThreadConstructor constructor, int priori this.priority = priority; this.name = name; this.group = new ThreadGroup(name); - this.ordinal = new ReusableAtomicInteger(); + this.ordinal = new AtomicInteger(); this.daemon = daemon; } diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/atomic/ReusableAtomicInteger.java b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/atomic/ReusableAtomicInteger.java deleted file mode 100644 index fa948929..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/atomic/ReusableAtomicInteger.java +++ /dev/null @@ -1,41 +0,0 @@ -package javasabr.rlib.common.concurrent.atomic; - -import java.io.Serial; -import java.util.concurrent.atomic.AtomicInteger; -import javasabr.rlib.common.util.pools.Reusable; - -/** - * The atomic integer with additional methods. - * - * @author JavaSaBr - */ -public final class ReusableAtomicInteger extends AtomicInteger implements Reusable { - - @Serial - private static final long serialVersionUID = -624766818867950719L; - - public ReusableAtomicInteger() {} - - public ReusableAtomicInteger(int initialValue) { - super(initialValue); - } - - /** - * Atomically decrements by delta the current value. - * - * @param delta the delta. - * @return the result value. - */ - public int subAndGet(int delta) { - - int current; - int next; - - do { - current = get(); - next = current - delta; - } while (!compareAndSet(current, next)); - - return next; - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/atomic/ReusableAtomicReference.java b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/atomic/ReusableAtomicReference.java deleted file mode 100644 index b3b84497..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/atomic/ReusableAtomicReference.java +++ /dev/null @@ -1,26 +0,0 @@ -package javasabr.rlib.common.concurrent.atomic; - -import java.io.Serial; -import java.util.concurrent.atomic.AtomicReference; -import javasabr.rlib.common.util.pools.Reusable; -import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; - -/** - * The atomic reference with additional methods. - * - * @param the type parameter - * @author JavaSaBr - */ -@NullMarked -public final class ReusableAtomicReference extends AtomicReference implements Reusable { - - @Serial - private static final long serialVersionUID = -4058945159519762615L; - - public ReusableAtomicReference() {} - - public ReusableAtomicReference(@Nullable V initialValue) { - super(initialValue); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/AtomicLock.java b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/AtomicLock.java index ed45c08c..819e8ac2 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/AtomicLock.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/AtomicLock.java @@ -1,9 +1,9 @@ package javasabr.rlib.common.concurrent.lock.impl; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; -import javasabr.rlib.common.concurrent.atomic.ReusableAtomicInteger; import org.jspecify.annotations.NullMarked; /** @@ -20,7 +20,7 @@ public class AtomicLock implements Lock { /** * The status of lock. */ - protected final ReusableAtomicInteger status; + protected final AtomicInteger status; /** * The field for consuming CPU. @@ -31,7 +31,7 @@ public class AtomicLock implements Lock { * Instantiates a new Atomic lock. */ public AtomicLock() { - this.status = new ReusableAtomicInteger(); + this.status = new AtomicInteger(); this.sink = 1; } diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/AtomicReadWriteLock.java b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/AtomicReadWriteLock.java index 3ec5022e..82a535cd 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/AtomicReadWriteLock.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/AtomicReadWriteLock.java @@ -1,9 +1,9 @@ package javasabr.rlib.common.concurrent.lock.impl; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; -import javasabr.rlib.common.concurrent.atomic.ReusableAtomicInteger; import javasabr.rlib.common.concurrent.lock.AsyncReadSyncWriteLock; import org.jspecify.annotations.NullMarked; @@ -25,17 +25,17 @@ public class AtomicReadWriteLock implements AsyncReadSyncWriteLock, Lock { /** * The status of write lock. */ - protected final ReusableAtomicInteger writeStatus; + protected final AtomicInteger writeStatus; /** * The count of writers. */ - protected final ReusableAtomicInteger writeCount; + protected final AtomicInteger writeCount; /** * The count of readers. */ - protected final ReusableAtomicInteger readCount; + protected final AtomicInteger readCount; /** * The field for consuming CPU. @@ -46,9 +46,9 @@ public class AtomicReadWriteLock implements AsyncReadSyncWriteLock, Lock { * Instantiates a new Atomic read write lock. */ public AtomicReadWriteLock() { - this.writeCount = new ReusableAtomicInteger(0); - this.writeStatus = new ReusableAtomicInteger(0); - this.readCount = new ReusableAtomicInteger(0); + this.writeCount = new AtomicInteger(0); + this.writeStatus = new AtomicInteger(0); + this.readCount = new AtomicInteger(0); this.sink = 1; } diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/ReentrantAtomicLock.java b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/ReentrantAtomicLock.java index 1c873c7b..ca5c5345 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/ReentrantAtomicLock.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/ReentrantAtomicLock.java @@ -1,10 +1,10 @@ package javasabr.rlib.common.concurrent.lock.impl; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; -import javasabr.rlib.common.concurrent.atomic.ReusableAtomicInteger; -import javasabr.rlib.common.concurrent.atomic.ReusableAtomicReference; import org.jspecify.annotations.NullMarked; /** @@ -18,12 +18,12 @@ public class ReentrantAtomicLock implements Lock { /** * The status of lock. */ - private final ReusableAtomicReference status; + private final AtomicReference status; /** * The level of locking. */ - private final ReusableAtomicInteger level; + private final AtomicInteger level; /** * The field for consuming CPU. @@ -34,8 +34,8 @@ public class ReentrantAtomicLock implements Lock { * Instantiates a new Reentrant atomic lock. */ public ReentrantAtomicLock() { - this.status = new ReusableAtomicReference<>(); - this.level = new ReusableAtomicInteger(); + this.status = new AtomicReference<>(); + this.level = new AtomicInteger(); this.sink = 1; } diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/util/ConcurrentUtils.java b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/util/ConcurrentUtils.java index 99558ff9..75ac431e 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/util/ConcurrentUtils.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/util/ConcurrentUtils.java @@ -3,7 +3,6 @@ import java.util.function.Function; import javasabr.rlib.common.concurrent.lock.Lockable; import javasabr.rlib.common.function.ObjectIntFunction; -import javasabr.rlib.common.function.ObjectLongFunction; import javasabr.rlib.logger.api.Logger; import javasabr.rlib.logger.api.LoggerManager; import org.jspecify.annotations.NullMarked; @@ -148,26 +147,6 @@ public static R get(T sync, int argument, ObjectIntFunct } } - /** - * Apply a function in locked block. - * - * @param the type parameter - * @param the type parameter - * @param sync the synchronizer. - * @param argument the argument. - * @param function the function. - * @return the result from the function. - */ - @Nullable - public static R getInL(T sync, long argument, ObjectLongFunction function) { - sync.lock(); - try { - return function.apply(sync, argument); - } finally { - sync.unlock(); - } - } - private ConcurrentUtils() { throw new RuntimeException(); } diff --git a/rlib-common/src/main/java/javasabr/rlib/common/function/ObjectLongFunction.java b/rlib-common/src/main/java/javasabr/rlib/common/function/ObjectLongFunction.java deleted file mode 100644 index c2df2f99..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/function/ObjectLongFunction.java +++ /dev/null @@ -1,21 +0,0 @@ -package javasabr.rlib.common.function; - -/** - * The function. - * - * @param the type parameter - * @param the type parameter - * @author JavaSaBr - */ -@FunctionalInterface -public interface ObjectLongFunction { - - /** - * Apply r. - * - * @param first the first - * @param second the second - * @return the r - */ - R apply(T first, long second); -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ObjectUtils.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ObjectUtils.java index d65a46d4..303cdf2d 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ObjectUtils.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/ObjectUtils.java @@ -4,7 +4,6 @@ import java.util.function.Function; import java.util.function.LongFunction; import java.util.function.Supplier; -import javasabr.rlib.common.util.pools.Reusable; import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; @@ -153,15 +152,4 @@ public static int hash(long value) { public static int hash(@Nullable Object object) { return object == null ? 0 : object.hashCode(); } - - /** - * Call the method {@link Reusable#release()} if the object is instanceof {@link Reusable}. - * - * @param object the object. - */ - public static void release(@Nullable Object object) { - if (object instanceof Reusable) { - ((Reusable) object).release(); - } - } } diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/Reusable.java b/rlib-common/src/main/java/javasabr/rlib/common/util/Reusable.java new file mode 100644 index 00000000..c5675c61 --- /dev/null +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/Reusable.java @@ -0,0 +1,17 @@ +package javasabr.rlib.common.util; + +/** + * @author JavaSaBr + */ +public interface Reusable extends AutoCloseable { + + /** + * Cleanup this object + */ + default void cleanup() {} + + @Override + default void close() { + cleanup(); + } +} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/array/Array.java b/rlib-common/src/main/java/javasabr/rlib/common/util/array/Array.java index aae59abe..182423e6 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/array/Array.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/array/Array.java @@ -31,7 +31,6 @@ import javasabr.rlib.common.util.ArrayUtils; import javasabr.rlib.common.util.ClassUtils; import javasabr.rlib.common.util.array.impl.DefaultArrayIterator; -import javasabr.rlib.common.util.pools.Reusable; import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; @@ -44,7 +43,7 @@ */ @NullMarked @Deprecated -public interface Array extends Collection, Serializable, Reusable, Cloneable, RandomAccess { +public interface Array extends Collection, Serializable, Cloneable, RandomAccess { /** * Create an empty read only array. @@ -290,11 +289,6 @@ default boolean containsAll(Object[] array) { return true; } - @Override - default void free() { - clear(); - } - /** * Removes the element at index possible with reordering. * diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/AbstractArray.java b/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/AbstractArray.java index aac5f22e..d27541ba 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/AbstractArray.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/AbstractArray.java @@ -55,11 +55,6 @@ public void clear() { } } - @Override - public void free() { - clear(); - } - @Override public AbstractArray clone() throws CloneNotSupportedException { return ClassUtils.unsafeNNCast(super.clone()); diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/AbstractConcurrentArray.java b/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/AbstractConcurrentArray.java index 018aa2c6..ae988569 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/AbstractConcurrentArray.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/AbstractConcurrentArray.java @@ -5,7 +5,7 @@ import java.io.Serial; import java.util.Collection; import java.util.NoSuchElementException; -import javasabr.rlib.common.concurrent.atomic.ReusableAtomicInteger; +import java.util.concurrent.atomic.AtomicInteger; import javasabr.rlib.common.util.ArrayUtils; import javasabr.rlib.common.util.array.Array; import javasabr.rlib.common.util.array.ArrayIterator; @@ -30,7 +30,7 @@ public abstract class AbstractConcurrentArray extends AbstractArray implem /** * The count of elements in this array. */ - private final ReusableAtomicInteger size; + private final AtomicInteger size; /** * The unsafe array. @@ -44,7 +44,7 @@ public AbstractConcurrentArray(Class type) { public AbstractConcurrentArray(Class type, int size) { super(type, size); - this.size = new ReusableAtomicInteger(); + this.size = new AtomicInteger(); } @Override diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/CopyOnModifyArray.java b/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/CopyOnModifyArray.java index 25646aa8..c6f16cdc 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/CopyOnModifyArray.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/CopyOnModifyArray.java @@ -3,7 +3,7 @@ import java.util.Collection; import java.util.Iterator; import java.util.NoSuchElementException; -import javasabr.rlib.common.concurrent.atomic.ReusableAtomicReference; +import java.util.concurrent.atomic.AtomicReference; import javasabr.rlib.common.util.ArrayUtils; import javasabr.rlib.common.util.array.Array; import javasabr.rlib.common.util.array.ArrayComparator; @@ -22,7 +22,7 @@ public class CopyOnModifyArray extends AbstractArray { private static final long serialVersionUID = -8477384427415127978L; @SuppressWarnings("NullableProblems") - protected volatile ReusableAtomicReference array; + protected volatile AtomicReference array; public CopyOnModifyArray(Class type, int size) { super(type, size); @@ -236,7 +236,7 @@ protected final void setArray(E [] array) { //noinspection ConstantConditions if (this.array == null) { - this.array = new ReusableAtomicReference<>(); + this.array = new AtomicReference<>(); } this.array.set(array); @@ -269,7 +269,7 @@ public Array sort(ArrayComparator comparator) { @Override public CopyOnModifyArray clone() throws CloneNotSupportedException { var clone = (CopyOnModifyArray) super.clone(); - clone.array = new ReusableAtomicReference<>(ArrayUtils.copyOf(array())); + clone.array = new AtomicReference<>(ArrayUtils.copyOf(array())); return clone; } } diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/SynchronizedArray.java b/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/SynchronizedArray.java index 3482b9fb..115d483c 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/SynchronizedArray.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/SynchronizedArray.java @@ -4,7 +4,7 @@ import java.util.Collection; import java.util.NoSuchElementException; -import javasabr.rlib.common.concurrent.atomic.ReusableAtomicInteger; +import java.util.concurrent.atomic.AtomicInteger; import javasabr.rlib.common.util.ArrayUtils; import javasabr.rlib.common.util.array.Array; import javasabr.rlib.common.util.array.ArrayIterator; @@ -25,7 +25,7 @@ public class SynchronizedArray extends AbstractArray implements UnsafeArra /** * The count of elements in this array. */ - private final ReusableAtomicInteger size; + private final AtomicInteger size; /** * The unsafe array. @@ -38,7 +38,7 @@ public SynchronizedArray(Class type) { public SynchronizedArray(Class type, int size) { super(type, size); - this.size = new ReusableAtomicInteger(); + this.size = new AtomicInteger(); } @Override diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractConcurrentIntegerDictionary.java b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractConcurrentIntegerDictionary.java index 34bd603e..96a5a185 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractConcurrentIntegerDictionary.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractConcurrentIntegerDictionary.java @@ -1,6 +1,6 @@ package javasabr.rlib.common.util.dictionary; -import javasabr.rlib.common.concurrent.atomic.ReusableAtomicInteger; +import java.util.concurrent.atomic.AtomicInteger; import javasabr.rlib.common.util.ArrayUtils; import org.jspecify.annotations.NullMarked; @@ -14,7 +14,7 @@ public abstract class AbstractConcurrentIntegerDictionary extends AbstractIntegerDictionary implements ConcurrentIntegerDictionary { - private final ReusableAtomicInteger size; + private final AtomicInteger size; private volatile IntegerEntry[] entries; @@ -35,7 +35,7 @@ protected AbstractConcurrentIntegerDictionary(int initCapacity) { protected AbstractConcurrentIntegerDictionary(float loadFactor, int initCapacity) { super(loadFactor, initCapacity); this.entries = ArrayUtils.create(getEntryType(), initCapacity); - this.size = new ReusableAtomicInteger(0); + this.size = new AtomicInteger(0); } @Override diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractConcurrentLongDictionary.java b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractConcurrentLongDictionary.java index adc3736a..5ded013f 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractConcurrentLongDictionary.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractConcurrentLongDictionary.java @@ -1,6 +1,6 @@ package javasabr.rlib.common.util.dictionary; -import javasabr.rlib.common.concurrent.atomic.ReusableAtomicInteger; +import java.util.concurrent.atomic.AtomicInteger; import javasabr.rlib.common.util.ArrayUtils; import org.jspecify.annotations.NullMarked; @@ -14,7 +14,7 @@ public abstract class AbstractConcurrentLongDictionary extends AbstractLongDictionary implements ConcurrentLongDictionary { - private final ReusableAtomicInteger size; + private final AtomicInteger size; private volatile LongEntry[] entries; @@ -35,7 +35,7 @@ protected AbstractConcurrentLongDictionary(int initCapacity) { protected AbstractConcurrentLongDictionary(float loadFactor, int initCapacity) { super(loadFactor, initCapacity); this.entries = ArrayUtils.create(getEntryType(), initCapacity); - this.size = new ReusableAtomicInteger(0); + this.size = new AtomicInteger(0); } @Override diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractConcurrentObjectDictionary.java b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractConcurrentObjectDictionary.java index 1bf746c7..1056d0ac 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractConcurrentObjectDictionary.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractConcurrentObjectDictionary.java @@ -1,6 +1,6 @@ package javasabr.rlib.common.util.dictionary; -import javasabr.rlib.common.concurrent.atomic.ReusableAtomicInteger; +import java.util.concurrent.atomic.AtomicInteger; import javasabr.rlib.common.util.ArrayUtils; import org.jspecify.annotations.NullMarked; @@ -15,7 +15,7 @@ public abstract class AbstractConcurrentObjectDictionary extends AbstractObjectDictionary implements ConcurrentObjectDictionary { - private final ReusableAtomicInteger size; + private final AtomicInteger size; private volatile ObjectEntry[] entries; @@ -36,7 +36,7 @@ protected AbstractConcurrentObjectDictionary(int initCapacity) { protected AbstractConcurrentObjectDictionary(float loadFactor, int initCapacity) { super(loadFactor, initCapacity); this.entries = ArrayUtils.create(getEntryType(), initCapacity); - this.size = new ReusableAtomicInteger(0); + this.size = new AtomicInteger(0); } @Override diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractDictionary.java b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractDictionary.java index df6b5536..1c3cc200 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractDictionary.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractDictionary.java @@ -5,8 +5,6 @@ import javasabr.rlib.common.function.NotNullFunction; import javasabr.rlib.common.util.ArrayUtils; import javasabr.rlib.common.util.array.Array; -import javasabr.rlib.common.util.pools.PoolFactory; -import javasabr.rlib.common.util.pools.ReusablePool; import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; @@ -69,10 +67,6 @@ protected static int indexFor(int hash, int length) { return hash & length - 1; } - /** - * The pool with entries. - */ - protected final ReusablePool entryPool; /** * The load factor. @@ -81,7 +75,6 @@ protected static int indexFor(int hash, int length) { protected AbstractDictionary(float loadFactor, int initCapacity) { this.loadFactor = loadFactor; - this.entryPool = PoolFactory.newReusablePool(getEntryType()); setThreshold((int) (initCapacity * loadFactor)); } @@ -105,7 +98,7 @@ public void clear() { for (E entry : entries) { while (entry != null) { next = entry.getNext(); - entryPool.put(entry); + //entryPool.put(entry); entry = next; } } diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractIntegerDictionary.java b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractIntegerDictionary.java index 099fbb4f..aa11d09f 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractIntegerDictionary.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractIntegerDictionary.java @@ -48,7 +48,7 @@ protected final void addEntry(int hash, int key, V value, int index) { var entries = entries(); var entry = entries[index]; - var newEntry = entryPool.take(IntegerEntry::new); + var newEntry = new IntegerEntry(); newEntry.set(hash, key, value, entry); entries[index] = newEntry; @@ -227,8 +227,6 @@ public void copyTo(Dictionary dictionary) { var value = old.getValue(); - entryPool.put(old); - return value; } diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractLongDictionary.java b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractLongDictionary.java index afeb1f2e..06a4f889 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractLongDictionary.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractLongDictionary.java @@ -55,7 +55,7 @@ private void addEntry(int hash, long key, V value, int index) { var entries = entries(); var entry = entries[index]; - var newEntry = entryPool.take(LongEntry::new); + var newEntry = new LongEntry(); newEntry.set(hash, key, value, entry); entries[index] = newEntry; @@ -207,15 +207,8 @@ public V put(long key, V value) { @Override public @Nullable V remove(long key) { - var oldEntry = removeEntryForKey(key); - V value = oldEntry == null ? null : oldEntry.getValue(); - - if (oldEntry != null) { - entryPool.put(oldEntry); - } - return value; } diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractObjectDictionary.java b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractObjectDictionary.java index e2998959..4ee4e274 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractObjectDictionary.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractObjectDictionary.java @@ -57,7 +57,7 @@ private void addEntry(int hash, K key, V value, int index) { var entries = entries(); var entry = entries[index]; - var newEntry = entryPool.take(ObjectEntry::new); + var newEntry = new ObjectEntry(); newEntry.set(hash, key, value, entry); entries[index] = newEntry; @@ -241,8 +241,6 @@ public void copyTo(Dictionary dictionary) { var value = old.getValue(); - entryPool.put(old); - return value; } diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/Dictionary.java b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/Dictionary.java index a22364c4..4f5ffec9 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/Dictionary.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/Dictionary.java @@ -3,7 +3,6 @@ import javasabr.rlib.common.function.NotNullFunction; import javasabr.rlib.common.util.array.Array; import javasabr.rlib.common.util.array.ArrayFactory; -import javasabr.rlib.common.util.pools.Reusable; import org.jspecify.annotations.NullMarked; /** @@ -15,7 +14,7 @@ */ @NullMarked @Deprecated -public interface Dictionary extends Iterable, Reusable { +public interface Dictionary extends Iterable { /** * Replace the all values using the function. @@ -43,11 +42,6 @@ default boolean containsValue(V value) { throw new UnsupportedOperationException(); } - @Override - default void free() { - clear(); - } - /** * Returns true if this dictionary contains no key-value mappings. * diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/Entry.java b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/Entry.java index 3dcc8372..3781d023 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/Entry.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/Entry.java @@ -1,6 +1,6 @@ package javasabr.rlib.common.util.dictionary; -import javasabr.rlib.common.util.pools.Reusable; +import javasabr.rlib.common.util.Reusable; import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/IntegerEntry.java b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/IntegerEntry.java index a2ca7a83..927ee45d 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/IntegerEntry.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/IntegerEntry.java @@ -55,12 +55,6 @@ public boolean equals(@Nullable Object object) { return Objects.equals(firstValue, secondValue); } - @Override - public void free() { - value = null; - next = null; - } - @Override public int getHash() { return hash; diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/LongEntry.java b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/LongEntry.java index ded0198c..bdfb7a98 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/LongEntry.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/LongEntry.java @@ -54,12 +54,6 @@ public boolean equals(@Nullable Object object) { return Objects.equals(firstValue, secondValue); } - @Override - public void free() { - value = null; - next = null; - } - @Override public int getHash() { return hash; diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ObjectEntry.java b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ObjectEntry.java index 29ea2948..9f6a8a02 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ObjectEntry.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ObjectEntry.java @@ -62,14 +62,6 @@ public boolean equals(@Nullable Object object) { return Objects.equals(firstValue, secondValue); } - @Override - public void free() { - key = null; - value = null; - next = null; - hash = 0; - } - @Override public final int hashCode() { return Objects.hashCode(key) ^ Objects.hashCode(value); diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/LinkedList.java b/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/LinkedList.java index db4c936b..d6c746e7 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/LinkedList.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/LinkedList.java @@ -12,7 +12,6 @@ import javasabr.rlib.common.function.TripleConsumer; import javasabr.rlib.common.function.TriplePredicate; import javasabr.rlib.common.util.linkedlist.impl.Node; -import javasabr.rlib.common.util.pools.Reusable; import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; @@ -30,7 +29,7 @@ * @author JavaSaBr */ @NullMarked -public interface LinkedList extends Deque, Cloneable, Serializable, Reusable { +public interface LinkedList extends Deque, Cloneable, Serializable { @Override default void forEach(Consumer consumer) { diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/AbstractLinkedList.java b/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/AbstractLinkedList.java index 63ed3745..b6a59938 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/AbstractLinkedList.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/AbstractLinkedList.java @@ -67,11 +67,6 @@ public E element() { return getFirst(); } - @Override - public void free() { - clear(); - } - @Override public E getFirst() { diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/FastLinkedList.java b/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/FastLinkedList.java index a70d28ef..2b78239e 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/FastLinkedList.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/FastLinkedList.java @@ -4,8 +4,6 @@ import java.util.NoSuchElementException; import java.util.Objects; import java.util.function.Function; -import javasabr.rlib.common.util.pools.PoolFactory; -import javasabr.rlib.common.util.pools.ReusablePool; import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; @@ -20,11 +18,6 @@ public class FastLinkedList extends AbstractLinkedList { private static final long serialVersionUID = 6627882787737291879L; - /** - * The node pool. - */ - private final ReusablePool> pool; - /** * The first element. */ @@ -49,7 +42,6 @@ public class FastLinkedList extends AbstractLinkedList { */ public FastLinkedList(Class type) { super(type); - this.pool = PoolFactory.newReusablePool(Node.class); } @Override @@ -77,16 +69,8 @@ public void apply(Function function) { @Override public void clear() { - - ReusablePool> pool = getPool(); - - for (Node node = getFirstNode(); node != null; node = node.getNext()) { - pool.put(node); - } - setFirstNode(null); setLastNode(null); - size = 0; } @@ -180,7 +164,7 @@ protected void setLastNode(@Nullable final Node last) { */ protected Node getNewNode(@Nullable Node prev, E item, @Nullable Node next) { - Node node = getPool().take(Node::new); + Node node = new Node<>(); node.setItem(item); node.setNext(next); node.setPrev(prev); @@ -188,15 +172,6 @@ protected Node getNewNode(@Nullable Node prev, E item, @Nullable Node n return node; } - /** - * Gets pool. - * - * @return the pool. - */ - protected ReusablePool> getPool() { - return pool; - } - /** * Insert after. * @@ -374,11 +349,6 @@ public T[] toArray(T[] array) { return array; } - @Override - public String toString() { - return super.toString() + "\n " + pool; - } - @Override public final E unlink(Node node) { @@ -401,8 +371,6 @@ public final E unlink(Node node) { size--; - getPool().put(node); - return element; } @@ -427,8 +395,6 @@ protected final E unlinkFirst(Node node) { size--; - getPool().put(node); - return element; } @@ -453,8 +419,6 @@ protected final E unlinkLast(Node node) { size--; - getPool().put(node); - return element; } } diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/Node.java b/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/Node.java index 1564d7a0..81067a8d 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/Node.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/Node.java @@ -1,6 +1,6 @@ package javasabr.rlib.common.util.linkedlist.impl; -import javasabr.rlib.common.util.pools.Reusable; +import javasabr.rlib.common.util.Reusable; import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; @@ -29,7 +29,7 @@ public final class Node implements Reusable { private @Nullable Node next; @Override - public void free() { + public void cleanup() { item = null; prev = null; next = null; diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/Pool.java b/rlib-common/src/main/java/javasabr/rlib/common/util/pools/Pool.java deleted file mode 100644 index e0a13c1f..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/Pool.java +++ /dev/null @@ -1,119 +0,0 @@ -package javasabr.rlib.common.util.pools; - -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.function.LongFunction; -import java.util.function.Supplier; -import javasabr.rlib.common.function.ObjectLongFunction; -import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; - -/** - * The interface for implementing a pool for storing and reusing any objects. - * - * @param the type parameter - * @author JavaSaBr - */ -@NullMarked -public interface Pool { - - /** - * Return true if this pool is empty. - * - * @return true if this pool is empty. - */ - boolean isEmpty(); - - /** - * Put the object to this pool. - * - * @param object the object. - */ - void put(E object); - - /** - * Remove the object from this pool. - * - * @param object the object. - */ - void remove(E object); - - /** - * Take an object from this pool. - * - * @return taken object or null if this pool is empty. - */ - @Nullable - E take(); - - /** - * Take an object from this pool or create a new object. - * - * @param factory the factory to create new object if this pool is empty. - * @return taken or created object. - */ - default E take(Supplier factory) { - E take = take(); - return take != null ? take : factory.get(); - } - - /** - * Take an object from this pool or create a new object. - * - * @param argument the argument. - * @param factory the factory to create new object if this pool is empty. - * @param the argument's type. - * @return taken or created object. - */ - default E take(T argument, Function factory) { - E take = take(); - return take != null ? take : factory.apply(argument); - } - - /** - * Take an object from this pool or create a new object. - * - * @param argument the argument. - * @param factory the factory to create new object if this pool is empty. - * @return taken or created object. - */ - default E take(long argument, LongFunction factory) { - E take = take(); - return take != null ? take : factory.apply(argument); - } - - /** - * Take an object from this pool or create a new object. - * - * @param first the first argument. - * @param second the second argument. - * @param factory the factory to create new object if this pool is empty. - * @param the first argument's type. - * @return taken or created object. - */ - default E take( - F first, - long second, - ObjectLongFunction factory) { - E take = take(); - return take != null ? take : factory.apply(first, second); - } - - /** - * Take an object from this pool or create a new object. - * - * @param first the first argument. - * @param second the second argument. - * @param factory the factory to create new object if this pool is empty. - * @param the first argument's type. - * @param the second argument's type. - * @return taken or created object. - */ - default E take( - F first, - S second, - BiFunction factory) { - E take = take(); - return take != null ? take : factory.apply(first, second); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/PoolFactory.java b/rlib-common/src/main/java/javasabr/rlib/common/util/pools/PoolFactory.java deleted file mode 100644 index c2d97f4c..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/PoolFactory.java +++ /dev/null @@ -1,118 +0,0 @@ -package javasabr.rlib.common.util.pools; - -import javasabr.rlib.common.concurrent.lock.impl.AtomicReadWriteLock; -import javasabr.rlib.common.concurrent.lock.impl.ReentrantARSWLock; -import javasabr.rlib.common.util.pools.impl.ConcurrentAtomicARSWLockPool; -import javasabr.rlib.common.util.pools.impl.ConcurrentAtomicARSWLockReusablePool; -import javasabr.rlib.common.util.pools.impl.ConcurrentReentrantRWLockPool; -import javasabr.rlib.common.util.pools.impl.ConcurrentStampedLockPool; -import javasabr.rlib.common.util.pools.impl.ConcurrentStampedLockReusablePool; -import javasabr.rlib.common.util.pools.impl.FastPool; -import javasabr.rlib.common.util.pools.impl.FastReusablePool; -import javasabr.rlib.common.util.pools.impl.SynchronizedReusablePool; -import org.jspecify.annotations.NullMarked; - -/** - * The factory for creating new pools. - * - * @author JavaSaBr - */ -@NullMarked -public final class PoolFactory { - - /** - * Create a reusable pool based on {@link AtomicReadWriteLock}. - * - * @param type the object's type. - * @param the object's type. - * @return the reusable pool. - */ - public static ReusablePool newConcurrentAtomicARSWLockReusablePool( - Class type) { - return new ConcurrentAtomicARSWLockReusablePool<>(type); - } - - /** - * Create a reusable pool based on {@link java.util.concurrent.locks.StampedLock}. - * - * @param type the object's type. - * @param the object's type. - * @return the reusable pool. - */ - public static ReusablePool newConcurrentStampedLockReusablePool( - Class type) { - return new ConcurrentStampedLockReusablePool<>(type); - } - - /** - * Create a reusable pool based on {@link ReentrantARSWLock}. - * - * @param type the object's type. - * @param the object's type. - * @return the reusable pool. - */ - public static ReusablePool newConcurrentReentrantRWLockReusablePool( - Class type) { - return new ConcurrentReentrantRWLockPool<>(type); - } - - /** - * Create a reusable pool based on synchronization block. - * - * @param type the object's type. - * @param the object's type. - * @return the reusable pool. - */ - public static ReusablePool newSynchronizedReusablePool( - Class type) { - return new SynchronizedReusablePool<>(type); - } - - /** - * Create a reusable pool. - * - * @param type the object's type. - * @param the object's type. - * @return the reusable pool. - */ - public static ReusablePool newReusablePool(Class type) { - return new FastReusablePool<>(type); - } - - /** - * Create a pool based on {@link ReentrantARSWLock}. - * - * @param type the object's type. - * @param the object's type. - * @return the pool. - */ - public static Pool newConcurrentAtomicARSWLockPool(Class type) { - return new ConcurrentAtomicARSWLockPool<>(type); - } - - /** - * Create a pool based on {@link java.util.concurrent.locks.StampedLock}. - * - * @param type the object's type. - * @param the object's type. - * @return the pool. - */ - public static Pool newConcurrentStampedLockPool(Class type) { - return new ConcurrentStampedLockPool<>(type); - } - - /** - * Create a pool. - * - * @param type the object's type. - * @param the object's type. - * @return the reusable pool. - */ - public static Pool newPool(Class type) { - return new FastPool<>(type); - } - - private PoolFactory() { - throw new IllegalArgumentException(); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/Reusable.java b/rlib-common/src/main/java/javasabr/rlib/common/util/pools/Reusable.java deleted file mode 100644 index 385c8d76..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/Reusable.java +++ /dev/null @@ -1,32 +0,0 @@ -package javasabr.rlib.common.util.pools; - -/** - * The interface for implementing reusable objects. You can use reusable objects with {@link ReusablePool}*. - * - * @author JavaSaBr - */ -public interface Reusable extends AutoCloseable { - - /** - * Cleanup this object before storing to a pool. - */ - default void free() { - } - - /** - * Prepares to reuse this object before taking from a pool. - */ - default void reuse() { - } - - /** - * Stores this object to a pool. - */ - default void release() { - } - - @Override - default void close() { - release(); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/ReusablePool.java b/rlib-common/src/main/java/javasabr/rlib/common/util/pools/ReusablePool.java deleted file mode 100644 index f78e7fcb..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/ReusablePool.java +++ /dev/null @@ -1,9 +0,0 @@ -package javasabr.rlib.common.util.pools; - -/** - * The interface for implementing a pool for only {@link Reusable} objects. - * - * @param the type parameter - * @author JavaSaBr - */ -public interface ReusablePool extends Pool {} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentAtomicARSWLockPool.java b/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentAtomicARSWLockPool.java deleted file mode 100644 index 110d8f8a..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentAtomicARSWLockPool.java +++ /dev/null @@ -1,26 +0,0 @@ -package javasabr.rlib.common.util.pools.impl; - -import javasabr.rlib.common.util.array.ArrayFactory; -import javasabr.rlib.common.util.array.ConcurrentArray; -import javasabr.rlib.common.util.array.impl.ConcurrentAtomicARSWLockArray; -import javasabr.rlib.common.util.pools.Pool; -import org.jspecify.annotations.NullMarked; - -/** - * The threadsafe implementation of the {@link Pool} using like a storage the {@link ConcurrentAtomicARSWLockArray}*. - * - * @param the object's type. - * @author JavaSaBr - */ -@NullMarked -public class ConcurrentAtomicARSWLockPool extends ConcurrentPool { - - public ConcurrentAtomicARSWLockPool(Class type) { - super(type); - } - - @Override - protected ConcurrentArray createPool(Class type) { - return ArrayFactory.newConcurrentAtomicARSWLockArray(type); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentAtomicARSWLockReusablePool.java b/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentAtomicARSWLockReusablePool.java deleted file mode 100644 index 14b1dd1a..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentAtomicARSWLockReusablePool.java +++ /dev/null @@ -1,28 +0,0 @@ -package javasabr.rlib.common.util.pools.impl; - -import javasabr.rlib.common.util.array.ArrayFactory; -import javasabr.rlib.common.util.array.ConcurrentArray; -import javasabr.rlib.common.util.array.impl.ConcurrentAtomicARSWLockArray; -import javasabr.rlib.common.util.pools.Reusable; -import javasabr.rlib.common.util.pools.ReusablePool; -import org.jspecify.annotations.NullMarked; - -/** - * The threadsafe implementation of the {@link ReusablePool} using like a storage the - * {@link ConcurrentAtomicARSWLockArray}*. - * - * @param the type parameter - * @author JavaSaBr - */ -@NullMarked -public class ConcurrentAtomicARSWLockReusablePool extends ConcurrentReusablePool { - - public ConcurrentAtomicARSWLockReusablePool(Class type) { - super(type); - } - - @Override - protected ConcurrentArray createPool(Class type) { - return ArrayFactory.newConcurrentAtomicARSWLockArray(type); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentPool.java b/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentPool.java deleted file mode 100644 index 0bac4cfd..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentPool.java +++ /dev/null @@ -1,64 +0,0 @@ -package javasabr.rlib.common.util.pools.impl; - -import javasabr.rlib.common.util.array.Array; -import javasabr.rlib.common.util.array.ConcurrentArray; -import javasabr.rlib.common.util.pools.Pool; -import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; - -/** - * The base concurrent implementation of the {@link Pool}. - * - * @param the object's type. - * @author JavaSaBr - */ -@NullMarked -public abstract class ConcurrentPool implements Pool { - - /** - * The storage of objects. - */ - protected final ConcurrentArray pool; - - public ConcurrentPool(Class type) { - this.pool = createPool(type); - } - - protected abstract ConcurrentArray createPool(Class type); - - @Override - public boolean isEmpty() { - return pool.isEmpty(); - } - - @Override - public void put(E object) { - pool.runInWriteLock(object, Array::add); - } - - @Override - public void remove(E object) { - pool.runInWriteLock(object, Array::fastRemove); - } - - @Override - public @Nullable E take() { - - if (pool.isEmpty()) { - return null; - } - - E object = pool.getInWriteLock(Array::pop); - - if (object == null) { - return null; - } - - return object; - } - - @Override - public String toString() { - return pool.toString(); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentReentrantRWLockPool.java b/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentReentrantRWLockPool.java deleted file mode 100644 index 1f69c238..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentReentrantRWLockPool.java +++ /dev/null @@ -1,28 +0,0 @@ -package javasabr.rlib.common.util.pools.impl; - -import javasabr.rlib.common.util.array.ArrayFactory; -import javasabr.rlib.common.util.array.ConcurrentArray; -import javasabr.rlib.common.util.array.impl.ConcurrentReentrantRWLockArray; -import javasabr.rlib.common.util.pools.Reusable; -import javasabr.rlib.common.util.pools.ReusablePool; -import org.jspecify.annotations.NullMarked; - -/** - * The threadsafe implementation of the {@link ReusablePool} using like a storage the - * {@link ConcurrentReentrantRWLockArray}*. - * - * @param the type parameter - * @author JavaSaBr - */ -@NullMarked -public class ConcurrentReentrantRWLockPool extends ConcurrentReusablePool { - - public ConcurrentReentrantRWLockPool(Class type) { - super(type); - } - - @Override - protected ConcurrentArray createPool(Class type) { - return ArrayFactory.newConcurrentReentrantRWLockArray(type); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentReusablePool.java b/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentReusablePool.java deleted file mode 100644 index 4d27a9cd..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentReusablePool.java +++ /dev/null @@ -1,39 +0,0 @@ -package javasabr.rlib.common.util.pools.impl; - -import javasabr.rlib.common.util.pools.Pool; -import javasabr.rlib.common.util.pools.Reusable; -import javasabr.rlib.common.util.pools.ReusablePool; -import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; - -/** - * The base concurrent implementation of the {@link Pool} for {@link Reusable} objects. - * - * @param the object's type. - * @author JavaSaBr - */ -@NullMarked -public abstract class ConcurrentReusablePool extends ConcurrentPool implements ReusablePool { - - public ConcurrentReusablePool(Class type) { - super(type); - } - - @Override - public void put(E object) { - object.free(); - super.put(object); - } - - @Override - public @Nullable E take() { - - E object = super.take(); - - if (object != null) { - object.reuse(); - } - - return object; - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentStampedLockPool.java b/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentStampedLockPool.java deleted file mode 100644 index f553fd18..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentStampedLockPool.java +++ /dev/null @@ -1,26 +0,0 @@ -package javasabr.rlib.common.util.pools.impl; - -import javasabr.rlib.common.util.array.ArrayFactory; -import javasabr.rlib.common.util.array.ConcurrentArray; -import javasabr.rlib.common.util.array.impl.ConcurrentStampedLockArray; -import javasabr.rlib.common.util.pools.Pool; -import org.jspecify.annotations.NullMarked; - -/** - * The threadsafe implementation of the {@link Pool} using like a storage the {@link ConcurrentStampedLockArray}*. - * - * @param the object's type. - * @author JavaSaBr - */ -@NullMarked -public class ConcurrentStampedLockPool extends ConcurrentPool { - - public ConcurrentStampedLockPool(Class type) { - super(type); - } - - @Override - protected ConcurrentArray createPool(Class type) { - return ArrayFactory.newConcurrentStampedLockArray(type); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentStampedLockReusablePool.java b/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentStampedLockReusablePool.java deleted file mode 100644 index 07000796..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/ConcurrentStampedLockReusablePool.java +++ /dev/null @@ -1,28 +0,0 @@ -package javasabr.rlib.common.util.pools.impl; - -import javasabr.rlib.common.util.array.ArrayFactory; -import javasabr.rlib.common.util.array.ConcurrentArray; -import javasabr.rlib.common.util.array.impl.ConcurrentStampedLockArray; -import javasabr.rlib.common.util.pools.Reusable; -import javasabr.rlib.common.util.pools.ReusablePool; -import org.jspecify.annotations.NullMarked; - -/** - * The threadsafe implementation of the {@link ReusablePool} using like a storage the - * {@link ConcurrentStampedLockArray}*. - * - * @param the type parameter - * @author JavaSaBr - */ -@NullMarked -public class ConcurrentStampedLockReusablePool extends ConcurrentReusablePool { - - public ConcurrentStampedLockReusablePool(Class type) { - super(type); - } - - @Override - protected ConcurrentArray createPool(Class type) { - return ArrayFactory.newConcurrentStampedLockArray(type); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/FastPool.java b/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/FastPool.java deleted file mode 100644 index 6d467746..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/FastPool.java +++ /dev/null @@ -1,57 +0,0 @@ -package javasabr.rlib.common.util.pools.impl; - -import javasabr.rlib.common.util.array.Array; -import javasabr.rlib.common.util.pools.Pool; -import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; - -/** - * The fast implementation of the {@link Pool}. It isn't threadsafe. - * - * @param the type parameter - * @author JavaSaBr - */ -@NullMarked -public class FastPool implements Pool { - - /** - * The storage of objects. - */ - private final Array pool; - - public FastPool(Class type) { - this.pool = Array.ofType(type); - } - - @Override - public boolean isEmpty() { - return pool.isEmpty(); - } - - @Override - public void put(E object) { - pool.add(object); - } - - @Override - public void remove(E object) { - pool.fastRemove(object); - } - - @Override - public @Nullable E take() { - - E object = pool.pop(); - - if (object == null) { - return null; - } - - return object; - } - - @Override - public String toString() { - return pool.toString(); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/FastReusablePool.java b/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/FastReusablePool.java deleted file mode 100644 index d9c8761d..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/FastReusablePool.java +++ /dev/null @@ -1,37 +0,0 @@ -package javasabr.rlib.common.util.pools.impl; - -import javasabr.rlib.common.util.pools.Reusable; -import javasabr.rlib.common.util.pools.ReusablePool; -import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; - -/** - * The fast implementation of the {@link ReusablePool}. It isn't threadsafe. - * - * @param the type parameter - * @author JavaSaBr - */ -@NullMarked -public class FastReusablePool extends FastPool implements ReusablePool { - - public FastReusablePool(Class type) { - super(type); - } - - public void put(E object) { - object.free(); - super.put(object); - } - - @Override - public @Nullable E take() { - - E object = super.take(); - - if (object != null) { - object.reuse(); - } - - return object; - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/SynchronizedReusablePool.java b/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/SynchronizedReusablePool.java deleted file mode 100644 index 4dcf1efd..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/pools/impl/SynchronizedReusablePool.java +++ /dev/null @@ -1,40 +0,0 @@ -package javasabr.rlib.common.util.pools.impl; - -import javasabr.rlib.common.util.pools.Reusable; -import javasabr.rlib.common.util.pools.ReusablePool; -import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; - -/** - * The implementation of the {@link ReusablePool} using synchronization for take/put methods. - * - * @param the type parameter - * @author JavaSaBr - */ -@NullMarked -public class SynchronizedReusablePool extends FastReusablePool { - - public SynchronizedReusablePool(Class type) { - super(type); - } - - @Override - public synchronized boolean isEmpty() { - return super.isEmpty(); - } - - @Override - public synchronized void put(E object) { - super.put(object); - } - - @Override - public synchronized void remove(E object) { - super.remove(object); - } - - @Override - public synchronized @Nullable E take() { - return super.take(); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/AbstractReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/AbstractReference.java deleted file mode 100644 index 470d2939..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/AbstractReference.java +++ /dev/null @@ -1,8 +0,0 @@ -package javasabr.rlib.common.util.ref; - -/** - * The base implementation of the {@link Reference}. - * - * @author JavaSaBr - */ -public abstract class AbstractReference implements Reference {} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/ByteReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/ByteReference.java deleted file mode 100644 index 6e1df650..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/ByteReference.java +++ /dev/null @@ -1,32 +0,0 @@ -package javasabr.rlib.common.util.ref; - -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; - -/** - * The reference to byte value. - * - * @author JavaSaBr - */ -@Getter -@Setter -@ToString -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = false) -public class ByteReference extends AbstractReference { - - /** - * The value of this reference. - */ - private byte value; - - @Override - public void free() { - this.value = 0; - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/CharReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/CharReference.java deleted file mode 100644 index 03d4162c..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/CharReference.java +++ /dev/null @@ -1,32 +0,0 @@ -package javasabr.rlib.common.util.ref; - -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; - -/** - * The reference to char value. - * - * @author JavaSaBr - */ -@Getter -@Setter -@ToString -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = false) -public class CharReference extends AbstractReference { - - /** - * The value of this reference. - */ - private char value; - - @Override - public void free() { - this.value = 0; - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/DoubleReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/DoubleReference.java deleted file mode 100644 index 6928a861..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/DoubleReference.java +++ /dev/null @@ -1,32 +0,0 @@ -package javasabr.rlib.common.util.ref; - -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; - -/** - * The reference to double value. - * - * @author JavaSaBr - */ -@Getter -@Setter -@ToString -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = false) -public class DoubleReference extends AbstractReference { - - /** - * The value of this reference. - */ - private double value; - - @Override - public void free() { - this.value = 0D; - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/FloatReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/FloatReference.java deleted file mode 100644 index f41335b0..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/FloatReference.java +++ /dev/null @@ -1,32 +0,0 @@ -package javasabr.rlib.common.util.ref; - -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; - -/** - * The reference to float value. - * - * @author JavaSaBr - */ -@Getter -@Setter -@ToString -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = false) -public class FloatReference extends AbstractReference { - - /** - * The value of this reference. - */ - private float value; - - @Override - public void free() { - this.value = 0F; - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalByteReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalByteReference.java deleted file mode 100644 index e3fbab7f..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalByteReference.java +++ /dev/null @@ -1,14 +0,0 @@ -package javasabr.rlib.common.util.ref; - -/** - * The reference to byte value. - * - * @author JavaSaBr - */ -final class GlobalByteReference extends ByteReference { - - @Override - public void release() { - ReferenceFactory.release(this); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalCharReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalCharReference.java deleted file mode 100644 index b704f558..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalCharReference.java +++ /dev/null @@ -1,14 +0,0 @@ -package javasabr.rlib.common.util.ref; - -/** - * The reference to char value. - * - * @author JavaSaBr - */ -final class GlobalCharReference extends CharReference { - - @Override - public void release() { - ReferenceFactory.release(this); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalDoubleReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalDoubleReference.java deleted file mode 100644 index 3037f881..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalDoubleReference.java +++ /dev/null @@ -1,14 +0,0 @@ -package javasabr.rlib.common.util.ref; - -/** - * The reference to double value. - * - * @author JavaSaBr - */ -final class GlobalDoubleReference extends DoubleReference { - - @Override - public void release() { - ReferenceFactory.release(this); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalFloatReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalFloatReference.java deleted file mode 100644 index dde133c9..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalFloatReference.java +++ /dev/null @@ -1,14 +0,0 @@ -package javasabr.rlib.common.util.ref; - -/** - * The reference to float value. - * - * @author JavaSaBr - */ -final class GlobalFloatReference extends FloatReference { - - @Override - public void release() { - ReferenceFactory.release(this); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalIntReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalIntReference.java deleted file mode 100644 index cd664ba8..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalIntReference.java +++ /dev/null @@ -1,14 +0,0 @@ -package javasabr.rlib.common.util.ref; - -/** - * The reference to integer value. - * - * @author JavaSaBr - */ -final class GlobalIntReference extends IntReference { - - @Override - public void release() { - ReferenceFactory.release(this); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalLongReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalLongReference.java deleted file mode 100644 index eb5d7d36..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalLongReference.java +++ /dev/null @@ -1,14 +0,0 @@ -package javasabr.rlib.common.util.ref; - -/** - * The reference to long value. - * - * @author JavaSaBr - */ -final class GlobalLongReference extends LongReference { - - @Override - public void release() { - ReferenceFactory.release(this); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalObjectReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalObjectReference.java deleted file mode 100644 index 4a9fb83c..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalObjectReference.java +++ /dev/null @@ -1,14 +0,0 @@ -package javasabr.rlib.common.util.ref; - -/** - * The reference to object. - * - * @author JavaSaBr - */ -final class GlobalObjectReference extends ObjectReference { - - @Override - public void release() { - ReferenceFactory.release(this); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalShortReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalShortReference.java deleted file mode 100644 index 509b4b96..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/GlobalShortReference.java +++ /dev/null @@ -1,14 +0,0 @@ -package javasabr.rlib.common.util.ref; - -/** - * The reference to short value. - * - * @author JavaSaBr - */ -final class GlobalShortReference extends ShortReference { - - @Override - public void release() { - ReferenceFactory.release(this); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/IntReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/IntReference.java deleted file mode 100644 index 4eab7962..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/IntReference.java +++ /dev/null @@ -1,32 +0,0 @@ -package javasabr.rlib.common.util.ref; - -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; - -/** - * The reference to integer value. - * - * @author JavaSaBr - */ -@Getter -@Setter -@ToString -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = false) -public class IntReference extends AbstractReference { - - /** - * The value of this reference. - */ - private int value; - - @Override - public void free() { - this.value = 0; - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/LongReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/LongReference.java deleted file mode 100644 index 19a51d3c..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/LongReference.java +++ /dev/null @@ -1,32 +0,0 @@ -package javasabr.rlib.common.util.ref; - -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; - -/** - * The reference to long value. - * - * @author JavaSaBr - */ -@Getter -@Setter -@ToString -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = false) -public class LongReference extends AbstractReference { - - /** - * The value of this reference. - */ - private long value; - - @Override - public void free() { - this.value = 0L; - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/ObjectReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/ObjectReference.java deleted file mode 100644 index ebf4ed56..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/ObjectReference.java +++ /dev/null @@ -1,32 +0,0 @@ -package javasabr.rlib.common.util.ref; - -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; - -/** - * The reference to object. - * - * @author JavaSaBr - */ -@Getter -@Setter -@ToString -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = false) -public class ObjectReference extends AbstractReference { - - /** - * The object of this reference. - */ - private T value; - - @Override - public void free() { - this.value = null; - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/Reference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/Reference.java deleted file mode 100644 index ace1ae9f..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/Reference.java +++ /dev/null @@ -1,10 +0,0 @@ -package javasabr.rlib.common.util.ref; - -import javasabr.rlib.common.util.pools.Reusable; - -/** - * The interface to implement a reference. - * - * @author JavaSaBr - */ -public interface Reference extends Reusable {} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/ReferenceFactory.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/ReferenceFactory.java deleted file mode 100644 index f987e5fc..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/ReferenceFactory.java +++ /dev/null @@ -1,414 +0,0 @@ -package javasabr.rlib.common.util.ref; - -import javasabr.rlib.common.util.pools.PoolFactory; -import javasabr.rlib.common.util.pools.ReusablePool; -import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; - -/** - * @author JavaSaBr - */ -@NullMarked -public final class ReferenceFactory { - - private static final ReusablePool GLOBAL_BYTE_REF_POOL = - PoolFactory.newConcurrentStampedLockReusablePool( - GlobalByteReference.class); - private static final ReusablePool GLOBAL_SHORT_REF_POOL = - PoolFactory.newConcurrentStampedLockReusablePool( - GlobalShortReference.class); - private static final ReusablePool GLOBAL_CHAR_REF_POOL = - PoolFactory.newConcurrentStampedLockReusablePool( - GlobalCharReference.class); - private static final ReusablePool GLOBAL_INT_REF_POOL = - PoolFactory.newConcurrentStampedLockReusablePool( - GlobalIntReference.class); - private static final ReusablePool GLOBAL_LONG_REF_POOL = - PoolFactory.newConcurrentStampedLockReusablePool( - GlobalLongReference.class); - private static final ReusablePool GLOBAL_FLOAT_REF_POOL = - PoolFactory.newConcurrentStampedLockReusablePool( - GlobalFloatReference.class); - private static final ReusablePool GLOBAL_DOUBLE_REF_POOL = - PoolFactory.newConcurrentStampedLockReusablePool( - GlobalDoubleReference.class); - private static final ReusablePool GLOBAL_OBJ_REF_POOL = - PoolFactory.newConcurrentStampedLockReusablePool( - GlobalObjectReference.class); - - private static final ThreadLocal> TL_BYTE_REF_POOL = - ThreadLocal.withInitial(() -> PoolFactory.newReusablePool( - TLByteReference.class)); - private static final ThreadLocal> TL_SHORT_REF_POOL = - ThreadLocal.withInitial(() -> PoolFactory.newReusablePool( - TLShortReference.class)); - private static final ThreadLocal> TL_CHAR_REF_POOL = - ThreadLocal.withInitial(() -> PoolFactory.newReusablePool( - TLCharReference.class)); - private static final ThreadLocal> TL_INT_REF_POOL = - ThreadLocal.withInitial(() -> PoolFactory.newReusablePool( - TLIntReference.class)); - private static final ThreadLocal> TL_LONG_REF_POOL = - ThreadLocal.withInitial(() -> PoolFactory.newReusablePool( - TLLongReference.class)); - private static final ThreadLocal> TL_FLOAT_REF_POOL = - ThreadLocal.withInitial(() -> PoolFactory.newReusablePool( - TLFloatReference.class)); - private static final ThreadLocal> TL_DOUBLE_REF_POOL = - ThreadLocal.withInitial(() -> PoolFactory.newReusablePool( - TLDoubleReference.class)); - private static final ThreadLocal> TL_OBJECT_REF_POOL = - ThreadLocal.withInitial(() -> PoolFactory.newReusablePool( - TLObjectReference.class)); - - /** - * @param value the init value. - * @return the new byte ref. - * @since 9.2.1 - */ - public static ByteReference newByteRef(byte value) { - return new ByteReference(value); - } - - /** - * @param value the init value. - * @return the new byte ref. - * @since 9.2.1 - */ - public static ByteReference newReusableByteRef(byte value) { - var ref = GLOBAL_BYTE_REF_POOL.take(GlobalByteReference::new); - ref.setValue(value); - return ref; - } - - /** - * @param value the init value. - * @return the new byte ref. - * @since 9.2.1 - */ - public static ByteReference newThreadLocalByteRef(byte value) { - var ref = TL_BYTE_REF_POOL - .get() - .take(TLByteReference::new); - ref.setValue(value); - return ref; - } - - /** - * @param value the init value. - * @return the new short ref. - * @since 9.2.1 - */ - public static ShortReference newShortRef(short value) { - return new ShortReference(value); - } - - /** - * @param value the init value. - * @return the new short ref. - * @since 9.2.1 - */ - public static ShortReference newReusableShortRef(short value) { - var ref = GLOBAL_SHORT_REF_POOL.take(GlobalShortReference::new); - ref.setValue(value); - return ref; - } - - /** - * @param value the init value. - * @return the new short ref. - * @since 9.2.1 - */ - public static ShortReference newThreadLocalShortRef(short value) { - var ref = TL_SHORT_REF_POOL - .get() - .take(TLShortReference::new); - ref.setValue(value); - return ref; - } - - /** - * @param value the init value. - * @return the new char ref. - * @since 9.2.1 - */ - public static CharReference newCharRef(char value) { - return new CharReference(value); - } - - /** - * @param value the init value. - * @return the new char ref. - * @since 9.2.1 - */ - public static CharReference newReusableCharRef(char value) { - var ref = GLOBAL_CHAR_REF_POOL.take(GlobalCharReference::new); - ref.setValue(value); - return ref; - } - - /** - * @param value the init value. - * @return the new char ref. - * @since 9.2.1 - */ - public static CharReference newThreadLocalCharRef(char value) { - var ref = TL_CHAR_REF_POOL - .get() - .take(TLCharReference::new); - ref.setValue(value); - return ref; - } - - /** - * @param value the init value. - * @return the new int ref. - * @since 9.2.1 - */ - public static IntReference newIntRef(int value) { - return new IntReference(value); - } - - /** - * @param value the init value. - * @return the new int ref. - * @since 9.2.1 - */ - public static IntReference newReusableIntRef(int value) { - var ref = GLOBAL_INT_REF_POOL.take(GlobalIntReference::new); - ref.setValue(value); - return ref; - } - - /** - * @param value the init value. - * @return the new int ref. - * @since 9.2.1 - */ - public static IntReference newThreadLocalIntRef(int value) { - var ref = TL_INT_REF_POOL - .get() - .take(TLIntReference::new); - ref.setValue(value); - return ref; - } - - /** - * @param value the init value. - * @return the new long ref. - * @since 9.2.1 - */ - public static LongReference newLongRef(long value) { - return new LongReference(value); - } - - /** - * @param value the init value. - * @return the new long ref. - * @since 9.2.1 - */ - public static LongReference newReusableLongRef(long value) { - var ref = GLOBAL_LONG_REF_POOL.take(GlobalLongReference::new); - ref.setValue(value); - return ref; - } - - /** - * @param value the init value. - * @return the new long ref. - * @since 9.2.1 - */ - public static LongReference newThreadLocalLongRef(long value) { - var ref = TL_LONG_REF_POOL - .get() - .take(TLLongReference::new); - ref.setValue(value); - return ref; - } - - /** - * @param value the init value. - * @return the new float ref. - * @since 9.2.1 - */ - public static FloatReference newFloatRef(float value) { - return new FloatReference(value); - } - - /** - * @param value the init value. - * @return the new float ref. - * @since 9.2.1 - */ - public static FloatReference newReusableFloatRef(float value) { - var ref = GLOBAL_FLOAT_REF_POOL.take(GlobalFloatReference::new); - ref.setValue(value); - return ref; - } - - /** - * @param value the init value. - * @return the new float ref. - * @since 9.2.1 - */ - public static FloatReference newThreadLocalFloatRef(float value) { - var ref = TL_FLOAT_REF_POOL - .get() - .take(TLFloatReference::new); - ref.setValue(value); - return ref; - } - - /** - * @param value the init value. - * @return the new double ref. - * @since 9.2.1 - */ - public static DoubleReference newDoubleRef(double value) { - return new DoubleReference(value); - } - - /** - * @param value the init value. - * @return the new double ref. - * @since 9.2.1 - */ - public static DoubleReference newReusableDoubleRef(double value) { - var ref = GLOBAL_DOUBLE_REF_POOL.take(GlobalDoubleReference::new); - ref.setValue(value); - return ref; - } - - /** - * @param value the init value. - * @return the new double ref. - * @since 9.2.1 - */ - public static DoubleReference newThreadLocalDoubleRef(double value) { - var ref = TL_DOUBLE_REF_POOL - .get() - .take(TLDoubleReference::new); - ref.setValue(value); - return ref; - } - - /** - * @param value the init value. - * @param the object's type. - * @return the new object ref. - * @since 9.2.1 - */ - public static ObjectReference newObjRef(@Nullable T value) { - return new ObjectReference<>(value); - } - - /** - * @param value the init value. - * @param the object's type. - * @return the new object ref. - * @since 9.2.1 - */ - public static ObjectReference newReusableObjRef(@Nullable T value) { - ObjectReference ref = GLOBAL_OBJ_REF_POOL.take(GlobalObjectReference::new); - ref.setValue(value); - return ref; - } - - /** - * @param value the init value. - * @param the object's type. - * @return the new object ref. - * @since 9.2.1 - */ - public static ObjectReference newThreadLocalObjRef(@Nullable T value) { - TLObjectReference ref = TL_OBJECT_REF_POOL - .get() - .take(TLObjectReference::new); - ref.setValue(value); - return ref; - } - - static void release(GlobalByteReference ref) { - GLOBAL_BYTE_REF_POOL.put(ref); - } - - static void release(GlobalShortReference ref) { - GLOBAL_SHORT_REF_POOL.put(ref); - } - - static void release(GlobalCharReference ref) { - GLOBAL_CHAR_REF_POOL.put(ref); - } - - static void release(GlobalIntReference ref) { - GLOBAL_INT_REF_POOL.put(ref); - } - - static void release(GlobalLongReference ref) { - GLOBAL_LONG_REF_POOL.put(ref); - } - - static void release(GlobalFloatReference ref) { - GLOBAL_FLOAT_REF_POOL.put(ref); - } - - static void release(GlobalDoubleReference ref) { - GLOBAL_DOUBLE_REF_POOL.put(ref); - } - - static void release(GlobalObjectReference ref) { - GLOBAL_OBJ_REF_POOL.put(ref); - } - - static void release(TLByteReference ref) { - TL_BYTE_REF_POOL - .get() - .put(ref); - } - - static void release(TLShortReference ref) { - TL_SHORT_REF_POOL - .get() - .put(ref); - } - - static void release(TLCharReference ref) { - TL_CHAR_REF_POOL - .get() - .put(ref); - } - - static void release(TLIntReference ref) { - TL_INT_REF_POOL - .get() - .put(ref); - } - - static void release(TLLongReference ref) { - TL_LONG_REF_POOL - .get() - .put(ref); - } - - static void release(TLFloatReference ref) { - TL_FLOAT_REF_POOL - .get() - .put(ref); - } - - static void release(TLDoubleReference ref) { - TL_DOUBLE_REF_POOL - .get() - .put(ref); - } - - static void release(TLObjectReference ref) { - TL_OBJECT_REF_POOL - .get() - .put(ref); - } - - private ReferenceFactory() { - throw new IllegalArgumentException(); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLByteReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLByteReference.java deleted file mode 100644 index 2db653f0..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLByteReference.java +++ /dev/null @@ -1,14 +0,0 @@ -package javasabr.rlib.common.util.ref; - -/** - * The reference to byte value. - * - * @author JavaSaBr - */ -final class TLByteReference extends ByteReference { - - @Override - public void release() { - ReferenceFactory.release(this); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLCharReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLCharReference.java deleted file mode 100644 index f633fb21..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLCharReference.java +++ /dev/null @@ -1,14 +0,0 @@ -package javasabr.rlib.common.util.ref; - -/** - * The reference to char value. - * - * @author JavaSaBr - */ -final class TLCharReference extends CharReference { - - @Override - public void release() { - ReferenceFactory.release(this); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLDoubleReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLDoubleReference.java deleted file mode 100644 index 99574a0e..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLDoubleReference.java +++ /dev/null @@ -1,14 +0,0 @@ -package javasabr.rlib.common.util.ref; - -/** - * The reference to double value. - * - * @author JavaSaBr - */ -final class TLDoubleReference extends DoubleReference { - - @Override - public void release() { - ReferenceFactory.release(this); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLFloatReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLFloatReference.java deleted file mode 100644 index 7cf1ca29..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLFloatReference.java +++ /dev/null @@ -1,14 +0,0 @@ -package javasabr.rlib.common.util.ref; - -/** - * The reference to float value. - * - * @author JavaSaBr - */ -final class TLFloatReference extends FloatReference { - - @Override - public void release() { - ReferenceFactory.release(this); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLIntReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLIntReference.java deleted file mode 100644 index e8eade8c..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLIntReference.java +++ /dev/null @@ -1,14 +0,0 @@ -package javasabr.rlib.common.util.ref; - -/** - * The reference to integer value. - * - * @author JavaSaBr - */ -final class TLIntReference extends IntReference { - - @Override - public void release() { - ReferenceFactory.release(this); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLLongReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLLongReference.java deleted file mode 100644 index 5ce8b30c..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLLongReference.java +++ /dev/null @@ -1,14 +0,0 @@ -package javasabr.rlib.common.util.ref; - -/** - * The reference to long value. - * - * @author JavaSaBr - */ -final class TLLongReference extends LongReference { - - @Override - public void release() { - ReferenceFactory.release(this); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLObjectReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLObjectReference.java deleted file mode 100644 index 4c200e32..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLObjectReference.java +++ /dev/null @@ -1,14 +0,0 @@ -package javasabr.rlib.common.util.ref; - -/** - * The reference to object. - * - * @author JavaSaBr - */ -final class TLObjectReference extends ObjectReference { - - @Override - public void release() { - ReferenceFactory.release(this); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLShortReference.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLShortReference.java deleted file mode 100644 index f9def83f..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/TLShortReference.java +++ /dev/null @@ -1,14 +0,0 @@ -package javasabr.rlib.common.util.ref; - -/** - * The reference to short value. - * - * @author JavaSaBr - */ -final class TLShortReference extends ShortReference { - - @Override - public void release() { - ReferenceFactory.release(this); - } -} diff --git a/rlib-common/src/test/java/javasabr/rlib/common/concurrent/executor/TestThreadPoolTaskExecutor.java b/rlib-common/src/test/java/javasabr/rlib/common/concurrent/executor/TestThreadPoolTaskExecutor.java index bca06b78..dd870060 100644 --- a/rlib-common/src/test/java/javasabr/rlib/common/concurrent/executor/TestThreadPoolTaskExecutor.java +++ b/rlib-common/src/test/java/javasabr/rlib/common/concurrent/executor/TestThreadPoolTaskExecutor.java @@ -1,7 +1,7 @@ package javasabr.rlib.common.concurrent.executor; +import java.util.concurrent.atomic.AtomicInteger; import javasabr.rlib.common.concurrent.GroupThreadFactory; -import javasabr.rlib.common.concurrent.atomic.ReusableAtomicInteger; import javasabr.rlib.common.concurrent.executor.impl.ThreadPoolTaskExecutor; import javasabr.rlib.common.concurrent.util.ThreadUtils; import org.junit.jupiter.api.Assertions; @@ -30,7 +30,7 @@ protected Object getLocalObjects(final Thread thread) { } }; - final ReusableAtomicInteger counter = new ReusableAtomicInteger(); + final AtomicInteger counter = new AtomicInteger(); for (int i = 0; i < TASK_LIMIT; i++) { executor.execute((local, currentTime) -> { diff --git a/rlib-common/src/test/java/javasabr/rlib/common/util/ReferencesTest.java b/rlib-common/src/test/java/javasabr/rlib/common/util/ReferencesTest.java deleted file mode 100644 index 1510b301..00000000 --- a/rlib-common/src/test/java/javasabr/rlib/common/util/ReferencesTest.java +++ /dev/null @@ -1,151 +0,0 @@ -package javasabr.rlib.common.util; - -import javasabr.rlib.common.util.ref.ReferenceFactory; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -/** - * @author JavaSaBr - */ -public class ReferencesTest { - - @Test - void shouldReferencesWork() { - - var byteRef = ReferenceFactory.newByteRef((byte) 5); - var charRef = ReferenceFactory.newCharRef('T'); - var doubleRef = ReferenceFactory.newDoubleRef(1.5D); - var floatRef = ReferenceFactory.newFloatRef(2.5F); - var intRef = ReferenceFactory.newIntRef(5); - var longRef = ReferenceFactory.newLongRef(7L); - var objRef = ReferenceFactory.newObjRef("Val"); - var shortRef = ReferenceFactory.newShortRef((short) 7); - - Assertions.assertEquals(5, byteRef.getValue()); - Assertions.assertEquals('T', charRef.getValue()); - Assertions.assertEquals(1.5D, doubleRef.getValue()); - Assertions.assertEquals(2.5F, floatRef.getValue()); - Assertions.assertEquals(5, intRef.getValue()); - Assertions.assertEquals(7L, longRef.getValue()); - Assertions.assertEquals("Val", objRef.getValue()); - Assertions.assertEquals(7, shortRef.getValue()); - } - - @Test - void shouldReusableReferencesWork() { - - var byteRef = ReferenceFactory.newReusableByteRef((byte) 3); - var charRef = ReferenceFactory.newReusableCharRef('d'); - var doubleRef = ReferenceFactory.newReusableDoubleRef(3.5D); - var floatRef = ReferenceFactory.newReusableFloatRef(1.5F); - var intRef = ReferenceFactory.newReusableIntRef(7); - var longRef = ReferenceFactory.newReusableLongRef(4L); - var objRef = ReferenceFactory.newReusableObjRef("Val3"); - var shortRef = ReferenceFactory.newReusableShortRef((short) 2); - - Assertions.assertEquals(3, byteRef.getValue()); - Assertions.assertEquals('d', charRef.getValue()); - Assertions.assertEquals(3.5D, doubleRef.getValue()); - Assertions.assertEquals(1.5F, floatRef.getValue()); - Assertions.assertEquals(7, intRef.getValue()); - Assertions.assertEquals(4L, longRef.getValue()); - Assertions.assertEquals("Val3", objRef.getValue()); - Assertions.assertEquals(2, shortRef.getValue()); - - byteRef.release(); - charRef.release(); - doubleRef.release(); - floatRef.release(); - intRef.release(); - longRef.release(); - objRef.release(); - shortRef.release(); - - Assertions.assertEquals(0, byteRef.getValue()); - Assertions.assertEquals(0, charRef.getValue()); - Assertions.assertEquals(0, doubleRef.getValue()); - Assertions.assertEquals(0, floatRef.getValue()); - Assertions.assertEquals(0, intRef.getValue()); - Assertions.assertEquals(0, longRef.getValue()); - Assertions.assertNull(objRef.getValue()); - Assertions.assertEquals(0, shortRef.getValue()); - Assertions.assertEquals(0, byteRef.getValue()); - - var byteRef2 = ReferenceFactory.newReusableByteRef((byte) 3); - var charRef2 = ReferenceFactory.newReusableCharRef('d'); - var doubleRef2 = ReferenceFactory.newReusableDoubleRef(3.5D); - var floatRef2 = ReferenceFactory.newReusableFloatRef(1.5F); - var intRef2 = ReferenceFactory.newReusableIntRef(7); - var longRef2 = ReferenceFactory.newReusableLongRef(4L); - var objRef2 = ReferenceFactory.newReusableObjRef("Val3"); - var shortRef2 = ReferenceFactory.newReusableShortRef((short) 2); - - Assertions.assertSame(byteRef, byteRef2); - Assertions.assertSame(charRef, charRef2); - Assertions.assertSame(doubleRef, doubleRef2); - Assertions.assertSame(floatRef, floatRef2); - Assertions.assertSame(intRef, intRef2); - Assertions.assertSame(longRef, longRef2); - Assertions.assertSame(objRef, objRef2); - Assertions.assertSame(shortRef, shortRef2); - } - - @Test - void shouldTLReferencesWork() { - - var byteRef = ReferenceFactory.newThreadLocalByteRef((byte) 3); - var charRef = ReferenceFactory.newThreadLocalCharRef('d'); - var doubleRef = ReferenceFactory.newThreadLocalDoubleRef(3.5D); - var floatRef = ReferenceFactory.newThreadLocalFloatRef(1.5F); - var intRef = ReferenceFactory.newThreadLocalIntRef(7); - var longRef = ReferenceFactory.newThreadLocalLongRef(4L); - var objRef = ReferenceFactory.newThreadLocalObjRef("Val3"); - var shortRef = ReferenceFactory.newThreadLocalShortRef((short) 2); - - Assertions.assertEquals(3, byteRef.getValue()); - Assertions.assertEquals('d', charRef.getValue()); - Assertions.assertEquals(3.5D, doubleRef.getValue()); - Assertions.assertEquals(1.5F, floatRef.getValue()); - Assertions.assertEquals(7, intRef.getValue()); - Assertions.assertEquals(4L, longRef.getValue()); - Assertions.assertEquals("Val3", objRef.getValue()); - Assertions.assertEquals(2, shortRef.getValue()); - - byteRef.release(); - charRef.release(); - doubleRef.release(); - floatRef.release(); - intRef.release(); - longRef.release(); - objRef.release(); - shortRef.release(); - - Assertions.assertEquals(0, byteRef.getValue()); - Assertions.assertEquals(0, charRef.getValue()); - Assertions.assertEquals(0, doubleRef.getValue()); - Assertions.assertEquals(0, floatRef.getValue()); - Assertions.assertEquals(0, intRef.getValue()); - Assertions.assertEquals(0, longRef.getValue()); - Assertions.assertNull(objRef.getValue()); - Assertions.assertEquals(0, shortRef.getValue()); - Assertions.assertEquals(0, byteRef.getValue()); - - var byteRef2 = ReferenceFactory.newThreadLocalByteRef((byte) 3); - var charRef2 = ReferenceFactory.newThreadLocalCharRef('d'); - var doubleRef2 = ReferenceFactory.newThreadLocalDoubleRef(3.5D); - var floatRef2 = ReferenceFactory.newThreadLocalFloatRef(1.5F); - var intRef2 = ReferenceFactory.newThreadLocalIntRef(7); - var longRef2 = ReferenceFactory.newThreadLocalLongRef(4L); - var objRef2 = ReferenceFactory.newThreadLocalObjRef("Val3"); - var shortRef2 = ReferenceFactory.newThreadLocalShortRef((short) 2); - - Assertions.assertSame(byteRef, byteRef2); - Assertions.assertSame(charRef, charRef2); - Assertions.assertSame(doubleRef, doubleRef2); - Assertions.assertSame(floatRef, floatRef2); - Assertions.assertSame(intRef, intRef2); - Assertions.assertSame(longRef, longRef2); - Assertions.assertSame(objRef, objRef2); - Assertions.assertSame(shortRef, shortRef2); - } -} diff --git a/rlib-common/src/test/java/javasabr/rlib/common/util/array/ArrayTest.java b/rlib-common/src/test/java/javasabr/rlib/common/util/array/ArrayTest.java index 27fd58ae..a35e923e 100644 --- a/rlib-common/src/test/java/javasabr/rlib/common/util/array/ArrayTest.java +++ b/rlib-common/src/test/java/javasabr/rlib/common/util/array/ArrayTest.java @@ -1,8 +1,8 @@ package javasabr.rlib.common.util.array; import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; import javasabr.rlib.common.BaseTest; -import javasabr.rlib.common.concurrent.atomic.ReusableAtomicInteger; import javasabr.rlib.common.util.NumberUtils; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -283,7 +283,7 @@ void countTest() { void forEachTest() { var array = Array.of("First", "Second", "Third", " ", "Third"); - var counter = new ReusableAtomicInteger(0); + var counter = new AtomicInteger(0); array.forEach(element -> counter.incrementAndGet()); diff --git a/rlib-common/src/test/java/javasabr/rlib/common/util/array/ConcurrentArrayTest.java b/rlib-common/src/test/java/javasabr/rlib/common/util/array/ConcurrentArrayTest.java index b108bddb..0b69839e 100644 --- a/rlib-common/src/test/java/javasabr/rlib/common/util/array/ConcurrentArrayTest.java +++ b/rlib-common/src/test/java/javasabr/rlib/common/util/array/ConcurrentArrayTest.java @@ -8,8 +8,8 @@ import java.util.Collections; import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; import javasabr.rlib.common.BaseTest; -import javasabr.rlib.common.concurrent.atomic.ReusableAtomicInteger; import javasabr.rlib.common.util.NumberUtils; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -286,7 +286,7 @@ void getInReadLockTest() { void forEachInReadLockTest() { var array = ConcurrentArray.of("First", "Second", "Third", " ", "Third"); - var counter = new ReusableAtomicInteger(0); + var counter = new AtomicInteger(0); array.forEachInReadLock(element -> counter.incrementAndGet()); diff --git a/rlib-functions/src/main/java/javasabr/rlib/functions/ObjectLongFunction.java b/rlib-functions/src/main/java/javasabr/rlib/functions/ObjectLongFunction.java new file mode 100644 index 00000000..2c87e2cf --- /dev/null +++ b/rlib-functions/src/main/java/javasabr/rlib/functions/ObjectLongFunction.java @@ -0,0 +1,10 @@ +package javasabr.rlib.functions; + +/** + * @author JavaSaBr + */ +@FunctionalInterface +public interface ObjectLongFunction { + + R apply(T arg1, long arg2); +} diff --git a/rlib-fx/build.gradle b/rlib-fx/build.gradle index e0ac566c..f1ed3631 100644 --- a/rlib-fx/build.gradle +++ b/rlib-fx/build.gradle @@ -4,6 +4,7 @@ plugins { dependencies { api projects.rlibCommon + api projects.rlibReference } javafx { diff --git a/rlib-fx/src/main/java/javasabr/rlib/fx/input/InternalContent.java b/rlib-fx/src/main/java/javasabr/rlib/fx/input/InternalContent.java index 8f985805..4ca450ae 100644 --- a/rlib-fx/src/main/java/javasabr/rlib/fx/input/InternalContent.java +++ b/rlib-fx/src/main/java/javasabr/rlib/fx/input/InternalContent.java @@ -4,7 +4,7 @@ import java.util.HashMap; import javafx.scene.input.DataFormat; -import javasabr.rlib.common.util.ref.Reference; +import javasabr.rlib.reference.Reference; import org.jspecify.annotations.Nullable; /** diff --git a/rlib-geometry/src/main/java/javasabr/rlib/geometry/Matrix3f.java b/rlib-geometry/src/main/java/javasabr/rlib/geometry/Matrix3f.java index d4866054..38c6cb37 100644 --- a/rlib-geometry/src/main/java/javasabr/rlib/geometry/Matrix3f.java +++ b/rlib-geometry/src/main/java/javasabr/rlib/geometry/Matrix3f.java @@ -1,6 +1,5 @@ package javasabr.rlib.geometry; -import javasabr.rlib.common.util.pools.Reusable; import lombok.AccessLevel; import lombok.Getter; import lombok.experimental.Accessors; @@ -12,7 +11,7 @@ @Getter @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PROTECTED) -public final class Matrix3f implements Reusable { +public final class Matrix3f { public static final Matrix3f ZERO = new Matrix3f( 0, 0, 0, diff --git a/rlib-geometry/src/main/java/javasabr/rlib/geometry/Ray3f.java b/rlib-geometry/src/main/java/javasabr/rlib/geometry/Ray3f.java index f8cb3d90..b02fbdcb 100644 --- a/rlib-geometry/src/main/java/javasabr/rlib/geometry/Ray3f.java +++ b/rlib-geometry/src/main/java/javasabr/rlib/geometry/Ray3f.java @@ -1,6 +1,5 @@ package javasabr.rlib.geometry; -import javasabr.rlib.common.util.pools.Reusable; import lombok.AccessLevel; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -14,7 +13,7 @@ @Accessors(fluent = true) @RequiredArgsConstructor @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) -public class Ray3f implements Reusable { +public class Ray3f { Vector3f start, direction; diff --git a/rlib-network/build.gradle b/rlib-network/build.gradle index c8b65e5c..ef0d1c95 100644 --- a/rlib-network/build.gradle +++ b/rlib-network/build.gradle @@ -2,6 +2,7 @@ dependencies { api projects.rlibCommon api projects.rlibClasspath api projects.rlibCollections + api projects.rlibReusable api libs.project.reactor.core testRuntimeOnly projects.rlibLoggerImpl } diff --git a/rlib-network/src/main/java/javasabr/rlib/network/impl/DefaultBufferAllocator.java b/rlib-network/src/main/java/javasabr/rlib/network/impl/DefaultBufferAllocator.java index 70109892..4ffbc7d6 100644 --- a/rlib-network/src/main/java/javasabr/rlib/network/impl/DefaultBufferAllocator.java +++ b/rlib-network/src/main/java/javasabr/rlib/network/impl/DefaultBufferAllocator.java @@ -1,12 +1,12 @@ package javasabr.rlib.network.impl; import java.nio.ByteBuffer; -import javasabr.rlib.common.util.pools.Pool; -import javasabr.rlib.common.util.pools.PoolFactory; import javasabr.rlib.logger.api.Logger; import javasabr.rlib.logger.api.LoggerManager; import javasabr.rlib.network.BufferAllocator; import javasabr.rlib.network.NetworkConfig; +import javasabr.rlib.reusable.pool.Pool; +import javasabr.rlib.reusable.pool.PoolFactory; import lombok.ToString; /** @@ -27,9 +27,9 @@ public class DefaultBufferAllocator implements BufferAllocator { public DefaultBufferAllocator(NetworkConfig config) { this.config = config; - this.readBufferPool = PoolFactory.newConcurrentStampedLockPool(ByteBuffer.class); - this.pendingBufferPool = PoolFactory.newConcurrentStampedLockPool(ByteBuffer.class); - this.writeBufferPool = PoolFactory.newConcurrentStampedLockPool(ByteBuffer.class); + this.readBufferPool = PoolFactory.newLockBasePool(ByteBuffer.class); + this.pendingBufferPool = PoolFactory.newLockBasePool(ByteBuffer.class); + this.writeBufferPool = PoolFactory.newLockBasePool(ByteBuffer.class); } @Override diff --git a/rlib-network/src/main/java/javasabr/rlib/network/impl/ReuseBufferAllocator.java b/rlib-network/src/main/java/javasabr/rlib/network/impl/ReuseBufferAllocator.java index 429310c8..a4f9200c 100644 --- a/rlib-network/src/main/java/javasabr/rlib/network/impl/ReuseBufferAllocator.java +++ b/rlib-network/src/main/java/javasabr/rlib/network/impl/ReuseBufferAllocator.java @@ -4,12 +4,12 @@ import java.util.function.Function; import javasabr.rlib.collections.array.ArrayFactory; import javasabr.rlib.collections.array.LockableMutableArray; -import javasabr.rlib.common.util.pools.Pool; -import javasabr.rlib.common.util.pools.PoolFactory; import javasabr.rlib.logger.api.Logger; import javasabr.rlib.logger.api.LoggerManager; import javasabr.rlib.network.BufferAllocator; import javasabr.rlib.network.NetworkConfig; +import javasabr.rlib.reusable.pool.Pool; +import javasabr.rlib.reusable.pool.PoolFactory; import lombok.ToString; /** @@ -29,9 +29,9 @@ public class ReuseBufferAllocator implements BufferAllocator { public ReuseBufferAllocator(NetworkConfig config) { this.config = config; - this.readBufferPool = PoolFactory.newConcurrentStampedLockPool(ByteBuffer.class); - this.pendingBufferPool = PoolFactory.newConcurrentStampedLockPool(ByteBuffer.class); - this.writeBufferPool = PoolFactory.newConcurrentStampedLockPool(ByteBuffer.class); + this.readBufferPool = PoolFactory.newLockBasePool(ByteBuffer.class); + this.pendingBufferPool = PoolFactory.newLockBasePool(ByteBuffer.class); + this.writeBufferPool = PoolFactory.newLockBasePool(ByteBuffer.class); this.byteBuffers = ArrayFactory.stampedLockBasedArray(ByteBuffer.class); } diff --git a/rlib-network/src/main/java/javasabr/rlib/network/packet/ReusableWritablePacket.java b/rlib-network/src/main/java/javasabr/rlib/network/packet/ReusableWritablePacket.java index 29c14a3d..b4eb1b06 100644 --- a/rlib-network/src/main/java/javasabr/rlib/network/packet/ReusableWritablePacket.java +++ b/rlib-network/src/main/java/javasabr/rlib/network/packet/ReusableWritablePacket.java @@ -1,7 +1,7 @@ package javasabr.rlib.network.packet; -import javasabr.rlib.common.util.pools.Pool; -import javasabr.rlib.common.util.pools.Reusable; +import javasabr.rlib.reusable.Reusable; +import javasabr.rlib.reusable.pool.Pool; /** * The interface to implement a reusable writable packet. diff --git a/rlib-network/src/main/java/javasabr/rlib/network/packet/impl/AbstractReusableWritablePacket.java b/rlib-network/src/main/java/javasabr/rlib/network/packet/impl/AbstractReusableWritablePacket.java index 3187f6f6..6f004c3d 100644 --- a/rlib-network/src/main/java/javasabr/rlib/network/packet/impl/AbstractReusableWritablePacket.java +++ b/rlib-network/src/main/java/javasabr/rlib/network/packet/impl/AbstractReusableWritablePacket.java @@ -5,11 +5,11 @@ import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; -import javasabr.rlib.common.concurrent.atomic.ReusableAtomicInteger; +import java.util.concurrent.atomic.AtomicInteger; import javasabr.rlib.common.util.ClassUtils; -import javasabr.rlib.common.util.pools.Pool; -import javasabr.rlib.common.util.pools.PoolFactory; import javasabr.rlib.network.packet.ReusableWritablePacket; +import javasabr.rlib.reusable.pool.Pool; +import javasabr.rlib.reusable.pool.PoolFactory; import org.jspecify.annotations.Nullable; /** @@ -23,7 +23,7 @@ public abstract class AbstractReusableWritablePacket extends AbstractWritablePac protected static final ThreadLocal, Pool>> LOCAL_POOLS = ThreadLocal.withInitial( HashMap::new); - protected final ReusableAtomicInteger counter; + protected final AtomicInteger counter; /** * The pool to store this packet after using. @@ -34,7 +34,7 @@ public abstract class AbstractReusableWritablePacket extends AbstractWritablePac protected int barrierSink; public AbstractReusableWritablePacket() { - this.counter = new ReusableAtomicInteger(); + this.counter = new AtomicInteger(); } @Override @@ -123,12 +123,7 @@ protected Pool getThreadLocalPool() { Class packetClass = ClassUtils.unsafeNNCast(getClass()); return LOCAL_POOLS .get() - .computeIfAbsent(packetClass, PoolFactory::newConcurrentStampedLockReusablePool); - } - - @Override - public void reuse() { - this.pool = getThreadLocalPool(); + .computeIfAbsent(packetClass, PoolFactory::newLockBasePool); } /** @@ -190,7 +185,7 @@ public final void decreaseSends() { @Override public void decreaseSends(int count) { - counter.subAndGet(count); + counter.accumulateAndGet(count, (left, right) -> left - right); } @Override diff --git a/rlib-network/src/test/java/javasabr/rlib/network/StringNetworkTest.java b/rlib-network/src/test/java/javasabr/rlib/network/StringNetworkTest.java index 80758a2c..eb02065f 100644 --- a/rlib-network/src/test/java/javasabr/rlib/network/StringNetworkTest.java +++ b/rlib-network/src/test/java/javasabr/rlib/network/StringNetworkTest.java @@ -12,8 +12,8 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.IntStream; -import javasabr.rlib.common.concurrent.atomic.ReusableAtomicInteger; import javasabr.rlib.common.util.ObjectUtils; import javasabr.rlib.common.util.StringUtils; import javasabr.rlib.logger.api.Logger; @@ -251,9 +251,9 @@ void testServerWithMultiplyClients() { var counter = new CountDownLatch(clientCount * packetsPerClient); var minMessageLength = 10; var maxMessageLength = (int) (DEFAULT_SERVER.getReadBufferSize() * 1.5); - var sentPacketsToServer = new ReusableAtomicInteger(); - var receivedPacketsOnServer = new ReusableAtomicInteger(); - var receivedPacketsOnClients = new ReusableAtomicInteger(); + var sentPacketsToServer = new AtomicInteger(); + var receivedPacketsOnServer = new AtomicInteger(); + var receivedPacketsOnClients = new AtomicInteger(); var serverNetwork = newStringDataServerNetwork(serverConfig, serverAllocator); var serverAddress = serverNetwork.start(); @@ -310,9 +310,9 @@ void testServerWithMultiplyClientsUsingOldApi() { var counter = new CountDownLatch(clientCount * packetsPerClient); var minMessageLength = 10; var maxMessageLength = (int) (DEFAULT_SERVER.getReadBufferSize() * 1.5); - var sentPacketsToServer = new ReusableAtomicInteger(); - var receivedPacketsOnServer = new ReusableAtomicInteger(); - var receivedPacketsOnClients = new ReusableAtomicInteger(); + var sentPacketsToServer = new AtomicInteger(); + var receivedPacketsOnServer = new AtomicInteger(); + var receivedPacketsOnClients = new AtomicInteger(); var connectedClients = new CountDownLatch(clientCount); serverNetwork.onAccept(connection -> { diff --git a/rlib-reference/build.gradle b/rlib-reference/build.gradle new file mode 100644 index 00000000..7a1f495a --- /dev/null +++ b/rlib-reference/build.gradle @@ -0,0 +1,6 @@ + +dependencies { + compileOnly projects.rlibReusable + testImplementation projects.rlibLoggerImpl + testImplementation projects.rlibReusable +} \ No newline at end of file diff --git a/rlib-reference/src/main/java/javasabr/rlib/reference/AbstractReference.java b/rlib-reference/src/main/java/javasabr/rlib/reference/AbstractReference.java new file mode 100644 index 00000000..8a4a9dbe --- /dev/null +++ b/rlib-reference/src/main/java/javasabr/rlib/reference/AbstractReference.java @@ -0,0 +1,6 @@ +package javasabr.rlib.reference; + +/** + * @author JavaSaBr + */ +public abstract class AbstractReference implements Reference {} diff --git a/rlib-reference/src/main/java/javasabr/rlib/reference/ByteReference.java b/rlib-reference/src/main/java/javasabr/rlib/reference/ByteReference.java new file mode 100644 index 00000000..3ce4b191 --- /dev/null +++ b/rlib-reference/src/main/java/javasabr/rlib/reference/ByteReference.java @@ -0,0 +1,15 @@ +package javasabr.rlib.reference; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * @author JavaSaBr + */ +@Data +@AllArgsConstructor +@Accessors(fluent = true, chain = false) +public class ByteReference extends AbstractReference { + private byte value; +} diff --git a/rlib-reference/src/main/java/javasabr/rlib/reference/CharReference.java b/rlib-reference/src/main/java/javasabr/rlib/reference/CharReference.java new file mode 100644 index 00000000..72b32c91 --- /dev/null +++ b/rlib-reference/src/main/java/javasabr/rlib/reference/CharReference.java @@ -0,0 +1,15 @@ +package javasabr.rlib.reference; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * @author JavaSaBr + */ +@Data +@AllArgsConstructor +@Accessors(fluent = true, chain = false) +public class CharReference extends AbstractReference { + private char value; +} diff --git a/rlib-reference/src/main/java/javasabr/rlib/reference/DoubleReference.java b/rlib-reference/src/main/java/javasabr/rlib/reference/DoubleReference.java new file mode 100644 index 00000000..f2e37245 --- /dev/null +++ b/rlib-reference/src/main/java/javasabr/rlib/reference/DoubleReference.java @@ -0,0 +1,15 @@ +package javasabr.rlib.reference; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * @author JavaSaBr + */ +@Data +@AllArgsConstructor +@Accessors(fluent = true, chain = false) +public class DoubleReference extends AbstractReference { + private double value; +} diff --git a/rlib-reference/src/main/java/javasabr/rlib/reference/FloatReference.java b/rlib-reference/src/main/java/javasabr/rlib/reference/FloatReference.java new file mode 100644 index 00000000..d116fcd6 --- /dev/null +++ b/rlib-reference/src/main/java/javasabr/rlib/reference/FloatReference.java @@ -0,0 +1,15 @@ +package javasabr.rlib.reference; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * @author JavaSaBr + */ +@Data +@AllArgsConstructor +@Accessors(fluent = true, chain = false) +public class FloatReference extends AbstractReference { + private float value; +} diff --git a/rlib-reference/src/main/java/javasabr/rlib/reference/IntReference.java b/rlib-reference/src/main/java/javasabr/rlib/reference/IntReference.java new file mode 100644 index 00000000..c53af231 --- /dev/null +++ b/rlib-reference/src/main/java/javasabr/rlib/reference/IntReference.java @@ -0,0 +1,15 @@ +package javasabr.rlib.reference; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * @author JavaSaBr + */ +@Data +@AllArgsConstructor +@Accessors(fluent = true, chain = false) +public class IntReference extends AbstractReference { + private int value; +} diff --git a/rlib-reference/src/main/java/javasabr/rlib/reference/LongReference.java b/rlib-reference/src/main/java/javasabr/rlib/reference/LongReference.java new file mode 100644 index 00000000..05be2fd4 --- /dev/null +++ b/rlib-reference/src/main/java/javasabr/rlib/reference/LongReference.java @@ -0,0 +1,15 @@ +package javasabr.rlib.reference; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * @author JavaSaBr + */ +@Data +@AllArgsConstructor +@Accessors(fluent = true, chain = false) +public class LongReference extends AbstractReference { + private long value; +} diff --git a/rlib-reference/src/main/java/javasabr/rlib/reference/ObjectReference.java b/rlib-reference/src/main/java/javasabr/rlib/reference/ObjectReference.java new file mode 100644 index 00000000..cd11376f --- /dev/null +++ b/rlib-reference/src/main/java/javasabr/rlib/reference/ObjectReference.java @@ -0,0 +1,19 @@ +package javasabr.rlib.reference; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.experimental.Accessors; +import org.jspecify.annotations.Nullable; + +/** + * @author JavaSaBr + */ + +@Data +@AllArgsConstructor +@Accessors(fluent = true, chain = false) +public class ObjectReference extends AbstractReference { + + @Nullable + private T value; +} diff --git a/rlib-reference/src/main/java/javasabr/rlib/reference/Reference.java b/rlib-reference/src/main/java/javasabr/rlib/reference/Reference.java new file mode 100644 index 00000000..0f32f284 --- /dev/null +++ b/rlib-reference/src/main/java/javasabr/rlib/reference/Reference.java @@ -0,0 +1,8 @@ +package javasabr.rlib.reference; + +/** + * The interface to implement a reference. + * + * @author JavaSaBr + */ +public interface Reference {} diff --git a/rlib-reference/src/main/java/javasabr/rlib/reference/ReferenceFactory.java b/rlib-reference/src/main/java/javasabr/rlib/reference/ReferenceFactory.java new file mode 100644 index 00000000..0680a15e --- /dev/null +++ b/rlib-reference/src/main/java/javasabr/rlib/reference/ReferenceFactory.java @@ -0,0 +1,151 @@ +package javasabr.rlib.reference; + +import javasabr.rlib.reusable.pool.PoolFactory; +import javasabr.rlib.reusable.pool.ReusablePool; +import lombok.experimental.UtilityClass; +import org.jspecify.annotations.Nullable; + +/** + * @author JavaSaBr + */ +@UtilityClass +public final class ReferenceFactory { + + private static final ThreadLocal> TL_BYTE_REF_POOL = + ThreadLocal.withInitial(() -> PoolFactory.newReusablePool( + TLByteReference.class)); + private static final ThreadLocal> TL_SHORT_REF_POOL = + ThreadLocal.withInitial(() -> PoolFactory.newReusablePool( + TLShortReference.class)); + private static final ThreadLocal> TL_CHAR_REF_POOL = + ThreadLocal.withInitial(() -> PoolFactory.newReusablePool( + TLCharReference.class)); + private static final ThreadLocal> TL_INT_REF_POOL = + ThreadLocal.withInitial(() -> PoolFactory.newReusablePool( + TLIntReference.class)); + private static final ThreadLocal> TL_LONG_REF_POOL = + ThreadLocal.withInitial(() -> PoolFactory.newReusablePool( + TLLongReference.class)); + private static final ThreadLocal> TL_FLOAT_REF_POOL = + ThreadLocal.withInitial(() -> PoolFactory.newReusablePool( + TLFloatReference.class)); + private static final ThreadLocal> TL_DOUBLE_REF_POOL = + ThreadLocal.withInitial(() -> PoolFactory.newReusablePool( + TLDoubleReference.class)); + private static final ThreadLocal> TL_OBJECT_REF_POOL = + ThreadLocal.withInitial(() -> PoolFactory.newReusablePool( + TLObjectReference.class)); + + public static ByteReference byteRef(byte value) { + return new ByteReference(value); + } + + public static TLByteReference threadLocalByteRef(byte value) { + var ref = TL_BYTE_REF_POOL.get().take(TLByteReference::new); + ref.value(value); + return ref; + } + + public static ShortReference newShortRef(short value) { + return new ShortReference(value); + } + + public static TLShortReference threadLocalShortRef(short value) { + var ref = TL_SHORT_REF_POOL.get().take(TLShortReference::new); + ref.value(value); + return ref; + } + + public static CharReference charRef(char value) { + return new CharReference(value); + } + + public static TLCharReference threadLocalCharRef(char value) { + var ref = TL_CHAR_REF_POOL.get().take(TLCharReference::new); + ref.value(value); + return ref; + } + + public static IntReference intRef(int value) { + return new IntReference(value); + } + + public static TLIntReference threadLocalIntRef(int value) { + var ref = TL_INT_REF_POOL.get().take(TLIntReference::new); + ref.value(value); + return ref; + } + + public static LongReference longRef(long value) { + return new LongReference(value); + } + + public static TLLongReference threadLocalLongRef(long value) { + var ref = TL_LONG_REF_POOL.get().take(TLLongReference::new); + ref.value(value); + return ref; + } + + public static FloatReference floatRef(float value) { + return new FloatReference(value); + } + + public static TLFloatReference threadLocalFloatRef(float value) { + var ref = TL_FLOAT_REF_POOL.get().take(TLFloatReference::new); + ref.value(value); + return ref; + } + + public static DoubleReference doubleRef(double value) { + return new DoubleReference(value); + } + + public static TLDoubleReference threadLocalDoubleRef(double value) { + var ref = TL_DOUBLE_REF_POOL.get().take(TLDoubleReference::new); + ref.value(value); + return ref; + } + + public static ObjectReference objRef(@Nullable T value) { + return new ObjectReference<>(value); + } + + public static TLObjectReference threadLocalObjRef(@Nullable T value) { + @SuppressWarnings("unchecked") + TLObjectReference ref = TL_OBJECT_REF_POOL.get().take(TLObjectReference::new); + ref.value(value); + return ref; + } + + static void release(TLByteReference ref) { + TL_BYTE_REF_POOL.get().put(ref); + } + + static void release(TLShortReference ref) { + TL_SHORT_REF_POOL.get().put(ref); + } + + static void release(TLCharReference ref) { + TL_CHAR_REF_POOL.get().put(ref); + } + + static void release(TLIntReference ref) { + TL_INT_REF_POOL.get().put(ref); + } + + static void release(TLLongReference ref) { + TL_LONG_REF_POOL.get().put(ref); + } + + static void release(TLFloatReference ref) { + TL_FLOAT_REF_POOL.get().put(ref); + } + + static void release(TLDoubleReference ref) { + TL_DOUBLE_REF_POOL.get().put(ref); + } + + static void release(TLObjectReference ref) { + TL_OBJECT_REF_POOL.get().put(ref); + } +} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/ShortReference.java b/rlib-reference/src/main/java/javasabr/rlib/reference/ShortReference.java similarity index 53% rename from rlib-common/src/main/java/javasabr/rlib/common/util/ref/ShortReference.java rename to rlib-reference/src/main/java/javasabr/rlib/reference/ShortReference.java index b152ea53..6d62522a 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ref/ShortReference.java +++ b/rlib-reference/src/main/java/javasabr/rlib/reference/ShortReference.java @@ -1,32 +1,20 @@ -package javasabr.rlib.common.util.ref; +package javasabr.rlib.reference; import lombok.AllArgsConstructor; +import lombok.Data; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; +import lombok.experimental.Accessors; /** - * The reference to short value. - * * @author JavaSaBr */ -@Getter -@Setter -@ToString -@NoArgsConstructor +@Data @AllArgsConstructor -@EqualsAndHashCode(callSuper = false) +@Accessors(fluent = true, chain = false) public class ShortReference extends AbstractReference { - - /** - * The value of this reference. - */ private short value; - - @Override - public void free() { - this.value = 0; - } } diff --git a/rlib-reference/src/main/java/javasabr/rlib/reference/TLByteReference.java b/rlib-reference/src/main/java/javasabr/rlib/reference/TLByteReference.java new file mode 100644 index 00000000..eba42cc5 --- /dev/null +++ b/rlib-reference/src/main/java/javasabr/rlib/reference/TLByteReference.java @@ -0,0 +1,22 @@ +package javasabr.rlib.reference; + +import javasabr.rlib.reusable.BoundReusable; + +/** + * @author JavaSaBr + */ +final class TLByteReference extends ByteReference implements BoundReusable { + + public TLByteReference() { + super((byte) 0); + } + + public TLByteReference(byte value) { + super(value); + } + + @Override + public void release() { + ReferenceFactory.release(this); + } +} diff --git a/rlib-reference/src/main/java/javasabr/rlib/reference/TLCharReference.java b/rlib-reference/src/main/java/javasabr/rlib/reference/TLCharReference.java new file mode 100644 index 00000000..2b86e59c --- /dev/null +++ b/rlib-reference/src/main/java/javasabr/rlib/reference/TLCharReference.java @@ -0,0 +1,22 @@ +package javasabr.rlib.reference; + +import javasabr.rlib.reusable.BoundReusable; + +/** + * @author JavaSaBr + */ +final class TLCharReference extends CharReference implements BoundReusable { + + public TLCharReference() { + super('\0'); + } + + public TLCharReference(char value) { + super(value); + } + + @Override + public void release() { + ReferenceFactory.release(this); + } +} diff --git a/rlib-reference/src/main/java/javasabr/rlib/reference/TLDoubleReference.java b/rlib-reference/src/main/java/javasabr/rlib/reference/TLDoubleReference.java new file mode 100644 index 00000000..4d5b1a75 --- /dev/null +++ b/rlib-reference/src/main/java/javasabr/rlib/reference/TLDoubleReference.java @@ -0,0 +1,22 @@ +package javasabr.rlib.reference; + +import javasabr.rlib.reusable.BoundReusable; + +/** + * @author JavaSaBr + */ +final class TLDoubleReference extends DoubleReference implements BoundReusable { + + public TLDoubleReference() { + super(0d); + } + + public TLDoubleReference(double value) { + super(value); + } + + @Override + public void release() { + ReferenceFactory.release(this); + } +} diff --git a/rlib-reference/src/main/java/javasabr/rlib/reference/TLFloatReference.java b/rlib-reference/src/main/java/javasabr/rlib/reference/TLFloatReference.java new file mode 100644 index 00000000..03d0668f --- /dev/null +++ b/rlib-reference/src/main/java/javasabr/rlib/reference/TLFloatReference.java @@ -0,0 +1,22 @@ +package javasabr.rlib.reference; + +import javasabr.rlib.reusable.BoundReusable; + +/** + * @author JavaSaBr + */ +final class TLFloatReference extends FloatReference implements BoundReusable { + + public TLFloatReference() { + super(0f); + } + + public TLFloatReference(float value) { + super(value); + } + + @Override + public void release() { + ReferenceFactory.release(this); + } +} diff --git a/rlib-reference/src/main/java/javasabr/rlib/reference/TLIntReference.java b/rlib-reference/src/main/java/javasabr/rlib/reference/TLIntReference.java new file mode 100644 index 00000000..e3e11e3d --- /dev/null +++ b/rlib-reference/src/main/java/javasabr/rlib/reference/TLIntReference.java @@ -0,0 +1,22 @@ +package javasabr.rlib.reference; + +import javasabr.rlib.reusable.BoundReusable; + +/** + * @author JavaSaBr + */ +final class TLIntReference extends IntReference implements BoundReusable { + + public TLIntReference() { + super(0); + } + + public TLIntReference(int value) { + super(value); + } + + @Override + public void release() { + ReferenceFactory.release(this); + } +} diff --git a/rlib-reference/src/main/java/javasabr/rlib/reference/TLLongReference.java b/rlib-reference/src/main/java/javasabr/rlib/reference/TLLongReference.java new file mode 100644 index 00000000..d3d6ec0d --- /dev/null +++ b/rlib-reference/src/main/java/javasabr/rlib/reference/TLLongReference.java @@ -0,0 +1,22 @@ +package javasabr.rlib.reference; + +import javasabr.rlib.reusable.BoundReusable; + +/** + * @author JavaSaBr + */ +final class TLLongReference extends LongReference implements BoundReusable { + + public TLLongReference() { + super(0); + } + + public TLLongReference(long value) { + super(value); + } + + @Override + public void release() { + ReferenceFactory.release(this); + } +} diff --git a/rlib-reference/src/main/java/javasabr/rlib/reference/TLObjectReference.java b/rlib-reference/src/main/java/javasabr/rlib/reference/TLObjectReference.java new file mode 100644 index 00000000..11d868bf --- /dev/null +++ b/rlib-reference/src/main/java/javasabr/rlib/reference/TLObjectReference.java @@ -0,0 +1,23 @@ +package javasabr.rlib.reference; + +import javasabr.rlib.reusable.BoundReusable; +import org.jspecify.annotations.Nullable; + +/** + * @author JavaSaBr + */ +final class TLObjectReference extends ObjectReference implements BoundReusable { + + public TLObjectReference() { + super(null); + } + + public TLObjectReference(@Nullable T value) { + super(value); + } + + @Override + public void release() { + ReferenceFactory.release(this); + } +} diff --git a/rlib-reference/src/main/java/javasabr/rlib/reference/TLShortReference.java b/rlib-reference/src/main/java/javasabr/rlib/reference/TLShortReference.java new file mode 100644 index 00000000..62c725a4 --- /dev/null +++ b/rlib-reference/src/main/java/javasabr/rlib/reference/TLShortReference.java @@ -0,0 +1,22 @@ +package javasabr.rlib.reference; + +import javasabr.rlib.reusable.BoundReusable; + +/** + * @author JavaSaBr + */ +final class TLShortReference extends ShortReference implements BoundReusable { + + public TLShortReference() { + super((short) 0); + } + + public TLShortReference(short value) { + super(value); + } + + @Override + public void release() { + ReferenceFactory.release(this); + } +} diff --git a/rlib-reference/src/main/java/javasabr/rlib/reference/package-info.java b/rlib-reference/src/main/java/javasabr/rlib/reference/package-info.java new file mode 100644 index 00000000..832da1d5 --- /dev/null +++ b/rlib-reference/src/main/java/javasabr/rlib/reference/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package javasabr.rlib.reference; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/rlib-reference/src/test/java/javasabr/rlib/reference/ReferencesTest.java b/rlib-reference/src/test/java/javasabr/rlib/reference/ReferencesTest.java new file mode 100644 index 00000000..94d04b95 --- /dev/null +++ b/rlib-reference/src/test/java/javasabr/rlib/reference/ReferencesTest.java @@ -0,0 +1,99 @@ +package javasabr.rlib.reference; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +/** + * @author JavaSaBr + */ +public class ReferencesTest { + + @Test + void shouldReferencesWork() { + + var byteRef = ReferenceFactory.byteRef((byte) 5); + var charRef = ReferenceFactory.charRef('T'); + var doubleRef = ReferenceFactory.doubleRef(1.5D); + var floatRef = ReferenceFactory.floatRef(2.5F); + var intRef = ReferenceFactory.intRef(5); + var longRef = ReferenceFactory.longRef(7L); + var objRef = ReferenceFactory.objRef("Val"); + var shortRef = ReferenceFactory.newShortRef((short) 7); + + Assertions.assertEquals(5, byteRef.value()); + Assertions.assertEquals('T', charRef.value()); + Assertions.assertEquals(1.5D, doubleRef.value()); + Assertions.assertEquals(2.5F, floatRef.value()); + Assertions.assertEquals(5, intRef.value()); + Assertions.assertEquals(7L, longRef.value()); + Assertions.assertEquals("Val", objRef.value()); + Assertions.assertEquals(7, shortRef.value()); + } + + @Test + void shouldTLReferencesWork() { + + var byteRef = ReferenceFactory.threadLocalByteRef((byte) 3); + var charRef = ReferenceFactory.threadLocalCharRef('d'); + var doubleRef = ReferenceFactory.threadLocalDoubleRef(3.5D); + var floatRef = ReferenceFactory.threadLocalFloatRef(1.5F); + var intRef = ReferenceFactory.threadLocalIntRef(7); + var longRef = ReferenceFactory.threadLocalLongRef(4L); + var objRef = ReferenceFactory.threadLocalObjRef("Val3"); + var shortRef = ReferenceFactory.threadLocalShortRef((short) 2); + + Assertions.assertEquals(3, byteRef.value()); + Assertions.assertEquals('d', charRef.value()); + Assertions.assertEquals(3.5D, doubleRef.value()); + Assertions.assertEquals(1.5F, floatRef.value()); + Assertions.assertEquals(7, intRef.value()); + Assertions.assertEquals(4L, longRef.value()); + Assertions.assertEquals("Val3", objRef.value()); + Assertions.assertEquals(2, shortRef.value()); + + byteRef.release(); + charRef.release(); + doubleRef.release(); + floatRef.release(); + intRef.release(); + longRef.release(); + objRef.release(); + shortRef.release(); + + var byteRef2 = ReferenceFactory.threadLocalByteRef((byte) 3); + var charRef2 = ReferenceFactory.threadLocalCharRef('d'); + var doubleRef2 = ReferenceFactory.threadLocalDoubleRef(3.5D); + var floatRef2 = ReferenceFactory.threadLocalFloatRef(1.5F); + var intRef2 = ReferenceFactory.threadLocalIntRef(7); + var longRef2 = ReferenceFactory.threadLocalLongRef(4L); + var objRef2 = ReferenceFactory.threadLocalObjRef("Val3"); + var shortRef2 = ReferenceFactory.threadLocalShortRef((short) 2); + + Assertions.assertSame(byteRef, byteRef2); + Assertions.assertSame(charRef, charRef2); + Assertions.assertSame(doubleRef, doubleRef2); + Assertions.assertSame(floatRef, floatRef2); + Assertions.assertSame(intRef, intRef2); + Assertions.assertSame(longRef, longRef2); + Assertions.assertSame(objRef, objRef2); + Assertions.assertSame(shortRef, shortRef2); + + var byteRef3 = ReferenceFactory.threadLocalByteRef((byte) 3); + var charRef3 = ReferenceFactory.threadLocalCharRef('d'); + var doubleRef3 = ReferenceFactory.threadLocalDoubleRef(3.5D); + var floatRef3 = ReferenceFactory.threadLocalFloatRef(1.5F); + var intRef3 = ReferenceFactory.threadLocalIntRef(7); + var longRef3 = ReferenceFactory.threadLocalLongRef(4L); + var objRef3 = ReferenceFactory.threadLocalObjRef("Val3"); + var shortRef3 = ReferenceFactory.threadLocalShortRef((short) 2); + + Assertions.assertNotSame(byteRef, byteRef3); + Assertions.assertNotSame(charRef, charRef3); + Assertions.assertNotSame(doubleRef, doubleRef3); + Assertions.assertNotSame(floatRef, floatRef3); + Assertions.assertNotSame(intRef, intRef3); + Assertions.assertNotSame(longRef, longRef3); + Assertions.assertNotSame(objRef, objRef3); + Assertions.assertNotSame(shortRef, shortRef3); + } +} diff --git a/rlib-reusable/build.gradle b/rlib-reusable/build.gradle new file mode 100644 index 00000000..db4c8ef6 --- /dev/null +++ b/rlib-reusable/build.gradle @@ -0,0 +1,5 @@ + +dependencies { + api projects.rlibCollections + testImplementation projects.rlibLoggerImpl +} \ No newline at end of file diff --git a/rlib-reusable/src/main/java/javasabr/rlib/reusable/BoundReusable.java b/rlib-reusable/src/main/java/javasabr/rlib/reusable/BoundReusable.java new file mode 100644 index 00000000..fa7ee5c4 --- /dev/null +++ b/rlib-reusable/src/main/java/javasabr/rlib/reusable/BoundReusable.java @@ -0,0 +1,6 @@ +package javasabr.rlib.reusable; + +public interface BoundReusable extends Reusable { + + void release(); +} diff --git a/rlib-reusable/src/main/java/javasabr/rlib/reusable/Reusable.java b/rlib-reusable/src/main/java/javasabr/rlib/reusable/Reusable.java new file mode 100644 index 00000000..b953519e --- /dev/null +++ b/rlib-reusable/src/main/java/javasabr/rlib/reusable/Reusable.java @@ -0,0 +1,17 @@ +package javasabr.rlib.reusable; + +/** + * @author JavaSaBr + */ +public interface Reusable extends AutoCloseable { + + /** + * Cleanup this object + */ + default void cleanup() {} + + @Override + default void close() { + cleanup(); + } +} diff --git a/rlib-reusable/src/main/java/javasabr/rlib/reusable/package-info.java b/rlib-reusable/src/main/java/javasabr/rlib/reusable/package-info.java new file mode 100644 index 00000000..30091702 --- /dev/null +++ b/rlib-reusable/src/main/java/javasabr/rlib/reusable/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package javasabr.rlib.reusable; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/Pool.java b/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/Pool.java new file mode 100644 index 00000000..31cd6d85 --- /dev/null +++ b/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/Pool.java @@ -0,0 +1,50 @@ +package javasabr.rlib.reusable.pool; + +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.function.LongFunction; +import java.util.function.Supplier; +import javasabr.rlib.functions.ObjectLongFunction; +import org.jspecify.annotations.Nullable; + +/** + * @author JavaSaBr + */ +public interface Pool { + + void put(E object); + + @Nullable + E take(); + + default E take(Supplier factory) { + E take = take(); + return take != null ? take : factory.get(); + } + + default E take(T arg1, Function factory) { + E take = take(); + return take != null ? take : factory.apply(arg1); + } + + default E take(long arg1, LongFunction factory) { + E take = take(); + return take != null ? take : factory.apply(arg1); + } + + default E take( + F arg1, + long arg2, + ObjectLongFunction factory) { + E take = take(); + return take != null ? take : factory.apply(arg1, arg2); + } + + default E take( + F arg1, + S arg2, + BiFunction factory) { + E take = take(); + return take != null ? take : factory.apply(arg1, arg2); + } +} diff --git a/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/PoolFactory.java b/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/PoolFactory.java new file mode 100644 index 00000000..3ca59c25 --- /dev/null +++ b/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/PoolFactory.java @@ -0,0 +1,21 @@ +package javasabr.rlib.reusable.pool; + +import javasabr.rlib.reusable.Reusable; +import javasabr.rlib.reusable.pool.impl.ArrayBasedPool; +import javasabr.rlib.reusable.pool.impl.ArrayBasedReusablePool; +import javasabr.rlib.reusable.pool.impl.LockableArrayBasePool; + +public class PoolFactory { + + public static Pool newPool(Class type) { + return new ArrayBasedPool<>(type); + } + + public static ReusablePool newReusablePool(Class type) { + return new ArrayBasedReusablePool<>(type); + } + + public static Pool newLockBasePool(Class type) { + return new LockableArrayBasePool<>(type); + } +} diff --git a/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/ReusablePool.java b/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/ReusablePool.java new file mode 100644 index 00000000..13986e29 --- /dev/null +++ b/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/ReusablePool.java @@ -0,0 +1,8 @@ +package javasabr.rlib.reusable.pool; + +import javasabr.rlib.reusable.Reusable; + +/** + * @author JavaSaBr + */ +public interface ReusablePool extends Pool {} diff --git a/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/impl/ArrayBasedPool.java b/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/impl/ArrayBasedPool.java new file mode 100644 index 00000000..857e5572 --- /dev/null +++ b/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/impl/ArrayBasedPool.java @@ -0,0 +1,42 @@ +package javasabr.rlib.reusable.pool.impl; + +import javasabr.rlib.collections.array.ArrayFactory; +import javasabr.rlib.collections.array.MutableArray; +import javasabr.rlib.reusable.pool.Pool; +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; +import org.jspecify.annotations.Nullable; + +/** + * @author JavaSaBr + */ +@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) +public class ArrayBasedPool implements Pool { + + MutableArray pool; + + public ArrayBasedPool(Class type) { + this.pool = ArrayFactory.mutableArray(type); + } + + @Override + public void put(E object) { + pool.add(object); + } + + @Nullable + @Override + public E take() { + + if (pool.isEmpty()) { + return null; + } + + return pool.remove(pool.size() - 1); + } + + @Override + public String toString() { + return pool.toString(); + } +} diff --git a/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/impl/ArrayBasedReusablePool.java b/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/impl/ArrayBasedReusablePool.java new file mode 100644 index 00000000..d8592b25 --- /dev/null +++ b/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/impl/ArrayBasedReusablePool.java @@ -0,0 +1,20 @@ +package javasabr.rlib.reusable.pool.impl; + +import javasabr.rlib.reusable.Reusable; +import javasabr.rlib.reusable.pool.ReusablePool; + +/** + * @author JavaSaBr + */ +public class ArrayBasedReusablePool extends ArrayBasedPool + implements ReusablePool { + + public ArrayBasedReusablePool(Class type) { + super(type); + } + + public void put(E object) { + object.cleanup(); + super.put(object); + } +} diff --git a/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/impl/LockableArrayBasePool.java b/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/impl/LockableArrayBasePool.java new file mode 100644 index 00000000..13591d48 --- /dev/null +++ b/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/impl/LockableArrayBasePool.java @@ -0,0 +1,49 @@ +package javasabr.rlib.reusable.pool.impl; + +import javasabr.rlib.collections.array.ArrayFactory; +import javasabr.rlib.collections.array.LockableMutableArray; +import javasabr.rlib.reusable.pool.Pool; +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; +import org.jspecify.annotations.Nullable; + +@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) +public class LockableArrayBasePool implements Pool { + + LockableMutableArray pool; + + public LockableArrayBasePool(Class type) { + this.pool = ArrayFactory.stampedLockBasedArray(type); + } + + @Override + public void put(E object) { + long stamp = pool.writeLock(); + try { + pool.add(object); + } finally { + pool.writeUnlock(stamp); + } + } + + @Nullable + @Override + public E take() { + + if (pool.isEmpty()) { + return null; + } + + long stamp = pool.writeLock(); + try { + + if (pool.isEmpty()) { + return null; + } + + return pool.remove(pool.size() - 1); + } finally { + pool.writeUnlock(stamp); + } + } +} diff --git a/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/impl/package-info.java b/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/impl/package-info.java new file mode 100644 index 00000000..b18424ec --- /dev/null +++ b/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/impl/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package javasabr.rlib.reusable.pool.impl; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/package-info.java b/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/package-info.java new file mode 100644 index 00000000..29d8ab7a --- /dev/null +++ b/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package javasabr.rlib.reusable.pool; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 264f3ee8..493c2c5b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -16,4 +16,6 @@ include ':rlib-classpath' include ':rlib-compiler' include ':rlib-io' include ':rlib-collections' -include ':rlib-functions' \ No newline at end of file +include ':rlib-functions' +include ':rlib-reusable' +include ':rlib-reference' \ No newline at end of file