[phobos] auto ref
Andrei Alexandrescu
andrei at erdani.com
Wed Jun 23 08:42:17 PDT 2010
Yes, we should convert all of those ugly mixin strings to auto ref. The
matter is a bit more complicated; allow me to share some recent findings
I made.
There are several kinds of ranges:
1. Unsealed:
struct UnsealedRange(T)
{
@property bool empty();
@property ref T front();
void popFront();
}
Such ranges simply expose the address of their elements.
2. Sealed without assignment:
struct SealedNonAssigningRange(T)
{
@property bool empty();
@property T front();
T moveFront();
void popFront();
}
Such ranges offer non-ref access to front() but must also offer
moveFront() to extract the front destructively. Without moveFront(),
ranges over expensive-to-copy types make it impossible to implement many
algorithms efficiently.
3. Sealed with assignment
struct SealedNonAssigningRange(T)
{
@property bool empty();
@property T front();
T moveFront();
@property void front(T);
void popFront();
}
The ideas generalize to forward, bidirectional, and random-access ranges.
In an ideal world it should be very easy for a higher-order range (i.e.
one built on top of another range) to detect all of these circumstances
and generate code accordingly. Ideas are welcome. Perhaps some clever
mixins could help. At any rate, it looks to me like auto ref will be an
important part of the solution, but not all of it.
Andrei
On 06/23/2010 10:17 AM, David Simcha wrote:
> I noticed when I was fixing std.range this morning that a lot of
> opportunities to use auto ref aren't taken advantage of. Is there any
> reason for this that still applies? If not, should all of std.range be
> converted to auto ref so we can finally send all the bugs related to
> rvalue vs. lvalue returns that have plagued std.range to the ash heap of
> history?
>
>
>
> _______________________________________________
> phobos mailing list
> phobos at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/phobos
More information about the phobos
mailing list