But this would lead to boilerplate and inefficiency in cases where slicing isn&#39;t needed.  Ranges that don&#39;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&#39;t think it&#39;s reasonable to pay for it (both in execution efficiency and boilerplate code) when it&#39;s not going to be used.<br>
<br><div class="gmail_quote">On Fri, Aug 13, 2010 at 2:04 PM, Andrei Alexandrescu <span dir="ltr">&lt;<a href="mailto:andrei@erdani.com">andrei@erdani.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
I&#39;d favor simplicity by just requiring random-access ranges to define slicing.<br>
<br>
Andrei<br>
<br>
David Simcha wrote:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div class="im">
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 &quot;just work&quot; even if it&#39;s slightly inefficient and intervention should be required only if the programmer decides it needs to be optimized.<br>

<br></div><div><div></div><div class="h5">
On Fri, Aug 13, 2010 at 1:02 PM, Jonathan M Davis &lt;<a href="mailto:jmdavisprog@gmail.com" target="_blank">jmdavisprog@gmail.com</a> &lt;mailto:<a href="mailto:jmdavisprog@gmail.com" target="_blank">jmdavisprog@gmail.com</a>&gt;&gt; wrote:<br>

<br>
    On Thursday, August 12, 2010 20:24:03 David Simcha wrote:<br>
     &gt; A whole bunch of stuff in Phobos (including std.range.Radial and<br>
    the FFT<br>
     &gt; algorithm I just checked in) requires that ranges provided to it have<br>
     &gt; slicing.  This limitation is a PITA.  Should we add a Slicer<br>
    meta-range<br>
     &gt; that takes a finite random-access range and bolts slicing on in the<br>
     &gt; obvious but relatively inefficient way if it&#39;s not already<br>
    supported and<br>
     &gt; simply returns the range if it already supports slicing?  This<br>
    would be<br>
     &gt; used under the hood when slicing is required.  For example:<br>
     &gt;<br>
     &gt; struct Slicer(R) if(isRandomAccessRange!R &amp;&amp; !hasSlicing!R) {<br>
     &gt;      R range;<br>
     &gt;      size_t lowerLim, upperLim;<br>
     &gt;<br>
     &gt;      this(R r) {<br>
     &gt;           this.range = range;<br>
     &gt;           this.upperLim = range.length;<br>
     &gt;      }<br>
     &gt;<br>
     &gt;      // Range primitives:  front, popFront, etc.<br>
     &gt;<br>
     &gt;      typeof(this) opSlice(size_t lower, size_t upper) {<br>
     &gt;          // Error checking<br>
     &gt;          auto ret = this;<br>
     &gt;          ret.upperLim -= this.length - upper;<br>
     &gt;          ret.lowerLim += lower;<br>
     &gt;          return ret;<br>
     &gt;      }<br>
     &gt; }<br>
     &gt;<br>
     &gt; auto slicer(R)(R range) {<br>
     &gt;      static if(hasSlicing!R) {<br>
     &gt;          return range;<br>
     &gt;      } else {<br>
     &gt;           return Slicer!(R)(range);<br>
     &gt;      }<br>
     &gt; }<br>
     &gt; _______________________________________________<br>
     &gt; phobos mailing list<br></div></div>
     &gt; <a href="mailto:phobos@puremagic.com" target="_blank">phobos@puremagic.com</a> &lt;mailto:<a href="mailto:phobos@puremagic.com" target="_blank">phobos@puremagic.com</a>&gt;<div class="im"><br>
     &gt; <a href="http://lists.puremagic.com/mailman/listinfo/phobos" target="_blank">http://lists.puremagic.com/mailman/listinfo/phobos</a><br>
<br>
    I&#39;m not sure I like the idea that this would be done without programmer<br>
    intervention. If it&#39;s inefficient, it&#39;ll lead to programmers using<br>
    range types<br>
    with algorithms that really aren&#39;t supposed to take those range<br>
    types and<br>
    without them realizing the fact that it&#39;s inefficient. Having a<br>
    means to allow the<br>
    programmer to wrap a range to allow it to be used by an algorithm<br>
    which it<br>
    wouldn&#39;t normally work with may be a good idea, but each algorithm<br>
    takes certain<br>
    types of ranges for a reason, and I&#39;d hate to see much impact to<br>
    efficiency<br>
    because of internal range wrangling that the programmer using the<br>
    function isn&#39;t<br>
    even aware of.<br>
<br>
    - Jonathan M Davis<br>
    _______________________________________________<br>
    phobos mailing list<br></div>
    <a href="mailto:phobos@puremagic.com" target="_blank">phobos@puremagic.com</a> &lt;mailto:<a href="mailto:phobos@puremagic.com" target="_blank">phobos@puremagic.com</a>&gt;<div class="im"><br>
    <a href="http://lists.puremagic.com/mailman/listinfo/phobos" target="_blank">http://lists.puremagic.com/mailman/listinfo/phobos</a><br>
<br>
<br>
<br></div>
------------------------------------------------------------------------<div class="im"><br>
<br>
_______________________________________________<br>
phobos mailing list<br>
<a href="mailto:phobos@puremagic.com" target="_blank">phobos@puremagic.com</a><br>
<a href="http://lists.puremagic.com/mailman/listinfo/phobos" target="_blank">http://lists.puremagic.com/mailman/listinfo/phobos</a><br>
</div></blockquote><div><div></div><div class="h5">
_______________________________________________<br>
phobos mailing list<br>
<a href="mailto:phobos@puremagic.com" target="_blank">phobos@puremagic.com</a><br>
<a href="http://lists.puremagic.com/mailman/listinfo/phobos" target="_blank">http://lists.puremagic.com/mailman/listinfo/phobos</a><br>
</div></div></blockquote></div><br>