neo-go/pkg/vm/interop_iterators.go

152 lines
2.2 KiB
Go
Raw Normal View History

package vm
import (
"math/big"
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
)
type (
enumerator interface {
Next() bool
Value() stackitem.Item
}
arrayWrapper struct {
index int
value []stackitem.Item
}
byteArrayWrapper struct {
index int
value []byte
}
concatEnum struct {
current enumerator
second enumerator
}
)
2019-11-13 12:29:27 +00:00
type (
iterator interface {
enumerator
Key() stackitem.Item
2019-11-13 12:29:27 +00:00
}
mapWrapper struct {
index int
m []stackitem.MapElement
2019-11-13 12:29:27 +00:00
}
concatIter struct {
current iterator
second iterator
}
keysWrapper struct {
iter iterator
}
valuesWrapper struct {
iter iterator
}
)
func (a *arrayWrapper) Next() bool {
if next := a.index + 1; next < len(a.value) {
a.index = next
return true
}
return false
}
func (a *arrayWrapper) Value() stackitem.Item {
return a.value[a.index]
}
func (a *arrayWrapper) Key() stackitem.Item {
return stackitem.Make(a.index)
}
func (a *byteArrayWrapper) Next() bool {
if next := a.index + 1; next < len(a.value) {
a.index = next
return true
}
return false
}
func (a *byteArrayWrapper) Value() stackitem.Item {
return stackitem.NewBigInteger(big.NewInt(int64(a.value[a.index])))
}
func (a *byteArrayWrapper) Key() stackitem.Item {
return stackitem.Make(a.index)
2019-11-13 12:29:27 +00:00
}
func (c *concatEnum) Next() bool {
if c.current.Next() {
return true
}
c.current = c.second
return c.current.Next()
}
func (c *concatEnum) Value() stackitem.Item {
return c.current.Value()
}
2019-11-13 12:29:27 +00:00
func (i *concatIter) Next() bool {
if i.current.Next() {
return true
}
i.current = i.second
return i.second.Next()
}
func (i *concatIter) Value() stackitem.Item {
2019-11-13 12:29:27 +00:00
return i.current.Value()
}
func (i *concatIter) Key() stackitem.Item {
2019-11-13 12:29:27 +00:00
return i.current.Key()
}
func (m *mapWrapper) Next() bool {
if next := m.index + 1; next < len(m.m) {
2019-11-13 12:29:27 +00:00
m.index = next
return true
}
return false
}
func (m *mapWrapper) Value() stackitem.Item {
return m.m[m.index].Value
2019-11-13 12:29:27 +00:00
}
func (m *mapWrapper) Key() stackitem.Item {
return m.m[m.index].Key
2019-11-13 12:29:27 +00:00
}
func (e *keysWrapper) Next() bool {
return e.iter.Next()
}
func (e *keysWrapper) Value() stackitem.Item {
2019-11-13 12:29:27 +00:00
return e.iter.Key()
}
func (e *valuesWrapper) Next() bool {
return e.iter.Next()
}
func (e *valuesWrapper) Value() stackitem.Item {
2019-11-13 12:29:27 +00:00
return e.iter.Value()
}