mirror of
https://github.com/Kiritow/OpenComputerScripts.git
synced 2024-03-22 13:10:46 +08:00
76 lines
1.9 KiB
Lua
76 lines
1.9 KiB
Lua
function clone(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
|
|
local new_table = {}
|
|
lookup_table[object] = new_table
|
|
for key, value in pairs(object) do
|
|
new_table[_copy(key)] = _copy(value)
|
|
end
|
|
return setmetatable(new_table, getmetatable(object))
|
|
end
|
|
return _copy(object)
|
|
end
|
|
|
|
function class(classname, super)
|
|
local superType = type(super)
|
|
local cls
|
|
if superType ~= "function" and superType ~= "table" then
|
|
superType = nil
|
|
super = nil
|
|
end
|
|
if superType == "function" or (super and super.__ctype == 1) then
|
|
cls = {}
|
|
if superType == "table" then
|
|
-- copy fields from super
|
|
for k, v in pairs(super) do
|
|
cls[k] = v
|
|
end
|
|
cls.__create = super.__create
|
|
cls.super = super
|
|
else
|
|
cls.__create = super
|
|
cls.ctor = function()
|
|
end
|
|
end
|
|
cls.__cname = classname
|
|
cls.__ctype = 1
|
|
|
|
function cls.new(...)
|
|
local instance = cls.__create(...)
|
|
for k, v in pairs(cls) do
|
|
instance[k] = v
|
|
end
|
|
instance.class = cls
|
|
instance:ctor(...)
|
|
return instance
|
|
end
|
|
else
|
|
if super then
|
|
cls = {}
|
|
setmetatable(cls, {__index = super})
|
|
cls.super = super
|
|
else
|
|
cls = {ctor = function()
|
|
end}
|
|
end
|
|
|
|
cls.__cname = classname
|
|
cls.__ctype = 2 -- lua
|
|
cls.__index = cls
|
|
|
|
function cls.new(...)
|
|
local instance = setmetatable({}, cls)
|
|
instance.class = cls
|
|
instance:ctor(...)
|
|
return instance
|
|
end
|
|
end
|
|
|
|
return cls
|
|
end
|