diff --git a/runelite-api/src/main/java/net/runelite/api/HashTable.java b/runelite-api/src/main/java/net/runelite/api/HashTable.java index 737e466a40..804d17d2ea 100644 --- a/runelite-api/src/main/java/net/runelite/api/HashTable.java +++ b/runelite-api/src/main/java/net/runelite/api/HashTable.java @@ -1,5 +1,7 @@ package net.runelite.api; +import java.util.Collection; + /** * A data structure that uses a hash function to compute an index into an * array of buckets from which node objects can be quickly obtained. @@ -13,4 +15,11 @@ public interface HashTable extends Iterable * @return the associated node */ T get(long value); + + /** + * Gets a collection of all nodes stored in this table. + * + * @return the nodes stored + */ + Collection getNodes(); } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSNodeHashTableMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSNodeHashTableMixin.java index c457087a84..dd67fb5a1f 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSNodeHashTableMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSNodeHashTableMixin.java @@ -1,8 +1,38 @@ package net.runelite.mixins; +import net.runelite.api.Node; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.rs.api.RSNodeHashTable; @Mixin(RSNodeHashTable.class) public abstract class RSNodeHashTableMixin implements RSNodeHashTable -{} +{ + @Inject + @Override + public Collection getNodes() + { + // Copied in RSWidgetMixin.getParentId to reduce allocations + List nodes = new ArrayList(); + + Node[] buckets = getBuckets(); + for (int i = 0; i < buckets.length; ++i) + { + Node node = buckets[i]; + + // It looks like the first node in the bucket is always + // a sentinel + Node cur = node.getNext(); + while (cur != node) + { + nodes.add(cur); + cur = cur.getNext(); + } + } + + return nodes; + } +}