On 12/21/2011 04:54 PM, pompei2 wrote:
Hello.

I want to add the option to iterate objects of my class using foreach. I
need them to be iterable as view-only const and as mutable too. I would
prefer to iterate using the "return a delegate" but if that's not
possible, ranges are fine too. Also, I'd prefer a template-less solution
over a templated one.


This is what I have, which works but has severe code duplication. I
hoped inout would help me here, but I just can't figure it out. I also
gave a try to ranges, but same thing again: I can only get it to work if
I define my things twice.

(syntax highlight for the coming month: http://pastebin.com/TNmWWgsj)


import std.conv, std.stdio;

class Container
{
this(int from, int to)
{
while(from <= to) {
_arr ~= from;
from++;
}
}

// FIXME: severe code duplication for const/nonconst/ref
// and I'm not even trying immutable yet
int delegate(int delegate(ref int)) doIter()
{
writeln("calling non-const");

int doTheIter(int delegate(ref int) dg)
{
int result = 0;
foreach(ref i ; this._arr) {
result = dg(i);
if(result)
break;
}
return result;
}

return &doTheIter;
}

int delegate(int delegate(ref int)) doIter() const
{
writeln("calling const");

int doTheIter(int delegate(ref int) dg)
{
int result = 0;
foreach(i ; this._arr) {
result = dg(i);
if(result)
break;
}
return result;
}

return &doTheIter;
}

int[] _arr;
}

int main(string[] args)
{
Container c = new Container(1, 9);
const Container cc = c;

foreach(ref e ; c.doIter()) {
writeln(e);
e++;
}

foreach(e ; cc.doIter()) {
writeln(e);
}

return 0;
}


Just remove the non-const overload. const member functions work with mutable, immutable and const receivers.

Reply via email to