[phobos] Slicer

David Simcha dsimcha at gmail.com
Fri Aug 13 14:19:34 PDT 2010


But this would lead to boilerplate and inefficiency in cases where slicing
isn't needed.  Ranges that don't have a better way of dealing with slicing
would have to have lowerLim and upperLim variables and add lowerLim every
time the range was indexed.  While I think the overhead of this is
reasonable if the alternative is an algorithm simply not working, I don't
think it's reasonable to pay for it (both in execution efficiency and
boilerplate code) when it's not going to be used.

On Fri, Aug 13, 2010 at 2:04 PM, Andrei Alexandrescu <andrei at erdani.com>wrote:

> I'd favor simplicity by just requiring random-access ranges to define
> slicing.
>
> Andrei
>
> David Simcha wrote:
>
>> I would agree if we were talking about big-O efficiency, or even a large
>> constant overhead, but IMHO avoiding Slicer is a micro-optimization, not a
>> macro-optimization.  Therefore, by default it should "just work" even if
>> it's slightly inefficient and intervention should be required only if the
>> programmer decides it needs to be optimized.
>>
>> On Fri, Aug 13, 2010 at 1:02 PM, Jonathan M Davis <jmdavisprog at gmail.com<mailto:
>> jmdavisprog at gmail.com>> wrote:
>>
>>    On Thursday, August 12, 2010 20:24:03 David Simcha wrote:
>>     > A whole bunch of stuff in Phobos (including std.range.Radial and
>>    the FFT
>>     > algorithm I just checked in) requires that ranges provided to it
>> have
>>     > slicing.  This limitation is a PITA.  Should we add a Slicer
>>    meta-range
>>     > that takes a finite random-access range and bolts slicing on in the
>>     > obvious but relatively inefficient way if it's not already
>>    supported and
>>     > simply returns the range if it already supports slicing?  This
>>    would be
>>     > used under the hood when slicing is required.  For example:
>>     >
>>     > struct Slicer(R) if(isRandomAccessRange!R && !hasSlicing!R) {
>>     >      R range;
>>     >      size_t lowerLim, upperLim;
>>     >
>>     >      this(R r) {
>>     >           this.range = range;
>>     >           this.upperLim = range.length;
>>     >      }
>>     >
>>     >      // Range primitives:  front, popFront, etc.
>>     >
>>     >      typeof(this) opSlice(size_t lower, size_t upper) {
>>     >          // Error checking
>>     >          auto ret = this;
>>     >          ret.upperLim -= this.length - upper;
>>     >          ret.lowerLim += lower;
>>     >          return ret;
>>     >      }
>>     > }
>>     >
>>     > auto slicer(R)(R range) {
>>     >      static if(hasSlicing!R) {
>>     >          return range;
>>     >      } else {
>>     >           return Slicer!(R)(range);
>>     >      }
>>     > }
>>     > _______________________________________________
>>     > phobos mailing list
>>     > phobos at puremagic.com <mailto:phobos at puremagic.com>
>>
>>     > http://lists.puremagic.com/mailman/listinfo/phobos
>>
>>    I'm not sure I like the idea that this would be done without programmer
>>    intervention. If it's inefficient, it'll lead to programmers using
>>    range types
>>    with algorithms that really aren't supposed to take those range
>>    types and
>>    without them realizing the fact that it's inefficient. Having a
>>    means to allow the
>>    programmer to wrap a range to allow it to be used by an algorithm
>>    which it
>>    wouldn't normally work with may be a good idea, but each algorithm
>>    takes certain
>>    types of ranges for a reason, and I'd hate to see much impact to
>>    efficiency
>>    because of internal range wrangling that the programmer using the
>>    function isn't
>>    even aware of.
>>
>>    - Jonathan M Davis
>>    _______________________________________________
>>    phobos mailing list
>>    phobos at puremagic.com <mailto:phobos at puremagic.com>
>>
>>    http://lists.puremagic.com/mailman/listinfo/phobos
>>
>>
>>
>> ------------------------------------------------------------------------
>>
>>
>> _______________________________________________
>> phobos mailing list
>> phobos at puremagic.com
>> http://lists.puremagic.com/mailman/listinfo/phobos
>>
> _______________________________________________
> phobos mailing list
> phobos at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/phobos
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/phobos/attachments/20100813/a83aae9a/attachment.html>


More information about the phobos mailing list