Merge branch 'develop_pull_request' of https://github.com/tendermint/ethermint into tendermint-develop_pull_request
This commit is contained in:
		
						commit
						1d1ba40965
					
				| @ -1,6 +1,8 @@ | ||||
| package trie | ||||
| 
 | ||||
| import "bytes" | ||||
| import ( | ||||
| 	"bytes" | ||||
| ) | ||||
| 
 | ||||
| type Iterator struct { | ||||
| 	trie *Trie | ||||
| @ -10,22 +12,28 @@ type Iterator struct { | ||||
| } | ||||
| 
 | ||||
| func NewIterator(trie *Trie) *Iterator { | ||||
| 	return &Iterator{trie: trie, Key: make([]byte, 32)} | ||||
| 	return &Iterator{trie: trie, Key: nil} | ||||
| } | ||||
| 
 | ||||
| func (self *Iterator) Next() bool { | ||||
| 	self.trie.mu.Lock() | ||||
| 	defer self.trie.mu.Unlock() | ||||
| 
 | ||||
| 	isIterStart := false | ||||
| 	if self.Key == nil { | ||||
| 		isIterStart = true | ||||
| 		self.Key = make([]byte, 32) | ||||
| 	} | ||||
| 
 | ||||
| 	key := RemTerm(CompactHexDecode(string(self.Key))) | ||||
| 	k := self.next(self.trie.root, key) | ||||
| 	k := self.next(self.trie.root, key, isIterStart) | ||||
| 
 | ||||
| 	self.Key = []byte(DecodeCompact(k)) | ||||
| 
 | ||||
| 	return len(k) > 0 | ||||
| } | ||||
| 
 | ||||
| func (self *Iterator) next(node Node, key []byte) []byte { | ||||
| func (self *Iterator) next(node Node, key []byte, isIterStart bool) []byte { | ||||
| 	if node == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| @ -33,7 +41,7 @@ func (self *Iterator) next(node Node, key []byte) []byte { | ||||
| 	switch node := node.(type) { | ||||
| 	case *FullNode: | ||||
| 		if len(key) > 0 { | ||||
| 			k := self.next(node.branch(key[0]), key[1:]) | ||||
| 			k := self.next(node.branch(key[0]), key[1:], isIterStart) | ||||
| 			if k != nil { | ||||
| 				return append([]byte{key[0]}, k...) | ||||
| 			} | ||||
| @ -54,7 +62,13 @@ func (self *Iterator) next(node Node, key []byte) []byte { | ||||
| 	case *ShortNode: | ||||
| 		k := RemTerm(node.Key()) | ||||
| 		if vnode, ok := node.Value().(*ValueNode); ok { | ||||
| 			if bytes.Compare([]byte(k), key) > 0 { | ||||
| 			switch bytes.Compare([]byte(k), key) { | ||||
| 			case 0: | ||||
| 				if isIterStart { | ||||
| 					self.Value = vnode.Val() | ||||
| 					return k | ||||
| 				} | ||||
| 			case 1: | ||||
| 				self.Value = vnode.Val() | ||||
| 				return k | ||||
| 			} | ||||
| @ -64,7 +78,7 @@ func (self *Iterator) next(node Node, key []byte) []byte { | ||||
| 			var ret []byte | ||||
| 			skey := key[len(k):] | ||||
| 			if BeginsWith(key, k) { | ||||
| 				ret = self.next(cnode, skey) | ||||
| 				ret = self.next(cnode, skey, isIterStart) | ||||
| 			} else if bytes.Compare(k, key[:len(k)]) > 0 { | ||||
| 				return self.key(node) | ||||
| 			} | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user