summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2024-10-06 23:09:48 +0800
committerruki <[email protected]>2024-10-06 23:10:23 +0800
commitd329532d12907f2f27f7c336ab0498700931317a (patch)
tree41e78734781742b345387d002991351de21ad4d7
parent6c973f55a3130fe62342e4ab06e992eac6ee3a80 (diff)
improve hashset
-rw-r--r--tests/modules/hashset/test.lua17
-rw-r--r--xmake/core/base/hashset.lua59
2 files changed, 74 insertions, 2 deletions
diff --git a/tests/modules/hashset/test.lua b/tests/modules/hashset/test.lua
new file mode 100644
index 000000000..a0df5a61d
--- /dev/null
+++ b/tests/modules/hashset/test.lua
@@ -0,0 +1,17 @@
+import("core.base.hashset")
+
+function test_hashset(t)
+ local h = hashset.of(1, 2, 3, 5, 5, 7, 1, 9, 4, 6, 8, 0)
+ t:require(h:size() == 10)
+ t:require_not(h:empty())
+ for item in h:items() do
+ t:require(h:has(item))
+ t:require_not(h:has(item + 10))
+ end
+ local prev = -1
+ for item in h:orderitems() do
+ t:require(item > prev)
+ prev = item
+ end
+end
+
diff --git a/xmake/core/base/hashset.lua b/xmake/core/base/hashset.lua
index 2a0449ad4..e6668180b 100644
--- a/xmake/core/base/hashset.lua
+++ b/xmake/core/base/hashset.lua
@@ -108,7 +108,62 @@ function hashset_impl:to_array()
return result
end
--- iterate keys of hashtable
+-- iterate items
+--
+-- @code
+-- for item in instance:items() do
+-- ...
+-- end
+-- @endcode
+--
+function hashset_impl:items()
+ return function (t, item)
+ local k, _ = next(t._DATA, item)
+ if k == hashset._NIL then
+ return nil
+ else
+ return k
+ end
+ end, self, nil
+end
+
+-- iterate order items
+--
+-- @code
+-- for item in instance:orderitems() do
+-- ...
+-- end
+-- @endcode
+--
+function hashset_impl:orderitems()
+ local orderkeys = table.orderkeys(self._DATA, function (a, b)
+ if a == hashset._NIL then
+ a = math.inf
+ end
+ if b == hashset._NIL then
+ b = math.inf
+ end
+ if type(a) == "table" then
+ a = tostring(a)
+ end
+ if type(b) == "table" then
+ b = tostring(b)
+ end
+ return a < b
+ end)
+ local i = 1
+ return function (t, k)
+ k = orderkeys[i]
+ i = i + 1
+ if k == hashset._NIL then
+ return nil
+ else
+ return k
+ end
+ end, self, nil
+end
+
+-- iterate keys (deprecated, please use items())
--
-- @code
-- for _, key in instance:keys() do
@@ -127,7 +182,7 @@ function hashset_impl:keys()
end, self, nil
end
--- order keys iterator
+-- iterate order keys (deprecated, please use orderitems())
--
-- @code
-- for _, key in instance:orderkeys() do