-
Notifications
You must be signed in to change notification settings - Fork 1
/
node.go
102 lines (76 loc) · 1.64 KB
/
node.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package cmd
import (
"golang.org/x/xerrors"
"github.com/spikeekips/avl"
)
type MutableNode struct {
key []byte
height int16
left avl.MutableNode
right avl.MutableNode
value int
}
func NewMutableNode(key []byte) *MutableNode {
return &MutableNode{key: key}
}
func (em *MutableNode) Key() []byte {
return em.key
}
func (em *MutableNode) Height() int16 {
return em.height
}
func (em *MutableNode) SetHeight(height int16) error {
if height < 0 {
return xerrors.Errorf("height must be greater than zero; height=%d", height)
}
em.height = height
return nil
}
func (em *MutableNode) Left() avl.MutableNode {
return em.left
}
func (em *MutableNode) LeftKey() []byte {
if em.left == nil {
return nil
}
return em.left.Key()
}
func (em *MutableNode) SetLeft(node avl.MutableNode) error {
if node == nil {
em.left = nil
return nil
}
if avl.EqualKey(em.key, node.Key()) {
return xerrors.Errorf("left is same node; key=%v", em.key)
}
em.left = node.(*MutableNode)
return nil
}
func (em *MutableNode) Right() avl.MutableNode {
return em.right
}
func (em *MutableNode) RightKey() []byte {
if em.right == nil {
return nil
}
return em.right.Key()
}
func (em *MutableNode) SetRight(node avl.MutableNode) error {
if node == nil {
em.right = nil
return nil
}
if avl.EqualKey(em.key, node.Key()) {
return xerrors.Errorf("right is same node; key=%v", em.key)
}
em.right = node.(*MutableNode)
return nil
}
func (em *MutableNode) Merge(node avl.MutableNode) error {
e, ok := node.(*MutableNode)
if !ok {
return xerrors.Errorf("merge node is not *MutableNode; node=%T", node)
}
em.value = e.value
return nil
}