You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

40 lines
1.1 KiB
Lua

--- Helper module for performing a deep copy.
-- @module lqc.helpers.deep_copy
-- @alias deep_copy
local pairs = pairs
local type = type
local setmetatable = setmetatable
local getmetatable = getmetatable
--- Deep copies an object recursively (including (nested) tables, metatables,
-- circular references, ...)
-- Heavily based on http://stackoverflow.com/questions/640642/how-do-you-copy-a-lua-table-by-value
-- @param obj Object to be copied
-- @param seen Table of previously seen objects (for handling circular references), default nil
-- @return deep copy of obj
local function deep_copy(obj, seen)
-- handle number, string, boolean, ...
if type(obj) ~= 'table' then
return obj
end
seen = seen or {}
if seen[obj] then
return seen[obj]
end -- handle circular references
-- handle table
local result = {}
seen[obj] = result
for key, value in pairs(obj) do
result[deep_copy(key, seen)] = deep_copy(value, seen)
end
-- handle metatable
return setmetatable(result, deep_copy(getmetatable(obj), seen))
end
return deep_copy