I think the idea is interesting.  With regard to safety, I'd recommend that byRef() just take a pointer instead of a ref parameter.  This way, if the address of a stack variable is being taken, it's explicit from the client's side and byRange is only as unsafe as the client's usage of it.<br>
<br><div class="gmail_quote">On Thu, May 19, 2011 at 10:14 AM, Lars Tandle Kyllingstad <span dir="ltr"><<a href="mailto:lars@kyllingen.net">lars@kyllingen.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Below is a simple implementation of a range which iterates another<br>
(input) range by reference, for those cases when using an<br>
InputRangeObject is overkill.  I've used it quite a bit and I find it<br>
immensely useful.<br>
<br>
It is sort of the opposite of save().  Where save() ensures that you are<br>
only consuming a copy of the original range, byRef() ensures that you<br>
are consuming the original range.<br>
<br>
Would this be useful for Phobos?  I guess it is a tad unsafe, since it<br>
stores the address of the range, which may well be stored on the stack.<br>
<br>
<br>
/** Range that iterates another range by reference. */<br>
auto byRef(Range)(ref Range range) if (isInputRange!Range)<br>
{<br>
    static struct ByRef<br>
    {<br>
        private Range* _range;<br>
<br>
        static if (isInfinite!Range)<br>
        {<br>
            enum empty = false;<br>
        }<br>
        else<br>
        {<br>
            @property bool empty() { return (*_range).empty; }<br>
        }<br>
<br>
        @property ElementType!Range front()<br>
        {<br>
            return (*_range).front;<br>
        }<br>
<br>
        void popFront()<br>
        {<br>
            (*_range).popFront();<br>
        }<br>
    }<br>
<br>
    return ByRef(&range);<br>
}<br>
<br>
unittest<br>
{<br>
    auto a = [1, 2, 3, 4];<br>
    auto b = take(byRef(a), 2);<br>
<br>
    assert (equal(b, [1, 2]));<br>
    assert (equal(a, [3, 4]));<br>
}<br>
<br>
<br>
-Lars<br>
<br>
_______________________________________________<br>
phobos mailing list<br>
<a href="mailto:phobos@puremagic.com">phobos@puremagic.com</a><br>
<a href="http://lists.puremagic.com/mailman/listinfo/phobos" target="_blank">http://lists.puremagic.com/mailman/listinfo/phobos</a><br>
</blockquote></div><br>