diff --git a/src/main/java/net/minestom/server/acquirable/Acquirable.java b/src/main/java/net/minestom/server/acquirable/Acquirable.java index 29e4963fa..4c781b04c 100644 --- a/src/main/java/net/minestom/server/acquirable/Acquirable.java +++ b/src/main/java/net/minestom/server/acquirable/Acquirable.java @@ -54,6 +54,15 @@ public interface Acquirable { } } + default @NotNull Optional local() { + final Thread currentThread = Thread.currentThread(); + final TickThread tickThread = getHandler().getTickThread(); + if (Objects.equals(currentThread, tickThread)) { + return Optional.of(unwrap()); + } + return Optional.empty(); + } + default void sync(@NotNull Consumer consumer) { var acquired = lock(); consumer.accept(acquired.get()); @@ -65,15 +74,6 @@ public interface Acquirable { AsyncUtils.runAsync(() -> sync(consumer)); } - default @NotNull Optional local() { - final Thread currentThread = Thread.currentThread(); - final TickThread tickThread = getHandler().getTickThread(); - if (Objects.equals(currentThread, tickThread)) { - return Optional.of(unwrap()); - } - return Optional.empty(); - } - /** * Unwrap the contained object unsafely. *

diff --git a/src/main/java/net/minestom/server/acquirable/AcquirableCollection.java b/src/main/java/net/minestom/server/acquirable/AcquirableCollection.java index 813c17047..73d9d1222 100644 --- a/src/main/java/net/minestom/server/acquirable/AcquirableCollection.java +++ b/src/main/java/net/minestom/server/acquirable/AcquirableCollection.java @@ -1,19 +1,98 @@ package net.minestom.server.acquirable; -import net.minestom.server.utils.collection.CollectionView; +import net.minestom.server.utils.async.AsyncUtils; import org.jetbrains.annotations.NotNull; import java.util.Collection; +import java.util.Iterator; +import java.util.function.Consumer; +import java.util.stream.Stream; -public class AcquirableCollection extends CollectionView> { +public class AcquirableCollection implements Collection> { - private final Collection> acquirableEntityCollection; + private final Collection> acquirableCollection; - public AcquirableCollection(@NotNull Collection> acquirableEntityCollection) { - super(acquirableEntityCollection, - null, - //Entity::getAcquirable, - acquirableEntity -> (E) acquirableEntity.unwrap()); - this.acquirableEntityCollection = acquirableEntityCollection; + public AcquirableCollection(Collection> acquirableCollection) { + this.acquirableCollection = acquirableCollection; + } + + public void forEachSync(@NotNull Consumer consumer) { + Acquisition.acquireForEach(acquirableCollection, consumer); + } + + public void forEachAsync(@NotNull Consumer consumer) { + AsyncUtils.runAsync(() -> forEachSync(consumer)); + } + + public @NotNull Stream unwrap() { + return acquirableCollection.stream().map(Acquirable::unwrap); + } + + @Override + public int size() { + return acquirableCollection.size(); + } + + @Override + public boolean isEmpty() { + return acquirableCollection.isEmpty(); + } + + @Override + public boolean contains(Object o) { + return acquirableCollection.contains(o); + } + + @NotNull + @Override + public Iterator> iterator() { + return acquirableCollection.iterator(); + } + + @NotNull + @Override + public Object[] toArray() { + return acquirableCollection.toArray(); + } + + @NotNull + @Override + public T[] toArray(@NotNull T[] a) { + return acquirableCollection.toArray(a); + } + + @Override + public boolean add(Acquirable eAcquirable) { + return acquirableCollection.add(eAcquirable); + } + + @Override + public boolean remove(Object o) { + return acquirableCollection.remove(o); + } + + @Override + public boolean containsAll(@NotNull Collection c) { + return acquirableCollection.containsAll(c); + } + + @Override + public boolean addAll(@NotNull Collection> c) { + return acquirableCollection.addAll(c); + } + + @Override + public boolean removeAll(@NotNull Collection c) { + return acquirableCollection.removeAll(c); + } + + @Override + public boolean retainAll(@NotNull Collection c) { + return acquirableCollection.retainAll(c); + } + + @Override + public void clear() { + this.acquirableCollection.clear(); } } diff --git a/src/main/java/net/minestom/server/acquirable/Acquisition.java b/src/main/java/net/minestom/server/acquirable/Acquisition.java index 079eac007..8b2817c98 100644 --- a/src/main/java/net/minestom/server/acquirable/Acquisition.java +++ b/src/main/java/net/minestom/server/acquirable/Acquisition.java @@ -26,8 +26,8 @@ public final class Acquisition { * @param collection the collection to acquire * @param consumer the consumer called for each of the collection element */ - public static void acquireForEach(@NotNull Collection> collection, - @NotNull Consumer consumer) { + protected static void acquireForEach(@NotNull Collection> collection, + @NotNull Consumer consumer) { final Thread currentThread = Thread.currentThread(); var threadEntitiesMap = retrieveOptionalThreadMap(collection, currentThread, consumer); diff --git a/src/main/java/net/minestom/server/utils/collection/CollectionView.java b/src/main/java/net/minestom/server/utils/collection/CollectionView.java deleted file mode 100644 index cd5aeeb75..000000000 --- a/src/main/java/net/minestom/server/utils/collection/CollectionView.java +++ /dev/null @@ -1,170 +0,0 @@ -package net.minestom.server.utils.collection; - -import org.jetbrains.annotations.NotNull; - -import java.util.Collection; -import java.util.Iterator; -import java.util.function.Function; - -/** - * A CollectionView is a class which is mapped to another collection - * and convert every result using a given function. It is more efficient - * than filling a new collection every time, as long as the two types are interchangeable. - *

- * The view is not thread-safe. - * - * @param the type that the collection should return - * @param the type of the viewed collection - */ -public class CollectionView implements Collection { - - private final Collection collectionView; - private final Function toViewFunction; - private final Function toTypeFunction; - - public CollectionView(@NotNull Collection collectionView, - @NotNull Function toViewFunction, - @NotNull Function toTypeFunction) { - this.collectionView = collectionView; - this.toViewFunction = toViewFunction; - this.toTypeFunction = toTypeFunction; - } - - @Override - public int size() { - return collectionView.size(); - } - - @Override - public boolean isEmpty() { - return collectionView.isEmpty(); - } - - @Override - public boolean contains(Object o) { - try { - return collectionView.contains(toViewFunction.apply((E) o)); - } catch (ClassCastException e) { - return false; - } - } - - @NotNull - @Override - public Iterator iterator() { - return new IteratorView<>(collectionView.iterator(), toTypeFunction); - } - - @NotNull - @Override - public Object[] toArray() { - Object[] array = new Object[size()]; - - int i = 0; - for (E e : this) { - array[i++] = e; - } - - return array; - } - - @NotNull - @Override - public T1[] toArray(@NotNull T1[] a) { - int i = 0; - for (E e : this) { - a[i++] = (T1) e; - } - - return a; - } - - @Override - public boolean add(E e) { - return collectionView.add(toViewFunction.apply(e)); - } - - @Override - public boolean remove(Object o) { - try { - return collectionView.remove(toViewFunction.apply((E) o)); - } catch (ClassCastException e) { - return false; - } - } - - @Override - public boolean containsAll(@NotNull Collection c) { - for (Object e : c) { - if (!contains(e)) - return false; - } - - return true; - } - - @Override - public boolean addAll(@NotNull Collection c) { - boolean changed = false; - try { - for (Object e : c) { - if (add((E) e)) - changed = true; - } - } catch (ClassCastException ignored) { - } - - return changed; - } - - @Override - public boolean removeAll(@NotNull Collection c) { - boolean changed = false; - for (Object e : c) { - if (remove(e)) - changed = true; - } - return changed; - } - - @Override - public boolean retainAll(@NotNull Collection c) { - boolean changed = false; - for (Object e : c) { - if (!contains(e)) { - remove(e); - changed = true; - } - } - return changed; - } - - @Override - public void clear() { - this.collectionView.clear(); - } - - public static class IteratorView implements Iterator { - - private final Iterator iteratorView; - private final Function toTypeFunction; - - public IteratorView(Iterator iteratorView, - Function toTypeFunction) { - this.iteratorView = iteratorView; - this.toTypeFunction = toTypeFunction; - } - - @Override - public boolean hasNext() { - return iteratorView.hasNext(); - } - - @Override - public T next() { - final V viewElement = iteratorView.next(); - return toTypeFunction.apply(viewElement); - } - } - -} \ No newline at end of file