diff options
Diffstat (limited to '3rdparty/genie/src/base/table.lua')
-rw-r--r-- | 3rdparty/genie/src/base/table.lua | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/3rdparty/genie/src/base/table.lua b/3rdparty/genie/src/base/table.lua index 20581c239c3..36ca7c45e07 100644 --- a/3rdparty/genie/src/base/table.lua +++ b/3rdparty/genie/src/base/table.lua @@ -25,6 +25,34 @@ -- +-- Make a complete copy of a table, including any child tables it contains. +-- + + function table.deepcopy(object) + -- keep track of already seen objects to avoid loops + local seen = {} + + local function copy(object) + if type(object) ~= "table" then + return object + elseif seen[object] then + return seen[object] + end + + local clone = {} + seen[object] = clone + for key, value in pairs(object) do + clone[key] = copy(value) + end + + setmetatable(clone, getmetatable(object)) + return clone + end + + return copy(object) + end + +-- -- Enumerates an array of objects and returns a new table containing -- only the value of one particular field. -- |