69f6b9c9c5
add precedence tests remove dead code from router gen make more strides towards using writers in router gen optimise dump request
61 lines
1.1 KiB
Go
61 lines
1.1 KiB
Go
package main
|
|
|
|
type Prec struct {
|
|
Sets []map[string]int
|
|
NameToSet map[string]int
|
|
}
|
|
|
|
func NewPrec() *Prec {
|
|
return &Prec{NameToSet: make(map[string]int)}
|
|
}
|
|
|
|
func (p *Prec) AddSet(precs ...string) {
|
|
set := make(map[string]int)
|
|
setIndex, i := len(p.Sets), 0
|
|
for _, prec := range precs {
|
|
set[prec] = i
|
|
p.NameToSet[prec] = setIndex
|
|
i++
|
|
}
|
|
p.Sets = append(p.Sets, set)
|
|
}
|
|
|
|
func (p *Prec) InAnySet(name string) bool {
|
|
_, ok := p.NameToSet[name]
|
|
return ok
|
|
}
|
|
|
|
func (p *Prec) InSameSet(n, n2 string) bool {
|
|
ok, ok2 := p.InAnySet(n), p.InAnySet(n2)
|
|
if !ok || !ok2 {
|
|
return false
|
|
}
|
|
set1, set2 := p.NameToSet[n], p.NameToSet[n2]
|
|
return set1 == set2
|
|
}
|
|
|
|
func (p *Prec) GreaterThan(greater, lesser string) bool {
|
|
if !p.InSameSet(greater, lesser) {
|
|
return false
|
|
}
|
|
set := p.Sets[p.NameToSet[greater]]
|
|
return set[greater] > set[lesser]
|
|
}
|
|
|
|
func (p *Prec) LessThanItem(greater string) (l []string) {
|
|
if len(p.Sets) == 0 {
|
|
return nil
|
|
}
|
|
|
|
setIndex := p.NameToSet[greater]
|
|
set := p.Sets[setIndex]
|
|
ref := set[greater]
|
|
for name, value := range set {
|
|
if value < ref {
|
|
l = append(l, name)
|
|
}
|
|
}
|
|
|
|
return l
|
|
}
|