Can you elaborate on this? Why aren&#39;t you sure this is a wise idea?<br><br><div class="gmail_quote"><div dir="ltr">On Thu, Dec 8, 2016 at 16:19 Dave Abrahams via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br class="gmail_msg">
on Thu Dec 08 2016, Alexis Beingessner &lt;<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br class="gmail_msg">
<br class="gmail_msg">
&gt;&gt; On Dec 8, 2016, at 3:50 PM, Dave Abrahams via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br class="gmail_msg">
&gt;&gt;<br class="gmail_msg">
&gt;&gt;<br class="gmail_msg">
&gt;&gt; on Thu Dec 08 2016, Ben Cohen &lt;ben_cohen-AT-apple.com&gt; wrote:<br class="gmail_msg">
&gt;&gt;<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt;&gt;&gt;&gt; On Dec 2, 2016, at 8:27 PM, Nate Cook &lt;<a href="mailto:natecook@gmail.com" class="gmail_msg" target="_blank">natecook@gmail.com</a>&gt; wrote:<br class="gmail_msg">
&gt;&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt; On Dec 2, 2016, at 2:12 PM, Ben Cohen via swift-evolution<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt; &lt;<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a> &lt;mailto:<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a>&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt; wrote:<br class="gmail_msg">
&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt;&gt; On Dec 1, 2016, at 11:33 PM, Nate Cook via swift-evolution<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt;&gt; &lt;<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a> &lt;mailto:<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a>&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt;&gt; wrote:<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt;&gt; 3) Make all buffer pointers their own slices but use a different<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt;&gt; index type. If the indices were just wrapped pointers, that would<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt;&gt; handle the index sharing without needing an additional property on<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt;&gt; the buffer. We could also maintain integer-based stridable<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt;&gt; conformance (which greatly simplifies index arithmetic), since the<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt;&gt; indices would just offset by a byte for raw buffers or a stride<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt;&gt; for typed buffers.<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt; Unfortunately, switching to non-integer indices would change this<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt; from being mildly source-breaking to being extremely<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt; source-breaking, as there’s lots of code out there using buffers<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt; today indexing them with integers (including integer literals).<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt; The big win with UnsafeBufferPointer having an integer index is<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt; it’s a drop-in replacement for arrays, so when you hit a<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt; performance problem using an array you can quickly switch to using<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt; a buffer under most circumstances instead without having to change<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt; much of your code – including code that uses for i in<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt; 0..&lt;myArray.count, of which there is a lot out there in the<br class="gmail_msg">
&gt;&gt;&gt;&gt;&gt; wild. Switching to an opaque index would break anyone doing that.<br class="gmail_msg">
&gt;&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt;&gt; It is definitely very source-breaking, though with relatively simple fixits:<br class="gmail_msg">
&gt;&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt;&gt;    buf[0] ---&gt; buf[buf.startIndex]<br class="gmail_msg">
&gt;&gt;&gt;&gt;    buf[3] ---&gt; buf[buf.startIndex + 3]<br class="gmail_msg">
&gt;&gt;&gt;&gt;    buf[i] ---&gt; buf[buf.startIndex + i]<br class="gmail_msg">
&gt;&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt;&gt; Any integer arithmetic happening outside the subscript could be left<br class="gmail_msg">
&gt;&gt;&gt;&gt; unchanged. If that cost isn&#39;t worth the benefit, then making<br class="gmail_msg">
&gt;&gt;&gt;&gt; UnsafeRawBufferPointer use Slice as its slice type is probably the<br class="gmail_msg">
&gt;&gt;&gt;&gt; best way to resolve that issue.<br class="gmail_msg">
&gt;&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt;&gt; Nate<br class="gmail_msg">
&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt; The fixits aren’t quite that simple for slices, though:<br class="gmail_msg">
&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt;    let slice = buf[3..&lt;6]<br class="gmail_msg">
&gt;&gt;&gt;    slice[3] —&gt; slice[slice.startIndex + 0] // fixit would somehow need to know this is 0 not 3<br class="gmail_msg">
&gt;&gt;&gt;    slice[i] —&gt; slice[slice.startIndex + ??] // or even need to<br class="gmail_msg">
&gt;&gt;&gt; know this is, erm, I haven’t had enough coffee this morning<br class="gmail_msg">
&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt; The other downside is it would thwart speculatively switching an Array<br class="gmail_msg">
&gt;&gt;&gt; to an UnsafeBuffer to see if that was a bottleneck, then switching<br class="gmail_msg">
&gt;&gt;&gt; back.<br class="gmail_msg">
&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt;&gt; On Dec 1, 2016, at 11:33 PM, Nate Cook via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br class="gmail_msg">
&gt;&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt;&gt; 1) Switch to using Slice as a wrapper for UnsafeRawBufferPointer.<br class="gmail_msg">
&gt;&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt; Based on the above, it seems like this is the least bad option, and we<br class="gmail_msg">
&gt;&gt;&gt; need to do this ASAP as currently UnsafeRawBufferPointer is<br class="gmail_msg">
&gt;&gt;&gt; non-compliant with the requirements of slicing and needs changing<br class="gmail_msg">
&gt;&gt;&gt; before it’s more widely adopted.<br class="gmail_msg">
&gt;&gt;<br class="gmail_msg">
&gt;&gt; Or we could say that UnsafeRawBufferPointer isn&#39;t a Collection.  Making<br class="gmail_msg">
&gt;&gt; it a Collection in the first place has always seemed suspect to me.<br class="gmail_msg">
&gt;&gt;<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt; If this is considered a viable option, it&#39;s the one I want. Passing<br class="gmail_msg">
&gt; types without bounds checks into generic &quot;safe&quot; code shouldn&#39;t be this<br class="gmail_msg">
&gt; easy.<br class="gmail_msg">
<br class="gmail_msg">
I don&#39;t think I agree, but that&#39;s a separate argument, about<br class="gmail_msg">
UnsafeBufferPointer.  This is about passing *untyped* memory without<br class="gmail_msg">
bounds checks.<br class="gmail_msg">
<br class="gmail_msg">
&gt; You should need to explicitly wrap it up in something safe. And I<br class="gmail_msg">
&gt; really don&#39;t want the known-to-be-error-prone indexing model in<br class="gmail_msg">
&gt; concrete unsafe code.<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
--<br class="gmail_msg">
-Dave<br class="gmail_msg">
<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
swift-evolution mailing list<br class="gmail_msg">
<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="gmail_msg">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" class="gmail_msg" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="gmail_msg">
</blockquote></div>