foreach/opApply

Would it be a) true, and b) helpful if the documentation said something like:

The body of the apply function iterates over the elements it aggregates, 
passing them each to the dg function, an implementation of which is provided by 
the compiler for each opApply overload it encounters. If the dg returns 0, then 
foreach goes on to the next element. If the dg returns a nonzero value, as it 
will if, for example, a break or goto statement is executed in the loop, then 
apply must cease iterating and return that value. Otherwise, after iterating 
across all the elements, apply will return 0. 

The class need not contain an aggregate. The values iterated can be calculated 
in opApply from other class members, though there should be a corresponding 
class member  because of the ref in dg. The following example should make the 
operation of foreach/opApply clear:

import std.stdio;

class Foo
{
    uint orig;
    uint cur;

    this(uint n) { orig = n; cur = n; }

    int opApply(int delegate(ref uint) dg)
    {
       writefln("enter opApply");
       int result = 0;

            for (int i = 0; i < 50; i++)
            {
               result = dg(cur);
          writefln("Result %d", result);
               if (result)
          {
             writefln(i);
             cur = orig;
                       break;
          }
          cur += cur*3;
            }
       writefln("leave opApply");
            return result;
    }
}

void main()
{
   Foo foo = new Foo(3);
   foreach(uint u; foo)
   {
      writefln(u);
      if (u > 200) goto L1;
   }
L1:
   foreach(uint u; foo)
   {
      writefln(u);
      if (u > 10000) break;

   }
   foreach(uint u; foo)
   {
      writefln(u);
      if (u > 10000) break;
      // The delegate takes a ref uint
      u = 0;
      writefln(u);

   }
}


Reply via email to