Megrez // Memory sanitization.

This commit is contained in:
ShikiSuen 2023-03-02 17:21:19 +08:00
parent 2dc69bc41d
commit b5de4dd57d
2 changed files with 22 additions and 4 deletions

View File

@ -32,6 +32,7 @@ public extension Megrez.Compositor {
} }
let terminal = Vertex(node: .init(keyArray: ["_TERMINAL_"])) let terminal = Vertex(node: .init(keyArray: ["_TERMINAL_"]))
var root = Vertex(node: .init(keyArray: ["_ROOT_"]))
for (i, vertexSpan) in vertexSpans.enumerated() { for (i, vertexSpan) in vertexSpans.enumerated() {
for vertex in vertexSpan { for vertex in vertexSpan {
@ -46,11 +47,10 @@ public extension Megrez.Compositor {
} }
} }
let root = Vertex(node: .init(keyArray: ["_ROOT_"]))
root.distance = 0 root.distance = 0
root.edges.append(contentsOf: vertexSpans[0]) root.edges.append(contentsOf: vertexSpans[0])
var ordered: [Vertex] = topologicalSort(root: root) var ordered = topologicalSort(root: &root)
for (j, neta) in ordered.reversed().enumerated() { for (j, neta) in ordered.reversed().enumerated() {
for (k, _) in neta.edges.enumerated() { for (k, _) in neta.edges.enumerated() {
relax(u: neta, v: &neta.edges[k]) relax(u: neta, v: &neta.edges[k])
@ -58,15 +58,23 @@ public extension Megrez.Compositor {
ordered[j] = neta ordered[j] = neta
} }
var iterated = terminal
var walked = [Node]() var walked = [Node]()
var totalLengthOfKeys = 0 var totalLengthOfKeys = 0
var iterated = terminal
while let itPrev = iterated.prev { while let itPrev = iterated.prev {
walked.append(itPrev.node) walked.append(itPrev.node)
iterated = itPrev iterated = itPrev
totalLengthOfKeys += iterated.node.spanLength totalLengthOfKeys += iterated.node.spanLength
} }
//
ordered.removeAll()
vertexSpans.removeAll()
iterated.destroy()
root.destroy()
terminal.destroy()
guard totalLengthOfKeys == keys.count else { guard totalLengthOfKeys == keys.count else {
print("!!! ERROR A") print("!!! ERROR A")
return (result, false) return (result, false)

View File

@ -29,6 +29,16 @@ extension Megrez.Compositor {
public init(node: Node) { public init(node: Node) {
self.node = node self.node = node
} }
/// Vertex Vertex
/// Vertex 使
public func destroy() {
while prev?.prev != nil { prev?.destroy() }
prev = nil
edges.forEach { $0.destroy() }
edges.removeAll()
node = .init()
}
} }
/// ///
@ -67,7 +77,7 @@ extension Megrez.Compositor {
/// Cormen 2001 Introduction to Algorithms /// Cormen 2001 Introduction to Algorithms
/// - Parameter root: /// - Parameter root:
/// - Returns: /// - Returns:
func topologicalSort(root: Vertex) -> [Vertex] { func topologicalSort(root: inout Vertex) -> [Vertex] {
class State { class State {
var iterIndex: Int var iterIndex: Int
let vertex: Vertex let vertex: Vertex