...
1
2
3
4
5
6
7 package iterator
8
9 import (
10 "github.com/syndtr/goleveldb/leveldb/util"
11 )
12
13
14 type BasicArray interface {
15
16 Len() int
17
18
19
20 Search(key []byte) int
21 }
22
23
24 type Array interface {
25 BasicArray
26
27
28 Index(i int) (key, value []byte)
29 }
30
31
32 type ArrayIndexer interface {
33 BasicArray
34
35
36 Get(i int) Iterator
37 }
38
39 type basicArrayIterator struct {
40 util.BasicReleaser
41 array BasicArray
42 pos int
43 err error
44 }
45
46 func (i *basicArrayIterator) Valid() bool {
47 return i.pos >= 0 && i.pos < i.array.Len() && !i.Released()
48 }
49
50 func (i *basicArrayIterator) First() bool {
51 if i.Released() {
52 i.err = ErrIterReleased
53 return false
54 }
55
56 if i.array.Len() == 0 {
57 i.pos = -1
58 return false
59 }
60 i.pos = 0
61 return true
62 }
63
64 func (i *basicArrayIterator) Last() bool {
65 if i.Released() {
66 i.err = ErrIterReleased
67 return false
68 }
69
70 n := i.array.Len()
71 if n == 0 {
72 i.pos = 0
73 return false
74 }
75 i.pos = n - 1
76 return true
77 }
78
79 func (i *basicArrayIterator) Seek(key []byte) bool {
80 if i.Released() {
81 i.err = ErrIterReleased
82 return false
83 }
84
85 n := i.array.Len()
86 if n == 0 {
87 i.pos = 0
88 return false
89 }
90 i.pos = i.array.Search(key)
91 return i.pos < n
92 }
93
94 func (i *basicArrayIterator) Next() bool {
95 if i.Released() {
96 i.err = ErrIterReleased
97 return false
98 }
99
100 i.pos++
101 if n := i.array.Len(); i.pos >= n {
102 i.pos = n
103 return false
104 }
105 return true
106 }
107
108 func (i *basicArrayIterator) Prev() bool {
109 if i.Released() {
110 i.err = ErrIterReleased
111 return false
112 }
113
114 i.pos--
115 if i.pos < 0 {
116 i.pos = -1
117 return false
118 }
119 return true
120 }
121
122 func (i *basicArrayIterator) Error() error { return i.err }
123
124 type arrayIterator struct {
125 basicArrayIterator
126 array Array
127 pos int
128 key, value []byte
129 }
130
131 func (i *arrayIterator) updateKV() {
132 if i.pos == i.basicArrayIterator.pos {
133 return
134 }
135 i.pos = i.basicArrayIterator.pos
136 if i.Valid() {
137 i.key, i.value = i.array.Index(i.pos)
138 } else {
139 i.key = nil
140 i.value = nil
141 }
142 }
143
144 func (i *arrayIterator) Key() []byte {
145 i.updateKV()
146 return i.key
147 }
148
149 func (i *arrayIterator) Value() []byte {
150 i.updateKV()
151 return i.value
152 }
153
154 type arrayIteratorIndexer struct {
155 basicArrayIterator
156 array ArrayIndexer
157 }
158
159 func (i *arrayIteratorIndexer) Get() Iterator {
160 if i.Valid() {
161 return i.array.Get(i.basicArrayIterator.pos)
162 }
163 return nil
164 }
165
166
167 func NewArrayIterator(array Array) Iterator {
168 return &arrayIterator{
169 basicArrayIterator: basicArrayIterator{array: array, pos: -1},
170 array: array,
171 pos: -1,
172 }
173 }
174
175
176 func NewArrayIndexer(array ArrayIndexer) IteratorIndexer {
177 return &arrayIteratorIndexer{
178 basicArrayIterator: basicArrayIterator{array: array, pos: -1},
179 array: array,
180 }
181 }
182
View as plain text