DMD Bug or not? foreach over struct range

Era Scarecrow rtcvb32 at yahoo.com
Wed May 16 00:24:23 PDT 2012


On Wednesday, 16 May 2012 at 07:04:09 UTC, Jonathan M Davis wrote:
> that assertion would pass, but it doesn't, and it shouldn't. If 
> your range was a reference type (e.g. if it were a class or it 
> was like the ranges in std.stdio which deal with I/O), then 
> using it with foreach would consume it, but that won't happen 
> with a value type range.

  Then perhaps I'm missing something. Some time ago (6 months?) I 
submitted a similar example of this to walter; a little prime 
walking range-like struct that acts like a range. It may contain 
an AA, but otherwise basic structure isn't far from his...

  Could you explain why mine works and his doesn't? (Extras taken 
out proving ever number is a prime)

---
import std.stdio;

struct prime_walk {
   int map[int];
   int position = 2;
   int cap = int.max;

   int front() {
     return position;
   }

   void popFront() {
     //where the real work is done.

     if ((position & 1) == 0) {
       position++;
     } else if (position >= cap) {
       throw new Exception("Out of bounds!");
     } else {
       int div = position;
       int p2 = position * 3;

       //current spot IS a prime. So...
       if (p2 < cap)
         map[p2] = div;

       position += 2;

       //identify marked spot, if so we loop again.
       while (position in map) {
         div = map[position];
         map.remove(position);
         p2 = position;
         do
           p2 += div * 2;
         while (p2 in map);

         position += 2;
         if (p2 <= cap)  //skip out, no need to save larger than 
needed values.
           map[p2] = div;
       }
     }
   }

   bool empty() {
     return position >= cap;
   }
}

void main() {
   prime_walk pw;
   pw.cap = 100;
   foreach(i; pw)
     writeln(i);
}



More information about the Digitalmars-d-learn mailing list