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  }