mirror of
https://gitlab.com/pulsechaincom/erigon-pulse.git
synced 2024-12-22 11:41:19 +00:00
105 lines
2.8 KiB
Go
105 lines
2.8 KiB
Go
|
package trie
|
||
|
|
||
|
import "github.com/ledgerwatch/turbo-geth/common"
|
||
|
|
||
|
type Observer interface {
|
||
|
BranchNodeCreated(hex []byte)
|
||
|
BranchNodeDeleted(hex []byte)
|
||
|
BranchNodeTouched(hex []byte)
|
||
|
|
||
|
CodeNodeCreated(hex []byte, size uint)
|
||
|
CodeNodeDeleted(hex []byte)
|
||
|
CodeNodeTouched(hex []byte)
|
||
|
CodeNodeSizeChanged(hex []byte, newSize uint)
|
||
|
|
||
|
WillUnloadBranchNode(key []byte, nodeHash common.Hash)
|
||
|
BranchNodeLoaded(prefixAsNibbles []byte)
|
||
|
}
|
||
|
|
||
|
var _ Observer = (*NoopObserver)(nil) // make sure that NoopTrieObserver is compliant
|
||
|
|
||
|
// NoopTrieObserver might be used to emulate optional methods in observers
|
||
|
type NoopObserver struct{}
|
||
|
|
||
|
func (*NoopObserver) BranchNodeCreated(_ []byte) {}
|
||
|
func (*NoopObserver) BranchNodeDeleted(_ []byte) {}
|
||
|
func (*NoopObserver) BranchNodeTouched(_ []byte) {}
|
||
|
func (*NoopObserver) CodeNodeCreated(_ []byte, _ uint) {}
|
||
|
func (*NoopObserver) CodeNodeDeleted(_ []byte) {}
|
||
|
func (*NoopObserver) CodeNodeTouched(_ []byte) {}
|
||
|
func (*NoopObserver) CodeNodeSizeChanged(_ []byte, _ uint) {}
|
||
|
func (*NoopObserver) WillUnloadBranchNode(_ []byte, _ common.Hash) {}
|
||
|
func (*NoopObserver) BranchNodeLoaded(_ []byte) {}
|
||
|
|
||
|
// TrieObserverMux multiplies the callback methods and sends them to
|
||
|
// all it's children.
|
||
|
type ObserverMux struct {
|
||
|
children []Observer
|
||
|
}
|
||
|
|
||
|
func NewTrieObserverMux() *ObserverMux {
|
||
|
return &ObserverMux{make([]Observer, 0)}
|
||
|
}
|
||
|
|
||
|
func (mux *ObserverMux) AddChild(child Observer) {
|
||
|
if child == nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
mux.children = append(mux.children, child)
|
||
|
}
|
||
|
|
||
|
func (mux *ObserverMux) BranchNodeCreated(hex []byte) {
|
||
|
for _, child := range mux.children {
|
||
|
child.BranchNodeCreated(hex)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (mux *ObserverMux) BranchNodeDeleted(hex []byte) {
|
||
|
for _, child := range mux.children {
|
||
|
child.BranchNodeDeleted(hex)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (mux *ObserverMux) BranchNodeTouched(hex []byte) {
|
||
|
for _, child := range mux.children {
|
||
|
child.BranchNodeTouched(hex)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (mux *ObserverMux) CodeNodeCreated(hex []byte, size uint) {
|
||
|
for _, child := range mux.children {
|
||
|
child.CodeNodeCreated(hex, size)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (mux *ObserverMux) CodeNodeDeleted(hex []byte) {
|
||
|
for _, child := range mux.children {
|
||
|
child.CodeNodeDeleted(hex)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (mux *ObserverMux) CodeNodeTouched(hex []byte) {
|
||
|
for _, child := range mux.children {
|
||
|
child.CodeNodeTouched(hex)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (mux *ObserverMux) CodeNodeSizeChanged(hex []byte, newSize uint) {
|
||
|
for _, child := range mux.children {
|
||
|
child.CodeNodeSizeChanged(hex, newSize)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (mux *ObserverMux) WillUnloadBranchNode(key []byte, nodeHash common.Hash) {
|
||
|
for _, child := range mux.children {
|
||
|
child.WillUnloadBranchNode(key, nodeHash)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (mux *ObserverMux) BranchNodeLoaded(prefixAsNibbles []byte) {
|
||
|
for _, child := range mux.children {
|
||
|
child.BranchNodeLoaded(prefixAsNibbles)
|
||
|
}
|
||
|
}
|