iterator.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. // Copyright 2014 The go-ethereum Authors
  2. // This file is part of the go-ethereum library.
  3. //
  4. // The go-ethereum library is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU Lesser General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // The go-ethereum library is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU Lesser General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU Lesser General Public License
  15. // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
  16. package trie
  17. import "bytes"
  18. type Iterator struct {
  19. trie *Trie
  20. Key []byte
  21. Value []byte
  22. }
  23. func NewIterator(trie *Trie) *Iterator {
  24. return &Iterator{trie: trie, Key: nil}
  25. }
  26. func (self *Iterator) Next() bool {
  27. isIterStart := false
  28. if self.Key == nil {
  29. isIterStart = true
  30. self.Key = make([]byte, 32)
  31. }
  32. key := remTerm(compactHexDecode(self.Key))
  33. k := self.next(self.trie.root, key, isIterStart)
  34. self.Key = []byte(decodeCompact(k))
  35. return len(k) > 0
  36. }
  37. func (self *Iterator) next(node interface{}, key []byte, isIterStart bool) []byte {
  38. if node == nil {
  39. return nil
  40. }
  41. switch node := node.(type) {
  42. case fullNode:
  43. if len(key) > 0 {
  44. k := self.next(node[key[0]], key[1:], isIterStart)
  45. if k != nil {
  46. return append([]byte{key[0]}, k...)
  47. }
  48. }
  49. var r byte
  50. if len(key) > 0 {
  51. r = key[0] + 1
  52. }
  53. for i := r; i < 16; i++ {
  54. k := self.key(node[i])
  55. if k != nil {
  56. return append([]byte{i}, k...)
  57. }
  58. }
  59. case shortNode:
  60. k := remTerm(node.Key)
  61. if vnode, ok := node.Val.(valueNode); ok {
  62. switch bytes.Compare([]byte(k), key) {
  63. case 0:
  64. if isIterStart {
  65. self.Value = vnode
  66. return k
  67. }
  68. case 1:
  69. self.Value = vnode
  70. return k
  71. }
  72. } else {
  73. cnode := node.Val
  74. var ret []byte
  75. skey := key[len(k):]
  76. if bytes.HasPrefix(key, k) {
  77. ret = self.next(cnode, skey, isIterStart)
  78. } else if bytes.Compare(k, key[:len(k)]) > 0 {
  79. return self.key(node)
  80. }
  81. if ret != nil {
  82. return append(k, ret...)
  83. }
  84. }
  85. case hashNode:
  86. return self.next(self.trie.resolveHash(node), key, isIterStart)
  87. }
  88. return nil
  89. }
  90. func (self *Iterator) key(node interface{}) []byte {
  91. switch node := node.(type) {
  92. case shortNode:
  93. // Leaf node
  94. k := remTerm(node.Key)
  95. if vnode, ok := node.Val.(valueNode); ok {
  96. self.Value = vnode
  97. return k
  98. }
  99. return append(k, self.key(node.Val)...)
  100. case fullNode:
  101. if node[16] != nil {
  102. self.Value = node[16].(valueNode)
  103. return []byte{16}
  104. }
  105. for i := 0; i < 16; i++ {
  106. k := self.key(node[i])
  107. if k != nil {
  108. return append([]byte{byte(i)}, k...)
  109. }
  110. }
  111. case hashNode:
  112. return self.key(self.trie.resolveHash(node))
  113. }
  114. return nil
  115. }