initial release
This commit is contained in:
89
cosmic rage/lua/copytable.lua
Normal file
89
cosmic rage/lua/copytable.lua
Normal file
@@ -0,0 +1,89 @@
|
||||
-- copytable.lua
|
||||
|
||||
--[[
|
||||
|
||||
Table copying functions.
|
||||
|
||||
See: http://www.gammon.com.au/forum/?id=8042
|
||||
|
||||
Ideas by Shaun Biggs, David Haley, Nick Gammon
|
||||
|
||||
Date: 21st July 2007
|
||||
|
||||
This is intended to copy tables (make a real copy, rather than just the table
|
||||
reference).
|
||||
|
||||
You can do a deep or shallow copy.
|
||||
|
||||
Shallow: Simply copies the keys and values.
|
||||
If a value is a table, you will get the same table as in the original.
|
||||
|
||||
Deep: Copies keys and values recursively.
|
||||
If a value is a table, makes a copy of that table, and so on.
|
||||
|
||||
Deep copy based on: http://lua-users.org/wiki/CopyTable
|
||||
|
||||
Restrictions: Items must be "safe" to copy (eg. not file IO userdata).
|
||||
|
||||
The deep copied tables share the same metatable as the original ones.
|
||||
To change this, change the line:
|
||||
|
||||
return setmetatable(new_table, getmetatable(object))
|
||||
|
||||
to:
|
||||
|
||||
return setmetatable(new_table, _copy (getmetatable(object))
|
||||
|
||||
Example:
|
||||
|
||||
t1 = {
|
||||
m = { a = 1, b = 2 },
|
||||
n = { c = 3, d = 4 },
|
||||
}
|
||||
|
||||
require "copytable" -- load this file
|
||||
|
||||
t2 = copytable.shallow (t1) -- shallow copy
|
||||
t3 = copytable.deep (t1) -- copies sub tables as well
|
||||
|
||||
--]]
|
||||
|
||||
module (..., package.seeall)
|
||||
|
||||
|
||||
function deep (object)
|
||||
local lookup_table = {}
|
||||
|
||||
local function _copy (object)
|
||||
if type (object) ~= "table" then
|
||||
return object
|
||||
elseif lookup_table [object] then
|
||||
return lookup_table [object]
|
||||
end -- if
|
||||
|
||||
local new_table = {}
|
||||
lookup_table [object] = new_table
|
||||
|
||||
for index, value in pairs (object) do
|
||||
new_table [_copy (index)] = _copy (value)
|
||||
end -- for
|
||||
|
||||
return setmetatable (new_table, getmetatable (object))
|
||||
end -- function _copy
|
||||
|
||||
return _copy (object)
|
||||
end -- function deepcopy
|
||||
|
||||
function shallow (t)
|
||||
assert (type (t) == "table", "You must specify a table to copy")
|
||||
|
||||
local result = {}
|
||||
|
||||
for k, v in pairs (t) do
|
||||
result [k] = v
|
||||
end -- for each table element
|
||||
|
||||
-- copy the metatable
|
||||
return setmetatable (result, getmetatable (t))
|
||||
|
||||
end -- function shallow
|
||||
Reference in New Issue
Block a user