forked from RoaringBitmap/roaring
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathshortiterator.go
92 lines (74 loc) · 1.83 KB
/
shortiterator.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
package roaring
type shortIterable interface {
hasNext() bool
next() uint16
}
type shortPeekable interface {
shortIterable
peekNext() uint16
advanceIfNeeded(minval uint16)
}
type shortIterator struct {
slice []uint16
loc int
}
func (si *shortIterator) hasNext() bool {
return si.loc < len(si.slice)
}
func (si *shortIterator) next() uint16 {
a := si.slice[si.loc]
si.loc++
return a
}
func (si *shortIterator) peekNext() uint16 {
return si.slice[si.loc]
}
func (si *shortIterator) advanceIfNeeded(minval uint16) {
if si.hasNext() && si.peekNext() < minval {
si.loc = advanceUntil(si.slice, si.loc, len(si.slice), minval)
}
}
type reverseIterator struct {
slice []uint16
loc int
}
func (si *reverseIterator) hasNext() bool {
return si.loc >= 0
}
func (si *reverseIterator) next() uint16 {
a := si.slice[si.loc]
si.loc--
return a
}
/**********************************************************************/
// customize for LinDB
/**********************************************************************/
// PeekableShortIterator represents the wrapper interface of shortPeekable
type PeekableShortIterator interface {
// HasNext returns if has next element
HasNext() bool
// Next returns the next element
Next() uint16
// PeekNext peeks the next element
PeekNext() uint16
// AdvanceIfNeeded skips to min value
AdvanceIfNeeded(minVal uint16)
}
type peekableShortIterator struct {
it shortPeekable
}
func newPeekableShortIterator(it shortPeekable) PeekableShortIterator {
return &peekableShortIterator{it: it}
}
func (p *peekableShortIterator) HasNext() bool {
return p.it.hasNext()
}
func (p *peekableShortIterator) Next() uint16 {
return p.it.next()
}
func (p *peekableShortIterator) PeekNext() uint16 {
return p.it.peekNext()
}
func (p *peekableShortIterator) AdvanceIfNeeded(minVal uint16) {
p.it.advanceIfNeeded(minVal)
}