github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/tm2/pkg/store/iavl/tree.go (about)

     1  package iavl
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/gnolang/gno/tm2/pkg/iavl"
     7  )
     8  
     9  var (
    10  	_ Tree = (*immutableTree)(nil)
    11  	_ Tree = (*iavl.MutableTree)(nil)
    12  )
    13  
    14  // Tree defines an interface that both mutable and immutable IAVL trees
    15  // must implement. For mutable IAVL trees, the interface is directly
    16  // implemented by an iavl.MutableTree. For an immutable IAVL tree, a wrapper
    17  // must be made.
    18  type Tree interface {
    19  	Has(key []byte) bool
    20  	Get(key []byte) (index int64, value []byte)
    21  	Set(key, value []byte) bool
    22  	Remove(key []byte) ([]byte, bool)
    23  	SaveVersion() ([]byte, int64, error)
    24  	DeleteVersion(version int64) error
    25  	Version() int64
    26  	Hash() []byte
    27  	LatestVersion() int64
    28  	VersionExists(version int64) bool
    29  	GetVersioned(key []byte, version int64) (int64, []byte)
    30  	GetVersionedWithProof(key []byte, version int64) ([]byte, *iavl.RangeProof, error)
    31  	GetImmutable(version int64) (*iavl.ImmutableTree, error)
    32  }
    33  
    34  // immutableTree is a simple wrapper around a reference to an iavl.ImmutableTree
    35  // that implements the Tree interface. It should only be used for querying
    36  // and iteration, specifically at previous heights.
    37  type immutableTree struct {
    38  	*iavl.ImmutableTree
    39  }
    40  
    41  func (it *immutableTree) Set(_, _ []byte) bool {
    42  	panic("cannot call 'Set' on an immutable IAVL tree")
    43  }
    44  
    45  func (it *immutableTree) Remove(_ []byte) ([]byte, bool) {
    46  	panic("cannot call 'Remove' on an immutable IAVL tree")
    47  }
    48  
    49  func (it *immutableTree) SaveVersion() ([]byte, int64, error) {
    50  	panic("cannot call 'SaveVersion' on an immutable IAVL tree")
    51  }
    52  
    53  func (it *immutableTree) DeleteVersion(_ int64) error {
    54  	panic("cannot call 'DeleteVersion' on an immutable IAVL tree")
    55  }
    56  
    57  func (it *immutableTree) LatestVersion() int64 {
    58  	return it.Version()
    59  }
    60  
    61  func (it *immutableTree) VersionExists(version int64) bool {
    62  	return it.Version() == version
    63  }
    64  
    65  func (it *immutableTree) GetVersioned(key []byte, version int64) (int64, []byte) {
    66  	if it.Version() != version {
    67  		return -1, nil
    68  	}
    69  
    70  	return it.Get(key)
    71  }
    72  
    73  func (it *immutableTree) GetVersionedWithProof(key []byte, version int64) ([]byte, *iavl.RangeProof, error) {
    74  	if it.Version() != version {
    75  		return nil, nil, fmt.Errorf("version mismatch on immutable IAVL tree; got: %d, expected: %d", version, it.Version())
    76  	}
    77  
    78  	return it.GetWithProof(key)
    79  }
    80  
    81  func (it *immutableTree) GetImmutable(version int64) (*iavl.ImmutableTree, error) {
    82  	if it.Version() != version {
    83  		return nil, fmt.Errorf("version mismatch on immutable IAVL tree; got: %d, expected: %d", version, it.Version())
    84  	}
    85  
    86  	return it.ImmutableTree, nil
    87  }