71 lines
1.8 KiB
Go
71 lines
1.8 KiB
Go
// Copyright 2024 The NATS Authors
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package stree
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"strings"
|
|
)
|
|
|
|
// For dumping out a text representation of a tree.
|
|
func (t *SubjectTree[T]) Dump(w io.Writer) {
|
|
t.dump(w, t.root, 0)
|
|
fmt.Fprintln(w)
|
|
}
|
|
|
|
// Will dump out a node.
|
|
func (t *SubjectTree[T]) dump(w io.Writer, n node, depth int) {
|
|
if n == nil {
|
|
fmt.Fprintf(w, "EMPTY\n")
|
|
return
|
|
}
|
|
if n.isLeaf() {
|
|
leaf := n.(*leaf[T])
|
|
fmt.Fprintf(w, "%s LEAF: Suffix: %q Value: %+v\n", dumpPre(depth), leaf.suffix, leaf.value)
|
|
n = nil
|
|
} else {
|
|
// We are a node type here, grab meta portion.
|
|
bn := n.base()
|
|
fmt.Fprintf(w, "%s %s Prefix: %q\n", dumpPre(depth), n.kind(), bn.prefix)
|
|
depth++
|
|
n.iter(func(n node) bool {
|
|
t.dump(w, n, depth)
|
|
return true
|
|
})
|
|
}
|
|
}
|
|
|
|
// For individual node/leaf dumps.
|
|
func (n *leaf[T]) kind() string { return "LEAF" }
|
|
func (n *node4) kind() string { return "NODE4" }
|
|
func (n *node10) kind() string { return "NODE10" }
|
|
func (n *node16) kind() string { return "NODE16" }
|
|
func (n *node48) kind() string { return "NODE48" }
|
|
func (n *node256) kind() string { return "NODE256" }
|
|
|
|
// Calculates the indendation, etc.
|
|
func dumpPre(depth int) string {
|
|
if depth == 0 {
|
|
return "-- "
|
|
} else {
|
|
var b strings.Builder
|
|
for i := 0; i < depth; i++ {
|
|
b.WriteString(" ")
|
|
}
|
|
b.WriteString("|__ ")
|
|
return b.String()
|
|
}
|
|
}
|