模块依赖排序,保证依赖模块不会先于被依赖模块而注册,50行lua。
- 作者: 喵眔喵
- 来源: 51数据库
- 2022-08-17
--[[
Date: 2014-8-1
Licence: MIT
Author: <leoma@credosemi.com>
<xfguo@credosemi.com>
]]
--[[
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
推荐阅读
