diff options
| author | ruki <[email protected]> | 2024-10-06 23:09:48 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2024-10-06 23:10:23 +0800 |
| commit | d329532d12907f2f27f7c336ab0498700931317a (patch) | |
| tree | 41e78734781742b345387d002991351de21ad4d7 | |
| parent | 6c973f55a3130fe62342e4ab06e992eac6ee3a80 (diff) | |
improve hashset
| -rw-r--r-- | tests/modules/hashset/test.lua | 17 | ||||
| -rw-r--r-- | xmake/core/base/hashset.lua | 59 |
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 |
