forked from irisnet/cosmos-sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
memiterator.go
80 lines (67 loc) · 1.53 KB
/
memiterator.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
package store
import (
"bytes"
cmn "github.com/tendermint/tendermint/libs/common"
dbm "github.com/tendermint/tendermint/libs/db"
)
// Iterates over iterKVCache items.
// if key is nil, means it was deleted.
// Implements Iterator.
type memIterator struct {
start, end []byte
items []cmn.KVPair
}
func newMemIterator(start, end []byte, items []cmn.KVPair) *memIterator {
itemsInDomain := make([]cmn.KVPair, 0)
for _, item := range items {
ascending := keyCompare(start, end) < 0
if dbm.IsKeyInDomain(item.Key, start, end, !ascending) {
itemsInDomain = append(itemsInDomain, item)
}
}
return &memIterator{
start: start,
end: end,
items: itemsInDomain,
}
}
func (mi *memIterator) Domain() ([]byte, []byte) {
return mi.start, mi.end
}
func (mi *memIterator) Valid() bool {
return len(mi.items) > 0
}
func (mi *memIterator) assertValid() {
if !mi.Valid() {
panic("memIterator is invalid")
}
}
func (mi *memIterator) Next() {
mi.assertValid()
mi.items = mi.items[1:]
}
func (mi *memIterator) Key() []byte {
mi.assertValid()
return mi.items[0].Key
}
func (mi *memIterator) Value() []byte {
mi.assertValid()
return mi.items[0].Value
}
func (mi *memIterator) Close() {
mi.start = nil
mi.end = nil
mi.items = nil
}
//----------------------------------------
// Misc.
// bytes.Compare but bounded on both sides by nil.
// both (k1, nil) and (nil, k2) return -1
func keyCompare(k1, k2 []byte) int {
if k1 == nil && k2 == nil {
return 0
} else if k1 == nil || k2 == nil {
return -1
}
return bytes.Compare(k1, k2)
}