| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- -- ================
- -- Private helpers
- -- ================
- local setmetatable = setmetatable
- local Node = require("Graph/Node")
- -- Internal class constructor
- local class = function(...)
- local klass = {}
- klass.__index = klass
- klass.__call = function(_,...) return klass:new(...) end
- function klass:new(...)
- local instance = setmetatable({}, klass)
- klass.__init(instance, ...)
- return instance
- end
- return setmetatable(klass,{__call = klass.__call})
- end
- local Graph = class()
- Graph.__tostring = function(g) return ("Graph") end
- function Graph:__init(vertices, edges)
- self.vertices = vertices
- self.edges = edges
- self.nodes = {}
- for _,e in pairs(edges) do
- if self.nodes[e.p1.id] == nil then
- self.nodes[e.p1.id] = Node(e.p1.id)
- end
- if self.nodes[e.p2.id] == nil then
- self.nodes[e.p2.id] = Node(e.p2.id)
- end
- self.nodes[e.p1.id]:link(self.nodes[e.p2.id])
- self.nodes[e.p2.id]:link(self.nodes[e.p1.id])
- end
- for _,v in pairs(vertices) do
- if self.nodes[v.id] == nil then
- self.nodes[v.id] = Node(v.id)
- end
- end
- end
- function Graph:contains_vertex(v)
- if self.vertices[v.id] then return true end
- return false
- end
- function Graph:append_vertex(v)
- assert(v.id ~= nil, "vertex not configured")
- assert(self.vertices[v.id] == nil, "vertex already existing")
- self.vertices[v.id] = v
- self.nodes[v.id] = Node(v.id)
- end
- function Graph:contains_edge(e)
- for _,edge in pairs(self.edges) do
- if e == edge then return true end
- end
- return false
- end
- function Graph:append_edge(e)
- for _,edge in pairs(self.edges) do
- assert(e ~= edge, "Edge already existing")
- end
- table.insert(self.edges, e)
- self.nodes[e.p1.id]:link(self.nodes[e.p2.id])
- self.nodes[e.p2.id]:link(self.nodes[e.p1.id])
- end
- return Graph
|