[phobos] Slicer

Andrei Alexandrescu andrei at erdani.com
Fri Aug 13 11:04:16 PDT 2010


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


More information about the phobos mailing list