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  }