--[[
date: 2014-8-1
licence: mit
author:
]]
--[[
module_relation table
key -- module name
value -- depandences (those the module refers to)
]]
local module_relation = {
['a'] = { 'c' },
['b'] = { 'c' },
['c'] = { },
['d'] = { },
}
--[[
graph matrix
deps
a b c d
a 0 0 1 0
b 0 0 1 0
c 0 0 0 0
d 0 0 0 0
]]
local module_relation = {
['a'] = { 'b', 'c' },
['b'] = { 'c' },
['c'] = { },
}
--[[
graph matrix
deps
a b c
a 0 1 1
b 0 0 1
c 0 0 0
]]
local module_relation = {
['a'] = { },
['b'] = { 'a' },
['c'] = { 'a' },
['d'] = { 'b', 'c' },
}
--[[
graph matrix
deps
a b c d
a 0 1 1 0
b 0 0 1 0
c 0 0 0 0
d 0 0 0 0
]]
local module_relation = {
['a'] = { 'b' },
['b'] = { 'c' },
['c'] = { 'd' },
['d'] = { 'a' },
['e'] = { 'a' },
}
--[[
graph matrix
deps
a b c d e
a 0 1 0 0 0
b 0 0 1 0 0
c 0 0 0 1 0
d 0 0 0 0 1
e 1 0 0 0 0
]]
local modules = 0
local graph_matrix = {}
local reg_seq = {}
for mod, deps in pairs(module_relation) do
for _, v in ipairs(deps) do
if graph_matrix[v] == nil then graph_matrix[v] = {} end
graph_matrix[v][mod] = true
end
modules = modules 1
end
mod = next(module_relation)
while mod ~= nil do
if graph_matrix[mod] == nil or next(graph_matrix[mod]) == nil then
table.insert(reg_seq, mod)
for k in pairs(graph_matrix) do
graph_matrix[k][mod] = nil
end
module_relation[mod] = nil
mod = next(module_relation)
else
mod = next(module_relation, mod)
end
end
local function rev_tab(t)
local i = 1
local j = #t
while i < j do
local tmp = t[i]
t[i] = t[j]
t[j] = tmp
i = i 1
j = j - 1
end
return t
end
-- register sequence
print("register sequence:", unpack(rev_tab(reg_seq)))
if #reg_seq ~= modules then
error("there's reference loop relationship amang these modules!")
end
用户登录
还没有账号?立即注册
用户注册
投稿取消
| 文章分类: |
|
还能输入300字
上传中....
喵眔喵