]> Cypherpunks repositories - gostls13.git/commitdiff
container/ring: Replace Iter() with Do().
authorKyle Consalus <consalus@gmail.com>
Wed, 9 Feb 2011 04:07:05 +0000 (20:07 -0800)
committerRobert Griesemer <gri@golang.org>
Wed, 9 Feb 2011 04:07:05 +0000 (20:07 -0800)
Faster in most cases, and not prone to memory leaks. Named "Do" to match with similarly named method on Vector.

R=gri
CC=golang-dev
https://golang.org/cl/4134046

src/pkg/container/ring/ring.go
src/pkg/container/ring/ring_test.go

index 335afbc3cc546db23a8cc0ca3be6219134c1ef67..5925164e9db5f6c0e59dc4608bd22f2857ff753f 100644 (file)
@@ -138,16 +138,13 @@ func (r *Ring) Len() int {
 }
 
 
-func (r *Ring) Iter() <-chan interface{} {
-       c := make(chan interface{})
-       go func() {
-               if r != nil {
-                       c <- r.Value
-                       for p := r.Next(); p != r; p = p.next {
-                               c <- p.Value
-                       }
+// Do calls function f on each element of the ring, in forward order.
+// The behavior of Do is undefined if f changes *r.
+func (r *Ring) Do(f func(interface{})) {
+       if r != nil {
+               f(r.Value)
+               for p := r.Next(); p != r; p = p.next {
+                       f(p.Value)
                }
-               close(c)
-       }()
-       return c
+       }
 }
index ee3c411283c86abc985c8bbb81b0c4396a180daa..778c083d02bfd4ec65560ef9fe508b6c99bcf9f8 100644 (file)
@@ -35,12 +35,12 @@ func verify(t *testing.T, r *Ring, N int, sum int) {
        // iteration
        n = 0
        s := 0
-       for p := range r.Iter() {
+       r.Do(func(p interface{}) {
                n++
                if p != nil {
                        s += p.(int)
                }
-       }
+       })
        if n != N {
                t.Errorf("number of forward iterations == %d; expected %d", n, N)
        }
@@ -128,16 +128,6 @@ func makeN(n int) *Ring {
        return r
 }
 
-
-func sum(r *Ring) int {
-       s := 0
-       for p := range r.Iter() {
-               s += p.(int)
-       }
-       return s
-}
-
-
 func sumN(n int) int { return (n*n + n) / 2 }