-
Notifications
You must be signed in to change notification settings - Fork 0
/
util.lua
97 lines (93 loc) · 2.61 KB
/
util.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
function table_eq(table1, table2)
local avoid_loops = {}
function recurse(t1, t2)
-- compare value types
if type(t1) ~= type(t2) then return false end
-- Base case: compare simple values
if type(t1) ~= "table" then return t1 == t2 end
-- Now, on to tables.
-- First, let's avoid looping forever.
if avoid_loops[t1] then return avoid_loops[t1] == t2 end
avoid_loops[t1] = t2
-- Copy keys from t2
local t2keys = {}
local t2tablekeys = {}
for k, _ in pairs(t2) do
if type(k) == "table" then table.insert(t2tablekeys, k) end
t2keys[k] = true
end
-- Let's iterate keys from t1
for k1, v1 in pairs(t1) do
local v2 = t2[k1]
if type(k1) == "table" then
-- if key is a table, we need to find an equivalent one.
local ok = false
for i, tk in ipairs(t2tablekeys) do
if table_eq(k1, tk) and recurse(v1, t2[tk]) then
table.remove(t2tablekeys, i)
t2keys[tk] = nil
ok = true
break
end
end
if not ok then return false end
else
-- t1 has a key which t2 doesn't have, fail.
if v2 == nil then return false end
t2keys[k1] = nil
if not recurse(v1, v2) then return false end
end
end
-- if t2 has a key which t1 doesn't have, fail.
if next(t2keys) then return false end
return true
end
return recurse(table1, table2)
end
function table_copy (t) -- deep-copy a table
if type(t) ~= "table" then return t end
local meta = getmetatable(t)
local target = {}
for k, v in pairs(t) do
if type(v) == "table" then
target[k] = table_copy(v)
else
target[k] = v
end
end
setmetatable(target, meta)
return target
end
function table_length( t1 )
local count = 0
for k,v in pairs(t1) do
count = count + 1
end
return count
end
function table_tostring(t1)
if type(t1) ~= 'table' then
return tostring(t1)
end
local s = "{"
for k,v in pairs(t1) do
s = s .." "..table_tostring(k).."="..table_tostring(v)..","
end
return s.."}"
end
-- returns true if t1 and t2 have the same keys
-- returns false if there exists a key in t1 that does not exist in t2,
-- or vice-versa.
function check_keys(t1, t2)
for k,_ in pairs(t1) do
if t2[k] == nil then
return false
end
end
for k,_ in pairs(t2) do
if t1[k] == nil then
return false
end
end
return true
end