github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/tm2/pkg/db/internal/mem_iterator.go (about) 1 package internal 2 3 import "github.com/gnolang/gno/tm2/pkg/db" 4 5 // We need a copy of all of the keys. 6 // Not the best, but probably not a bottleneck depending. 7 type MemIterator struct { 8 db db.DB 9 cur int 10 keys []string 11 start []byte 12 end []byte 13 } 14 15 var _ db.Iterator = (*MemIterator)(nil) 16 17 // Keys is expected to be in reverse order for reverse iterators. 18 func NewMemIterator(db db.DB, keys []string, start, end []byte) *MemIterator { 19 return &MemIterator{ 20 db: db, 21 cur: 0, 22 keys: keys, 23 start: start, 24 end: end, 25 } 26 } 27 28 // Implements Iterator. 29 func (itr *MemIterator) Domain() ([]byte, []byte) { 30 return itr.start, itr.end 31 } 32 33 // Implements Iterator. 34 func (itr *MemIterator) Valid() bool { 35 return 0 <= itr.cur && itr.cur < len(itr.keys) 36 } 37 38 // Implements Iterator. 39 func (itr *MemIterator) Next() { 40 itr.assertIsValid() 41 itr.cur++ 42 } 43 44 // Implements Iterator. 45 func (itr *MemIterator) Key() []byte { 46 itr.assertIsValid() 47 return []byte(itr.keys[itr.cur]) 48 } 49 50 // Implements Iterator. 51 func (itr *MemIterator) Value() []byte { 52 itr.assertIsValid() 53 key := []byte(itr.keys[itr.cur]) 54 return itr.db.Get(key) 55 } 56 57 // Implements Iterator. 58 func (itr *MemIterator) Close() { 59 itr.keys = nil 60 itr.db = nil 61 } 62 63 func (itr *MemIterator) assertIsValid() { 64 if !itr.Valid() { 65 panic("MemIterator is invalid") 66 } 67 }