What features of D are you using now which you thought you'd never goint to use?
Jonathan M Davis
jmdavisProg at gmx.com
Tue Jun 25 12:21:03 PDT 2013
On Tuesday, June 25, 2013 19:33:32 Timon Gehr wrote:
> On 06/25/2013 07:16 PM, Andrei Alexandrescu wrote:
> > On 6/25/13 4:47 AM, Timon Gehr wrote:
> >> Good point, but takeExactly currently is not a better choice due to its
> >> poor quality of implementation.
> >>
> >> https://github.com/D-Programming-Language/phobos/blob/master/std/range.d#
> >> L2904>
> > What's wrong with it?
> >
> > Andrei
>
> It either has all the overhead of take or does not properly propagate
> the underlying range's capabilities.
I don't think you're taking into account what take does. The primary case when
takeExactly doesn't use take is when the range doesn't define length, in which
case, the best that you can get out of it is a forward range, and that's
exactly what it does.
On the other hand, when take is used, it _does_ propagate the original range's
capabilites appropriately. take was specifically engineered to avoid wrapping
ranges when it doesn't need to, so it shouldn't result in any any extra
overhead if it isn't necessary. In particular, if the range has slicing, then
Take is aliased away to the original type, and a slice is returned. The one
case that I can think of where you really lose out on a range's capabilties
with take is with bidirectional ranges which don't have slicing as they end up
as forward ranges rather than bidirectional ranges, but without slicing, you
can't do better than that.
I suppose that takeExactly's Result type (in the case where it actually
creates its own type) could (and should) forward the primitives associated
with hasMobileElements and hasAssignableElements (which it currently doesn't),
but that's all I can see that's missing.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list