59 lines
1.0 KiB
Go
59 lines
1.0 KiB
Go
package treerack
|
|
|
|
type registry struct {
|
|
idSeed int
|
|
definition map[string]definition
|
|
definitions []definition
|
|
referenced map[string]bool
|
|
}
|
|
|
|
func newRegistry(defs ...definition) *registry {
|
|
r := ®istry{
|
|
definition: make(map[string]definition),
|
|
referenced: make(map[string]bool),
|
|
}
|
|
|
|
for _, def := range defs {
|
|
r.setDefinition(def)
|
|
}
|
|
|
|
return r
|
|
}
|
|
|
|
func (r *registry) setDefinition(d definition) error {
|
|
if _, ok := r.definition[d.nodeName()]; ok {
|
|
return duplicateDefinition(d.nodeName())
|
|
}
|
|
|
|
r.idSeed++
|
|
id := r.idSeed
|
|
d.setID(id)
|
|
|
|
r.definition[d.nodeName()] = d
|
|
r.definitions = append(r.definitions, d)
|
|
return nil
|
|
}
|
|
|
|
func (r *registry) setRef(d definition) {
|
|
if d.commitType()&userDefined == 0 {
|
|
return
|
|
}
|
|
|
|
r.referenced[d.nodeName()] = true
|
|
}
|
|
|
|
func (r *registry) unreferenced() []string {
|
|
var u []string
|
|
for _, def := range r.definitions {
|
|
if def.commitType()&userDefined == 0 {
|
|
continue
|
|
}
|
|
|
|
if !r.referenced[def.nodeName()] {
|
|
u = append(u, def.nodeName())
|
|
}
|
|
}
|
|
|
|
return u
|
|
}
|