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

BicMedium via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue May 27 05:18:13 PDT 2014


On Tuesday, 27 May 2014 at 11:43:12 UTC, monarch_dodra wrote:
> 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.

My Q was not accurate enough. Maybe I'll ask something more 
concret in another one. BTW the 2nd and the 3rd assertions are 
exactly what fails when I try to test an algo (isInputRange!Range 
or isOutputRange!Range pass but has the test doesn't know about 
the implementation I can't know If it's really working...I mean 
that those tests are just like testing an interface...).


More information about the Digitalmars-d-learn mailing list