From 2f54da4d4344181c5fd6a22b1f03713601ae748e Mon Sep 17 00:00:00 2001 From: Shiming Zhang Date: Thu, 10 Nov 2022 19:19:44 +0800 Subject: [PATCH] Add String --- llrb/llrb_string.go | 74 ++++++++++++++++++++++++++++++++++++++++ llrb/llrb_string_test.go | 32 +++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 llrb/llrb_string.go create mode 100644 llrb/llrb_string_test.go diff --git a/llrb/llrb_string.go b/llrb/llrb_string.go new file mode 100644 index 0000000..836dec3 --- /dev/null +++ b/llrb/llrb_string.go @@ -0,0 +1,74 @@ +package llrb + +import ( + "bytes" + "fmt" + "io" +) + +func (t *LLRB) String() string { + buf := bytes.NewBuffer(nil) + fprintNodes(buf, t.root, edges{}, edgeRoot) + return buf.String() +} + +func fprintNodes(wr io.Writer, n *Node, pre edges, edge edge) { + if n == nil { + return + } + + { + es := edgeSpace + if edge == edgeRight { + es = edgeLink + } + fprintNodes(wr, n.Left, append(pre, es), edgeLeft) + } + + fmt.Fprintf(wr, "%s %v\n", append(pre, edge), n.Item) + + { + es := edgeSpace + if edge == edgeLeft { + es = edgeLink + } + fprintNodes(wr, n.Right, append(pre, es), edgeRight) + } +} + +type edges []edge + +func (e edges) String() string { + buf := make([]rune, 0, len(e)) + for _, v := range e { + buf = append(buf, []rune(v.String())...) + } + return string(buf) +} + +type edge uint + +const ( + _ = edge(iota) + edgeSpace + edgeLink + edgeRoot + edgeLeft + edgeRight +) + +var edgeMap = map[edge]string{ + edgeSpace: ` `, + edgeLink: ` │`, + edgeRoot: `───`, + edgeLeft: ` ┌─`, + edgeRight: ` └─`, +} + +func (e edge) String() string { + v, ok := edgeMap[e] + if ok { + return v + } + return "" +} diff --git a/llrb/llrb_string_test.go b/llrb/llrb_string_test.go new file mode 100644 index 0000000..29e3790 --- /dev/null +++ b/llrb/llrb_string_test.go @@ -0,0 +1,32 @@ +package llrb + +import ( + "fmt" + "testing" +) + +func TestString(t *testing.T) { + tree := New() + for i := 0; i != 10; i++ { + tree.InsertNoReplace(Int(i)) + } + + want := ` + ┌─ 0 + ┌─ 1 + │ └─ 2 +─── 3 + │ ┌─ 4 + │ ┌─ 5 + │ │ └─ 6 + └─ 7 + │ ┌─ 8 + └─ 9 +` + want = want[1:] + got := tree.String() + if got != want { + t.Errorf("the output is not expected") + fmt.Printf("got:\n%s\nwant:\n%s\n", got, want) + } +}