Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 56 additions & 2 deletions iterator.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ func IntCallbackIterator(cb func(int)) {
}
}
func DataCallbackIterator(cb func(int)) {
for _, val := range int_data {
cb(val)
for _, val := range struct_data {
cb(val.foo)
}
}

Expand Down Expand Up @@ -109,3 +109,57 @@ func DataClosureIterator() (func() (int, bool), bool) {
return struct_data[prev_idx].foo, (idx < data_len)
}, (idx < data_len)
}

type StatefulIterator interface {
Value() int
Next() bool
}

type dataStatefulIterator struct {
current int
data []*Data
}

func NewDataStatefulIterator(data []*Data) *dataStatefulIterator {
return &dataStatefulIterator{data: data, current: -1}
}

func NewDataStatefulIteratorInterface(data []*Data) StatefulIterator {
return &dataStatefulIterator{data: data, current: -1}
}

func (it *dataStatefulIterator) Value() int {
return it.data[it.current].foo
}
func (it *dataStatefulIterator) Next() bool {
it.current++
if it.current >= len(it.data) {
return false
}
return true
}

type intStatefulIterator struct {
current int
data []int
}

func (it *intStatefulIterator) Value() int {
return it.data[it.current]
}
func (it *intStatefulIterator) Next() bool {
it.current++

if it.current >= len(it.data) {
return false
}
return true
}

func NewIntStatefulIterator(data []int) *intStatefulIterator {
return &intStatefulIterator{data: data, current: -1}
}

func NewIntStatefulIteratorInterface(data []int) StatefulIterator {
return &intStatefulIterator{data: data, current: -1}
}
48 changes: 48 additions & 0 deletions iterator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,3 +91,51 @@ func BenchmarkDataClosureIterator(b *testing.B) {
}
}
}

func BenchmarkIntStatefulIterator(b *testing.B) {
InitInts()
b.ResetTimer()
for i := 0; i < b.N; i++ {
var sum int = 0
it := NewIntStatefulIterator(int_data)
for it.Next() {
sum += it.Value()
}
}
}

func BenchmarkDataStatefulIterator(b *testing.B) {
InitData()
b.ResetTimer()
for i := 0; i < b.N; i++ {
var sum int = 0
it := NewDataStatefulIterator(struct_data)
for it.Next() {
sum += it.Value()
}
}
}

func BenchmarkIntStatefulIteratorInterface(b *testing.B) {
InitInts()
b.ResetTimer()
for i := 0; i < b.N; i++ {
var sum int = 0
it := NewIntStatefulIteratorInterface(int_data)
for it.Next() {
sum += it.Value()
}
}
}

func BenchmarkDataStatefulIteratorInterface(b *testing.B) {
InitData()
b.ResetTimer()
for i := 0; i < b.N; i++ {
var sum int = 0
it := NewDataStatefulIteratorInterface(struct_data)
for it.Next() {
sum += it.Value()
}
}
}