table.print = function(t, tname, print_one_level)
if type(t) ~= "table" then
print("deep_print error, parameter accept is not a table!")
return
end
local _deep_count = 0
local print_one_table
local max_deep = deep or 10
local printed_tables = {}
local t_path = {}
tname = tname or "root_table"
print_one_table = function(tb, tb_name, print_one_level)
tb_name = tb_name or "table"
table.insert(t_path, tb_name)
local tpath, i, tname = ""
for i, pname in pairs(t_path) do
tpath = tpath.."."..pname
end
printed_tables[tb] = tpath
_deep_count = _deep_count + 1
local k, v, str
local tab = string.rep(" ", _deep_count*4)
--print(string.format("%s [ 0x%s ]t\n%s { ", tab, string.sub(tostring(tb), 8), tab))
print(string.format("%s {", tab))
for k, v in pairs(tb) do
if type(v) == "table" then
if printed_tables[v] then
str = string.format("%s %s = [ %s ]t", tab, output_value(k), printed_tables[v])
print(str)
elseif not print_one_level then
str = string.format("%s %s = ", tab, output_value(k))
print(str)
print_one_table(v, tostring(k))
else
str = string.format("%s %s = %s", tab, output_value(k), output_value(v))
print(str)
end
else
str = string.format("%s %s = %s", tab, output_value(k), output_value(v))
print(str)
end
end
print(tab.." }")
table.remove(t_path)
_deep_count = _deep_count - 1
end
print_one_table(t, tname, print_one_level)
printed_tables = nil
end
-- return a copy of table<src>, just copy the data or the top level.
table.clone = function(src)
local rel = {}
if type(src) ~= "table" then
return rel
end
local k, v
for k, v in pairs(src) do
rel[k] = v
end
return rel
end
-- return a deep copy of table<src>
table.deep_clone = function(src)
if type(src) ~= "table" then
return src
end
local copy_table
local level = 0
local function clone_table(t)
level = level + 1
if level > 20 then
--for a,b in pairs(src) do print(a,b) end -- for debug
error("table clone failed, source table is too deep!")
end
local k, v
local rel = {}
for k, v in pairs(t) do
if type(v) == "table" then
rel[k] = clone_table(v)
else
rel[k] = v
end
end
level = level - 1
return rel
end
return clone_table(src)
end
table.size = function(tb)
if type(tb) ~= "table" then return 0 end
local k, i = nil, 0
for k in pairs(tb) do
i = i + 1
end
return i
end