forked from pingcap/tidb
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrbtree_buffer.go
121 lines (101 loc) · 2.35 KB
/
rbtree_buffer.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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package kv
import (
"bytes"
"github.com/juju/errors"
"github.com/petar/GoLLRB/llrb"
)
type keyItem Key
func (k keyItem) Less(item llrb.Item) bool {
switch x := item.(type) {
case keyItem:
return bytes.Compare(k, x) < 0
case *pairItem:
return bytes.Compare(k, x.key) < 0
}
return true
}
type pairItem struct {
key Key
value []byte
}
func (pair *pairItem) Less(item llrb.Item) bool {
switch x := item.(type) {
case keyItem:
return bytes.Compare(pair.key, x) < 0
case *pairItem:
return bytes.Compare(pair.key, x.key) < 0
}
return true
}
type rbTreeBuffer struct {
tree *llrb.LLRB
}
type rbTreeIter struct {
tree *llrb.LLRB
seek Key
pair *pairItem
}
// NewRBTreeBuffer creates a new rbTreeBuffer.
func NewRBTreeBuffer() MemBuffer {
return &rbTreeBuffer{tree: llrb.New()}
}
// Seek creates an Iterator.
func (m *rbTreeBuffer) Seek(k Key) (Iterator, error) {
it := &rbTreeIter{tree: m.tree, seek: k}
it.Next()
return it, nil
}
func (m *rbTreeBuffer) SeekReverse(k Key) (Iterator, error) {
// TODO: implement Prev.
return nil, ErrNotImplemented
}
// Get returns the value associated with key.
func (m *rbTreeBuffer) Get(k Key) ([]byte, error) {
pair := m.tree.Get(keyItem(k))
if pair == nil {
return nil, ErrNotExist
}
return pair.(*pairItem).value, nil
}
// Set associates key with value.
func (m *rbTreeBuffer) Set(k Key, v []byte) error {
if len(v) == 0 {
return errors.Trace(ErrCannotSetNilValue)
}
m.tree.ReplaceOrInsert(&pairItem{key: k, value: v})
return nil
}
// Delete removes the entry from buffer with provided key.
func (m *rbTreeBuffer) Delete(k Key) error {
m.tree.ReplaceOrInsert(&pairItem{key: k, value: nil})
return nil
}
// Release reset the buffer.
func (m *rbTreeBuffer) Release() {
m.tree = llrb.New()
}
// Next implements the Iterator Next.
func (i *rbTreeIter) Next() error {
i.pair = nil
i.tree.AscendGreaterOrEqual(keyItem(i.seek), func(item llrb.Item) bool {
i.pair = item.(*pairItem)
i.seek = i.pair.key.Next()
return false
})
return nil
}
// Valid implements the Iterator Valid.
func (i *rbTreeIter) Valid() bool {
return i.pair != nil
}
// Key implements the Iterator Key.
func (i *rbTreeIter) Key() Key {
return i.pair.key
}
// Value implements the Iterator Value.
func (i *rbTreeIter) Value() []byte {
return i.pair.value
}
// Close Implements the Iterator Close.
func (i *rbTreeIter) Close() {
}