--!The Make-like Build Utility based on Lua -- -- XMake is free software; you can redistribute it and/or modify -- it under the terms of the GNU Lesser General Public License as published by -- the Free Software Foundation; either version 2.1 of the License, or -- (at your option) any later version. -- -- XMake is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU Lesser General Public License for more details. -- -- You should have received a copy of the GNU Lesser General Public License -- along with XMake; -- If not, see http://www.gnu.org/licenses/ -- -- Copyright (C) 2015 - 2016, ruki All rights reserved. -- -- @author ruki -- @file table.lua -- -- define module: table local table = table or {} -- join all objects and tables function table.join(...) -- done local args = {...} local result = {} for _, t in ipairs(args) do if type(t) == "table" then for k, v in pairs(t) do if type(k) == "number" then table.insert(result, v) else result[k] = v end end else table.insert(result, t) end end -- ok? return result end -- join all objects and tables to self function table.join2(self, ...) -- check assert(self and type(self) == "table") -- done local args = {...} for _, t in ipairs(args) do if type(t) == "table" then for k, v in pairs(t) do if type(k) == "number" then table.insert(self, v) else self[k] = v end end else table.insert(self, t) end end -- ok? return self end -- clear the table function table.clear(self) -- check assert(self and type(self) == "table") -- clear it for k in next, self do rawset(self, k, nil) end end -- copy the table to self function table.copy(copied) -- init it copied = copied or {} -- copy it local result = {} for k, v in pairs(table.wrap(copied)) do result[k] = v end -- ok return result end -- copy the table to self function table.copy2(self, copied) -- check assert(self) -- init it copied = copied or {} -- clear self first table.clear(self) -- copy it for k, v in pairs(table.wrap(copied)) do self[k] = v end end -- is array? function table.is_array(self) -- not table? if type(self) ~= "table" then return false end -- is array? for k, v in pairs(self) do if type(k) == "number" then return true end break end -- dictionary return false end -- is dictionary? function table.is_dictionary(self) -- not table? if type(self) ~= "table" then return false end -- is dictionary? for k, v in pairs(self) do if type(k) == "string" then return true end break end -- array return false end -- dump it with the level function table._dump(self, exclude, level) -- dump string if type(self) == "string" then io.write(string.format("%q", self)) -- dump boolean elseif type(self) == "boolean" then io.write(tostring(self)) -- dump number elseif type(self) == "number" then io.write(self) -- dump function elseif type(self) == "function" then io.write("") -- dump table elseif type(self) == "table" then -- dump head io.write("\n") for l = 1, level do io.write(" ") end io.write("{\n") -- dump body local i = 0 for k, v in pairs(self) do -- exclude some keys if not exclude or type(k) ~= "string" or not k:find(exclude) then -- dump spaces and separator for l = 1, level do io.write(" ") end if i == 0 then io.write(" ") else io.write(", ") end -- dump key if type(k) == "string" then io.write(k, " = ") end -- dump value if not table._dump(v, exclude, level + 1) then return false end -- dump newline io.write("\n") i = i + 1 end end -- dump tail for l = 1, level do io.write(" ") end io.write("}\n") -- dump userdata elseif type(self) == "userdata" then io.write("") else -- error print(string.format("error: invalid object type: %s", type(self))) return false end -- ok return true end -- dump it function table.dump(self, exclude, prefix) -- dump prefix if prefix then io.write(prefix) end -- dump it table._dump(self, exclude, 0) -- return it return self end -- unwrap object if be only one function table.unwrap(object) -- check assert(object) -- unwrap it if type(object) == "table" and table.getn(object) == 1 then for _, v in pairs(object) do return v end end -- ok return object end -- wrap object to table function table.wrap(object) -- no object? if nil == object then return {} end -- wrap it if not table if type(object) ~= "table" then return {object} end -- ok return object end -- remove repeat from the given array function table.unique(array) -- check assert(array) -- remove repeat if type(array) == "table" then -- not only one? if table.getn(array) ~= 1 then -- done local exists = {} local unique = {} for _, v in ipairs(array) do if type(v) == "string" then if not exists[v] then exists[v] = true table.insert(unique, v) end else local key = "\"" .. tostring(v) .. "\"" if not exists[key] then exists[key] = true table.insert(unique, v) end end end -- update it array = unique end end -- ok return array end -- inherit interfaces and create a new instance function table.inherit(self) -- check assert(self) -- init instance local instance = {} for k, v in pairs(self) do if type(v) == "function" then instance[k] = v end end -- ok? return instance end -- inherit interfaces from the given class function table.inherit2(self, clasz) -- check assert(self and clasz) -- init instance for k, v in pairs(clasz) do if type(v) == "function" and self[k] == nil then self[k] = v end end -- ok? return self end -- return module: table return table