On Thursday, 18 October 2012 at 07:09:04 UTC, Don Clugston wrote:
On 17/10/12 23:41, H. S. Teoh wrote:

Is it actually orthogonal? Is it possible for a forward range to be transient?

Or is it an intermediate concept?
TransientInputRange -> NonTransientInputRange -> ForwardRange

Save just means the range can save its position. If it is returning via a buffer, Forward of not, it is going to be transient.

Take this forward range, that returns the strings "A", "B" and "C" ad infinitum:

//----
enum _ABC = "ABC";

struct ABC
{
    char[1] buf = _ABC[0];
    size_t i;

    enum empty = false;
    @property char[] front(){return buf;}
    void popFront()
    {
        ++i;
        buf[0] = _ABC[i%3];
    }
    @property ABC save()
    {
        return this;
    }
}
//----

This is a perfectly valid range, which you can save, but the returned string is transient:

//----
void main()
{
  ABC abc;

  writeln("Printing 10 elements: ");
  abc.take(10).writeln('\n');

  writeln("Duplicating range");
  auto abc2 = abc.save;
  abc.popFront;
  foreach(v; zip(abc, abc2).take(5))
    write("[", v[0], ", ", v[1], "]");
  writeln('\n');

  writeln("Prnting two consecutive elements:");
  auto first = abc.front;
  abc.popFront();
  auto second = abc.front;
  writeln("[", first, ", ", second, "]");
}
//----

Produces:

//----
Printing 10 elements:
["A", "B", "C", "A", "B", "C", "A", "B", "C", "A"]

Duplicating range
[B, A][C, B][A, C][B, A][C, B]

Prnting two consecutive elements:
[C, C]
//----

As you can see, you can perfectly iterate.
You can perfectly save the range. The saved range can be used to backtrack. But if you attempt to store two consecutive fronts, things don't go well.

The same holds true for a Random Access range BTW.

Iteration and transient-ness of returned value are orthogonal concepts

Reply via email to