From a2180170ed8f2a9bf46a3fdb39f955897e73cff5 Mon Sep 17 00:00:00 2001 From: Lorenzo Cogotti Date: Thu, 1 Sep 2022 08:27:39 +0200 Subject: [PATCH] [meta] Add table deep copy function. --- meta.lua | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/meta.lua b/meta.lua index 88b712e..62b3498 100644 --- a/meta.lua +++ b/meta.lua @@ -35,4 +35,33 @@ function meta.mergetable(to, from) return to end +--- Table deep copy. +-- +-- Copy table 'obj', cloning any sub-table. +-- Handles cyclic references. +-- +-- @tparam table obj object to be copied +-- @tparam[opt={}] table copied known copied sub-object table +-- @treturn table newly created clone of 'obj' +function meta.deepcopy(obj, copied) + copied = copied or {} + + local r = {} + + copied[obj] = r + + for k,v in pairs(obj) do + if type(v) == 'table' then + local t = copied[v] or meta.deepcopy(v, copied) + + copied[v] = t -- NOP if object was already copied + v = t + end + + r[k] = v + end + + return r +end + return meta