Creating a Sub-view of a non - RA (hasSlicing) range.

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Sat Jun 30 07:18:02 PDT 2012


On 6/30/12 7:31 AM, monarch_dodra wrote:
> I've been enjoying my time with D's ranges, but something is nagging at
> me: If the range is not random access, then how does one create a
> sub-view of that range?

Use take or takeExactly.

> Say I have a forward range (for example, an SList[]). I would like to
> create a new range containing only the first 5 elements of that old
> range. How can I do that?

take(r, n) or takeExactly(r, n).

> I see no logical reason that prevents me from doing it, since C++
> iterators can do it quite fine.

Actually, not at all. Iterators are a lot worse off than ranges here.

C++'s std::forward_list (and generally any iterator-providing 
singly-linked list) only offers an iterator to the first element. (The 
"end" iterator is a wrapped null pointer. This is by definition of the 
structure - singly-linked lists don't track their last element.)

So if you were to to take 5 elements off a std::forward_list, you can't 
use lst.begin() and lst.begin() + 5 because there's no addition; you'd 
need to define a new iterator type that combines a forward iterator with 
an integer, and iterate using that. It's all painstaking revealing how 
much a range is better for such. This is because the range keeps 
together the iteration limits, whereas iterators insist on the fact that 
the iteration limits belong separately.

> (the C++ algorithms that work only on RA
> ranges is mostly for efficiency reasons). Not being able to do this
> would severely limit the amount of containers that can seamlessly merge
> with algorithms.
>
> For example, I can't call splitter on an SList. Not sure if this is just
> "not currently supported", or just not possible...
>
> Any thoughts?

It must be very well understood what the structural limits of 
singly-linked lists impose on their iteration. There's no way to take 5 
elements off a SList and pretend that's pretty much the same as taking 
the whole list.

We could build a design for using splitter with SLists only if the 
element type of splitter's result is different from SList's native range.


Andrei


More information about the Digitalmars-d mailing list