SListRange, Ranges, costructors
bearophile
bearophileHUGS at lycos.com
Tue Apr 13 14:47:39 PDT 2010
> 1) I've seen that the Node struct inside std.range.SListRange is not a
> static struct, is it a small bug?
Bug 4087. Currently it's not a bug.
> 2) In that List(T) I've used the Range protocol. But I've had to
> add a reset() function too. Isn't it useful for foreach() to call
> a function similar to reset() (if present) at the begin of the
> iteration, to set the variables necessary for the iteration?
I've taken a look at SListRange, and it seems the p pointer is useless, this works, and there is no need for the reset():
import std.stdio;
struct List(T) {
static struct Node {
T data;
Node* next;
this(T d, Node* p) {
data = d;
next = p;
}
}
Node* lh;
this(T[] arr) {
foreach_reverse (el; arr)
lh = new Node(el, lh);
}
bool empty() { return !lh; }
T front() { return lh.data; }
void popFront() { lh = lh.next; }
}
void main() {
List!int items = [1, 2, 3];
foreach (x; items) write(x, " "); // prints 1 2 3
writeln();
assert(items.lh);
foreach (x; items) write(x, " "); // prints 1 2 3
}
But I feel dumb and I don't understand, why isn't lh null at the end of the first foreach?
> 3) The stack initalization of a struct has some built-in sugar,
> while to allocate the struct on the stack you need a this() method:
Enhancement request 4086.
Bye,
bearophile
More information about the Digitalmars-d
mailing list