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...).