mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2025-05-03 11:41:48 +00:00
mpt: move empty hash node in a separate type
We use them quite frequently (consider children for a new branch node) and it is better to get rid of unneeded allocations. Signed-off-by: Evgeniy Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
parent
f02d8b4ec4
commit
db80ef28df
11 changed files with 124 additions and 99 deletions
|
@ -68,8 +68,8 @@ func testPut(t *testing.T, ps pairs, tr1, tr2 *Trie) {
|
|||
|
||||
func TestTrie_PutBatchLeaf(t *testing.T) {
|
||||
prepareLeaf := func(t *testing.T) (*Trie, *Trie) {
|
||||
tr1 := NewTrie(new(HashNode), false, newTestStore())
|
||||
tr2 := NewTrie(new(HashNode), false, newTestStore())
|
||||
tr1 := NewTrie(EmptyNode{}, false, newTestStore())
|
||||
tr2 := NewTrie(EmptyNode{}, false, newTestStore())
|
||||
require.NoError(t, tr1.Put([]byte{0}, []byte("value")))
|
||||
require.NoError(t, tr2.Put([]byte{0}, []byte("value")))
|
||||
return tr1, tr2
|
||||
|
@ -97,8 +97,8 @@ func TestTrie_PutBatchLeaf(t *testing.T) {
|
|||
|
||||
func TestTrie_PutBatchExtension(t *testing.T) {
|
||||
prepareExtension := func(t *testing.T) (*Trie, *Trie) {
|
||||
tr1 := NewTrie(new(HashNode), false, newTestStore())
|
||||
tr2 := NewTrie(new(HashNode), false, newTestStore())
|
||||
tr1 := NewTrie(EmptyNode{}, false, newTestStore())
|
||||
tr2 := NewTrie(EmptyNode{}, false, newTestStore())
|
||||
require.NoError(t, tr1.Put([]byte{1, 2}, []byte("value1")))
|
||||
require.NoError(t, tr2.Put([]byte{1, 2}, []byte("value1")))
|
||||
return tr1, tr2
|
||||
|
@ -144,8 +144,8 @@ func TestTrie_PutBatchExtension(t *testing.T) {
|
|||
|
||||
func TestTrie_PutBatchBranch(t *testing.T) {
|
||||
prepareBranch := func(t *testing.T) (*Trie, *Trie) {
|
||||
tr1 := NewTrie(new(HashNode), false, newTestStore())
|
||||
tr2 := NewTrie(new(HashNode), false, newTestStore())
|
||||
tr1 := NewTrie(EmptyNode{}, false, newTestStore())
|
||||
tr2 := NewTrie(EmptyNode{}, false, newTestStore())
|
||||
require.NoError(t, tr1.Put([]byte{0x00, 2}, []byte("value1")))
|
||||
require.NoError(t, tr2.Put([]byte{0x00, 2}, []byte("value1")))
|
||||
require.NoError(t, tr1.Put([]byte{0x10, 3}, []byte("value2")))
|
||||
|
@ -175,8 +175,8 @@ func TestTrie_PutBatchBranch(t *testing.T) {
|
|||
require.IsType(t, (*ExtensionNode)(nil), tr1.root)
|
||||
})
|
||||
t.Run("non-empty child is last node", func(t *testing.T) {
|
||||
tr1 := NewTrie(new(HashNode), false, newTestStore())
|
||||
tr2 := NewTrie(new(HashNode), false, newTestStore())
|
||||
tr1 := NewTrie(EmptyNode{}, false, newTestStore())
|
||||
tr2 := NewTrie(EmptyNode{}, false, newTestStore())
|
||||
require.NoError(t, tr1.Put([]byte{0x00, 2}, []byte("value1")))
|
||||
require.NoError(t, tr2.Put([]byte{0x00, 2}, []byte("value1")))
|
||||
require.NoError(t, tr1.Put([]byte{0x00}, []byte("value2")))
|
||||
|
@ -222,8 +222,8 @@ func TestTrie_PutBatchBranch(t *testing.T) {
|
|||
|
||||
func TestTrie_PutBatchHash(t *testing.T) {
|
||||
prepareHash := func(t *testing.T) (*Trie, *Trie) {
|
||||
tr1 := NewTrie(new(HashNode), false, newTestStore())
|
||||
tr2 := NewTrie(new(HashNode), false, newTestStore())
|
||||
tr1 := NewTrie(EmptyNode{}, false, newTestStore())
|
||||
tr2 := NewTrie(EmptyNode{}, false, newTestStore())
|
||||
require.NoError(t, tr1.Put([]byte{0x10}, []byte("value1")))
|
||||
require.NoError(t, tr2.Put([]byte{0x10}, []byte("value1")))
|
||||
require.NoError(t, tr1.Put([]byte{0x20}, []byte("value2")))
|
||||
|
@ -257,8 +257,8 @@ func TestTrie_PutBatchHash(t *testing.T) {
|
|||
|
||||
func TestTrie_PutBatchEmpty(t *testing.T) {
|
||||
t.Run("good", func(t *testing.T) {
|
||||
tr1 := NewTrie(new(HashNode), false, newTestStore())
|
||||
tr2 := NewTrie(new(HashNode), false, newTestStore())
|
||||
tr1 := NewTrie(EmptyNode{}, false, newTestStore())
|
||||
tr2 := NewTrie(EmptyNode{}, false, newTestStore())
|
||||
var ps = pairs{
|
||||
{[]byte{0}, []byte("value0")},
|
||||
{[]byte{1}, []byte("value1")},
|
||||
|
@ -273,15 +273,15 @@ func TestTrie_PutBatchEmpty(t *testing.T) {
|
|||
{[]byte{2}, nil},
|
||||
{[]byte{3}, []byte("replace3")},
|
||||
}
|
||||
tr1 := NewTrie(new(HashNode), false, newTestStore())
|
||||
tr2 := NewTrie(new(HashNode), false, newTestStore())
|
||||
tr1 := NewTrie(EmptyNode{}, false, newTestStore())
|
||||
tr2 := NewTrie(EmptyNode{}, false, newTestStore())
|
||||
testIncompletePut(t, ps, 4, tr1, tr2)
|
||||
})
|
||||
}
|
||||
|
||||
// For the sake of coverage.
|
||||
func TestTrie_InvalidNodeType(t *testing.T) {
|
||||
tr := NewTrie(new(HashNode), false, newTestStore())
|
||||
tr := NewTrie(EmptyNode{}, false, newTestStore())
|
||||
var b Batch
|
||||
b.Add([]byte{1}, []byte("value"))
|
||||
tr.root = Node(nil)
|
||||
|
@ -289,8 +289,8 @@ func TestTrie_InvalidNodeType(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestTrie_PutBatch(t *testing.T) {
|
||||
tr1 := NewTrie(new(HashNode), false, newTestStore())
|
||||
tr2 := NewTrie(new(HashNode), false, newTestStore())
|
||||
tr1 := NewTrie(EmptyNode{}, false, newTestStore())
|
||||
tr2 := NewTrie(EmptyNode{}, false, newTestStore())
|
||||
var ps = pairs{
|
||||
{[]byte{1}, []byte{1}},
|
||||
{[]byte{2}, []byte{3}},
|
||||
|
@ -312,11 +312,10 @@ var _ = printNode
|
|||
// `spew.Dump()`.
|
||||
func printNode(prefix string, n Node) {
|
||||
switch tn := n.(type) {
|
||||
case EmptyNode:
|
||||
fmt.Printf("%s empty\n", prefix)
|
||||
return
|
||||
case *HashNode:
|
||||
if tn.IsEmpty() {
|
||||
fmt.Printf("%s empty\n", prefix)
|
||||
return
|
||||
}
|
||||
fmt.Printf("%s %s\n", prefix, tn.Hash().StringLE())
|
||||
case *BranchNode:
|
||||
for i, c := range tn.Children {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue