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