output ranges: by ref or by value?
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Thu Dec 31 06:58:06 PST 2009
Consider:
R2 copy(R1, R2)(R1 src, R2 tgt) {
foreach (ref e; src) tgt.put(e);
return tgt;
}
Currently output ranges are supposed to define only the put() method.
However, you also want to copy using regular ranges as a target, hence
the shim:
// pseudo-method
void put(R, E)(ref R tgt, E e) {
tgt.front = e;
tgt.popFront();
}
Now copying ranges is possible even when they don't define put().
An example of "pure" output range is ArrayAppender. It doesn't define
anything interesting except put.
The question of this post is the following: should output ranges be
passed by value or by reference? ArrayAppender uses an extra indirection
to work properly when passed by value. But if we want to model built-in
arrays' operator ~=, we'd need to request that all output ranges be
passed by reference.
Any ideas - please share.
Andrei
More information about the Digitalmars-d
mailing list