summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/genie/src/base/set.lua
diff options
context:
space:
mode:
author Miodrag Milanovic <mmicko@gmail.com>2016-11-02 08:36:07 +0100
committer Miodrag Milanovic <mmicko@gmail.com>2016-11-02 08:36:07 +0100
commit6c390127c2fcd0bfeef0ff01cbf55a12fd1a2922 (patch)
tree1d7ec90b0c1796c900a1cc98911926610a1e75e9 /3rdparty/genie/src/base/set.lua
parent7fc31a0776473664273c399ae4d36c4c9884f1b2 (diff)
Update to latest GENie (nw)
Diffstat (limited to '3rdparty/genie/src/base/set.lua')
-rw-r--r--3rdparty/genie/src/base/set.lua77
1 files changed, 77 insertions, 0 deletions
diff --git a/3rdparty/genie/src/base/set.lua b/3rdparty/genie/src/base/set.lua
new file mode 100644
index 00000000000..04936560d40
--- /dev/null
+++ b/3rdparty/genie/src/base/set.lua
@@ -0,0 +1,77 @@
+Set_mt = {}
+
+function Set(t)
+ local set = {}
+ for k, l in ipairs(t) do
+ set[l] = true
+ end
+ setmetatable(set, Set_mt)
+ return set
+end
+
+function Set_mt.union(a, b)
+ local res = Set{}
+ for k in pairs(a) do res[k] = true end
+ for k in pairs(b) do res[k] = true end
+ return res
+end
+
+function Set_mt.intersection(a, b)
+ local res = Set{}
+ for k in pairs(a) do
+ res[k] = b[k]
+ end
+ return res
+end
+
+local function get_cache(a)
+ if not rawget(a, "__cache") then
+ rawset(a, "__cache", Set_mt.totable(a))
+ end
+ return rawget(a, "__cache")
+end
+
+function Set_mt.len(a)
+ return #get_cache(a)
+end
+
+function Set_mt.implode(a, sep)
+ return table.concat(get_cache(a), sep)
+end
+
+function Set_mt.totable(a)
+ local res = {}
+ for k in pairs(a) do
+ table.insert(res, k)
+ end
+ return res
+end
+
+function Set_mt.difference(a, b)
+ if getmetatable(b) ~= Set_mt then
+ if type(b) ~= "table" then
+ error(type(b).." is not a Set or table")
+ end
+ b=Set(b)
+ end
+
+ local res = Set{}
+ for k in pairs(a) do
+ res[k] = not b[k] or nil
+ end
+ rawset(res, "__cache", nil)
+ return res
+end
+
+function Set_mt.__index(a, i)
+ if type(i) == "number" then
+ return get_cache(a)[i]
+ end
+ return Set_mt[i] or rawget(a, i)
+end
+
+Set_mt.__add = Set_mt.union
+Set_mt.__mul = Set_mt.intersection
+Set_mt.__sub = Set_mt.difference
+Set_mt.__len = Set_mt.len
+Set_mt.__concat = Set_mt.implode \ No newline at end of file