Skip to content

Commit a4e77f1

Browse files
committed
Add String
1 parent ae3b015 commit a4e77f1

File tree

2 files changed

+106
-0
lines changed

2 files changed

+106
-0
lines changed

llrb/llrb_string.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package llrb
2+
3+
import (
4+
"bytes"
5+
"fmt"
6+
"io"
7+
)
8+
9+
func (t *LLRB) String() string {
10+
buf := bytes.NewBuffer(nil)
11+
fprintNodes(buf, t.root, edges{}, edgeRoot)
12+
return buf.String()
13+
}
14+
15+
func fprintNodes(wr io.Writer, n *Node, pre edges, edge edge) {
16+
if n == nil {
17+
return
18+
}
19+
20+
{
21+
es := edgeSpace
22+
if edge == edgeRight {
23+
es = edgeLink
24+
}
25+
fprintNodes(wr, n.Left, append(pre, es), edgeLeft)
26+
}
27+
28+
fmt.Fprintf(wr, "%s%v\n", append(pre, edge), n.Item)
29+
30+
{
31+
es := edgeSpace
32+
if edge == edgeLeft {
33+
es = edgeLink
34+
}
35+
fprintNodes(wr, n.Right, append(pre, es), edgeRight)
36+
}
37+
}
38+
39+
type edges []edge
40+
41+
func (e edges) String() string {
42+
buf := make([]rune, 0, len(e))
43+
for _, v := range e {
44+
buf = append(buf, []rune(v.String())...)
45+
}
46+
return string(buf)
47+
}
48+
49+
type edge uint
50+
51+
const (
52+
_ = edge(iota)
53+
edgeSpace
54+
edgeLink
55+
edgeRoot
56+
edgeLeft
57+
edgeRight
58+
)
59+
60+
var edgeMap = map[edge]string{
61+
edgeSpace: ` `,
62+
edgeLink: `│`,
63+
edgeRoot: `─>`,
64+
edgeLeft: `┌>`,
65+
edgeRight: `└>`,
66+
}
67+
68+
func (e edge) String() string {
69+
v, ok := edgeMap[e]
70+
if ok {
71+
return v
72+
}
73+
return ""
74+
}

llrb/llrb_string_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package llrb
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
)
7+
8+
func TestString(t *testing.T) {
9+
tree := New()
10+
for i := 0; i != 10; i++ {
11+
tree.InsertNoReplace(Int(i))
12+
}
13+
14+
want := `
15+
  ┌>0
16+
 ┌>1
17+
 │└>2
18+
─>3
19+
 │ ┌>4
20+
 │┌>5
21+
 ││└>6
22+
 └>7
23+
  │┌>8
24+
  └>9
25+
`
26+
want = want[1:]
27+
got := tree.String()
28+
if got != want {
29+
t.Errorf("the output is not expected")
30+
fmt.Printf("got:\n%s\nwant:\n%s\n", got, want)
31+
}
32+
}

0 commit comments

Comments
 (0)