github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/store/cachekv/memiterator.go (about) 1 package cachekv 2 3 import ( 4 "errors" 5 kv "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/kv" 6 dbm "github.com/fibonacci-chain/fbc/libs/tm-db" 7 ) 8 9 // Iterates over iterKVCache items. 10 // if key is nil, means it was deleted. 11 // Implements Iterator. 12 type memIterator struct { 13 start, end []byte 14 items []*kv.Pair 15 ascending bool 16 } 17 18 func newMemIterator(start, end []byte, items *kv.List, ascending bool) *memIterator { 19 itemsInDomain := make([]*kv.Pair, 0, items.Len()) 20 21 var entered bool 22 for e := items.Front(); e != nil; e = e.Next() { 23 item := e.Value 24 if !dbm.IsKeyInDomain(item.Key, start, end) { 25 if entered { 26 break 27 } 28 continue 29 } 30 itemsInDomain = append(itemsInDomain, item) 31 entered = true 32 } 33 34 return &memIterator{ 35 start: start, 36 end: end, 37 items: itemsInDomain, 38 ascending: ascending, 39 } 40 } 41 42 func (mi *memIterator) Domain() ([]byte, []byte) { 43 return mi.start, mi.end 44 } 45 46 func (mi *memIterator) Valid() bool { 47 return len(mi.items) > 0 48 } 49 50 func (mi *memIterator) assertValid() { 51 if err := mi.Error(); err != nil { 52 panic(err) 53 } 54 } 55 56 func (mi *memIterator) Next() { 57 mi.assertValid() 58 if mi.ascending { 59 mi.items = mi.items[1:] 60 } else { 61 mi.items = mi.items[:len(mi.items)-1] 62 } 63 } 64 65 func (mi *memIterator) Key() []byte { 66 mi.assertValid() 67 if mi.ascending { 68 return mi.items[0].Key 69 } 70 return mi.items[len(mi.items)-1].Key 71 } 72 73 func (mi *memIterator) Value() []byte { 74 mi.assertValid() 75 if mi.ascending { 76 return mi.items[0].Value 77 } 78 return mi.items[len(mi.items)-1].Value 79 } 80 81 func (mi *memIterator) Close() { 82 mi.start = nil 83 mi.end = nil 84 mi.items = nil 85 } 86 87 // Error returns an error if the memIterator is invalid defined by the Valid 88 // method. 89 func (mi *memIterator) Error() error { 90 if !mi.Valid() { 91 return errors.New("invalid memIterator") 92 } 93 94 return nil 95 }