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 }