On Tuesday, 29 January 2013 at 22:44:35 UTC, Robert Schadek wrote:
On 01/29/2013 09:20 PM, monarch_dodra wrote:
3. Nitpick: Don't use parenthesis for single arg templates:
No: "Deque!(int)"
yes: "Deque!int"
May I ask why? Both are correct after all. Or is it just the
preferred style?
It's just style, and a nitpick. Feel free to ignore it.
5. Users expect "opSlice()" to produce an actual range. You
are using it to deep copy the deck. This goes against your
comment in regards to slicing an iterator. Just have your
"opSlice()" do the same as what "range()" does, and get rid of
"range()". This is the usage I'd expect:
//----
Deque!int de = ... ;
Iterator!int it = de[];
writeln(it);
//----
I submitted a bug report for sort recently (9091 became 8368).
monarchdodra said (and pointed to source) that opSlice should
return the same type in respect to the called object.
Yes, 9071. I remember it quite well, and it was the first thing
that came to mind the instant I saw your your code.
What I said is that for a *range* to offer correct *hasSlicing*
primitive, then the "opSlice(size_t, size_t)" primitive must
return the same type.
Deque is not a range though, Iterator is, and we're talking about
the primitive "opSlice()"
Again: this is a Container vs Range issue.
For example, built-in arrays also have this scheme.
//----
//statarr is a static array. A container. statarr is NOT a range.
int[5] statarr = [0, 1, 2, 3, 4];
//dynarrX are ranges extracted from their container
int[] dynarr1 = statarr[];
int[] dynarr2 = statarr[1 .. 3];
//----
As you can see, "int[]" != "int[5]"