What are the best std algo for testing a range implementation ?

monarch_dodra via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue May 27 04:43:11 PDT 2014


On Tuesday, 27 May 2014 at 10:50:54 UTC, BicMedium wrote:
> Let's say I have a set of containers, using a 
> D-unfriendly-semantic. They rather use a kind of ADA vocabulary 
> (according to https://en.wikipedia.org/wiki/Deque). I want to 
> make them "range-aware".
>
> If the input/output ranges are easy to implement(so it's just 
> reading/writing an element, keeping an index for the writer and 
> another for the reader, and reseting it, isn't it ? So if 
> (isInputRange!MyCont && isOutputRange!MyCont) then it's a 
> "Deque", right ?).
> The bidirectionnal ranges or the forward ranges become more 
> difficult to interpret with the idioms I 
> use(Insert,Add,Remove)...Is this a kind of 3rd plane ("time": 
> "return to previous state", "make a backup": copy/roll-back - 
> undo/redo ?)

Just keep in mind that a container is not a range. A container is 
an object that can hold items, and you can add and remove items 
from said object. The Range is a way to iterate your container.

For example, a range definitely does NOT make insertion, removals 
or duplactes of your items. You can "save" a range, but that's 
NOT the same thing as making a duplicate of your container that 
you can roll back.

I'd suggest you take a look at std.container.array to see what 
I'm talking about.

> Could you recommend me the algos from std.algo to test 
> efficiently my implementations ? (example, if you want to be 
> sure that the input ranges work then you'd use this...if you 
> want to be sure that output ranges work then you'd use that 
> ...Some kind of "reference" unit tests ?). At the present time, 
> each time I try one I get rejected by the template 
> constraints...

If the algos are turning you down, then you must have missed 
something. Check that:
alias Range = YourRangeTypeHere;
static assert(isInputRange!Range);
static assert(isForwardRange!Range);
static assert(isBidirectionalRange!Range);
static assert(hasLength!Range);
static assert(isRandomAccessRange!Range);
static assert(hasSlicing!Range);

At the *very least*, the first 3 should pass for a deque. The 3 
others depend on what primitives you want to offer.


More information about the Digitalmars-d-learn mailing list