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

Reply via email to