summaryrefslogtreecommitdiff
path: root/xmake/core
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 /xmake/core
parent6c973f55a3130fe62342e4ab06e992eac6ee3a80 (diff)
improve hashset
Diffstat (limited to 'xmake/core')
-rw-r--r--xmake/core/base/hashset.lua59
1 files changed, 57 insertions, 2 deletions
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