From 16ff6e989e170ea0c3a0dcda48a2da2a0d40d188 Mon Sep 17 00:00:00 2001 From: "Ric (Ryszard) Szopa" Date: Sun, 8 Sep 2013 01:34:20 -0700 Subject: [PATCH] Add StatefulIterator, fix bug in DataCallbackIterator. --- iterator.go | 58 ++++++++++++++++++++++++++++++++++++++++++++++-- iterator_test.go | 48 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 2 deletions(-) diff --git a/iterator.go b/iterator.go index e5ffe8f..d931e5d 100644 --- a/iterator.go +++ b/iterator.go @@ -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) } } @@ -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} +} diff --git a/iterator_test.go b/iterator_test.go index 82a40b3..080eb6c 100644 --- a/iterator_test.go +++ b/iterator_test.go @@ -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() + } + } +}