<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body><div>This sounds like a sensible idea. But there is one behavioral change you haven't addressed, which is that this changes how indexes work on the slice. With all other slice types that come to mind, the slice shares the same indexes as the base, e.g.<br></div>
<div><br></div>
<div>&nbsp; let ary = Array(0..&lt;10)<br></div>
<div>&nbsp; print(ary[3]) // prints 3<br></div>
<div>&nbsp; print(ary[2..&lt;5][3]) // still prints 3</div>
<div><br></div>
<div>UnsafeBufferPointer is indexed using 0-based integers, so with your proposal, slicing an UnsafeBufferPointer produces a value that uses different indexes. We could solve this by adding a new field, but that would break the expectation that startIndex is always zero. But we can't just ignore this problem, because algorithms that are designed around collections may assume that slices preserve indexes.<br></div>
<div><br></div>
<div>In addition, since you point out that UnsafeRawBufferPointer is already its own subsequence, and that type also guarantees that startIndex is always zero, it sounds like we already have an instance of this problem in the stdlib, and so this needs to be addressed with UnsafeRawBufferPointer as well.<br></div>
<div><br></div>
<div>-Kevin Ballard</div>
<div><br></div>
<div>On Wed, Nov 30, 2016, at 09:15 AM, Nate Cook via swift-evolution wrote:<br></div>
<blockquote type="cite"><p style="margin-top: 0px; margin-bottom: 16px;"><span class="highlight" style="background-color:rgb(255, 255, 255)"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"><span class="size" style="font-size:16px">Hello all—</span></span></span></span><br></p><p style="margin-top: 0px; margin-bottom: 16px;"><span class="highlight" style="background-color:rgb(255, 255, 255)"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"><span class="size" style="font-size:16px">This is a proposal for a fairly minor change in slicing behavior for unsafe buffers.</span></span></span></span><br></p><p style="margin-top: 0px; margin-bottom: 16px;"><span class="highlight" style="background-color:rgb(255, 255, 255)"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"><span class="size" style="font-size:16px">Nate</span></span></span></span><br></p><div><br></div>
<div>------<br></div>
<div><br></div>
<div><br></div>
<div><span class="highlight" style="background-color:rgb(255, 255, 255)"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"><span class="size" style="font-size:16px">This proposal changes Swift's typed&nbsp;</span></span></span></span><code style="color:rgb(51, 51, 51);font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;padding-top:0.2em;padding-right:0px;padding-bottom:0.2em;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:rgba(0, 0, 0, 0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;">UnsafeBufferPointer</code><span class="highlight" style="background-color:rgb(255, 255, 255)"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"><span class="size" style="font-size:16px">s&nbsp;</span></span></span></span><span class="highlight" style="background-color:rgb(255, 255, 255)"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"><span class="size" style="font-size:16px">to be their own slice type, like the</span></span></span></span><span class="highlight" style="background-color:rgb(255, 255, 255)"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"><span class="size" style="font-size:16px">&nbsp;</span></span></span></span><code style="color:rgb(51, 51, 51);font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;padding-top:0.2em;padding-right:0px;padding-bottom:0.2em;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:rgba(0, 0, 0, 0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;">UnsafeRawBufferPointer</code><span class="highlight" style="background-color:rgb(255, 255, 255)"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"><span class="size" style="font-size:16px">&nbsp;</span></span></span></span><span class="highlight" style="background-color:rgb(255, 255, 255)"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"><span class="size" style="font-size:16px">types. This is a minor change in the subscript API of</span></span></span></span><span class="highlight" style="background-color:rgb(255, 255, 255)"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"><span class="size" style="font-size:16px">&nbsp;</span></span></span></span><code style="color:rgb(51, 51, 51);font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;padding-top:0.2em;padding-right:0px;padding-bottom:0.2em;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:rgba(0, 0, 0, 0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;">UnsafeBufferPointer</code><span class="highlight" style="background-color:rgb(255, 255, 255)"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"><span class="size" style="font-size:16px">&nbsp;</span></span></span></span><span class="highlight" style="background-color:rgb(255, 255, 255)"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"><span class="size" style="font-size:16px">and</span></span></span></span><span class="highlight" style="background-color:rgb(255, 255, 255)"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"><span class="size" style="font-size:16px">&nbsp;</span></span></span></span><code style="color:rgb(51, 51, 51);font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;padding-top:0.2em;padding-right:0px;padding-bottom:0.2em;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:rgba(0, 0, 0, 0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;">UnsafeMutableBufferPointer</code><span class="highlight" style="background-color:rgb(255, 255, 255)"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"><span class="size" style="font-size:16px">, but constitutes a change to the standard library's ABI, as it can't be solved through type aliasing.</span></span></span></span><br></div>
<h2 style="margin-top:24px;margin-bottom:16px;line-height:1.25;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238, 238, 238);color:rgb(51, 51, 51);font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';background-color:rgb(255, 255, 255);"><a style="background-color:transparent;-webkit-text-decoration-skip:objects;color:rgb(64, 120, 192);text-decoration:none;float:left;padding-right:4px;line-height:1;" href="https://gist.github.com/natecook1000/a239f4db2704db9c5d54d540c0a09499#motivation"></a>Motivation<br></h2><p style="margin-top: 0px; margin-bottom: 16px;"><span class="highlight" style="background-color:rgb(255, 255, 255)"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"><span class="size" style="font-size:16px">The standard library has parallel pointer and buffer types for working with raw and typed memory. These types have broadly similar APIs that streamline working with pointers, as some kinds of memory manipulation involve moving back and forth between the two. One significant difference between the two groups of buffer types, however, is that while&nbsp;<code style="font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;padding-top:0.2em;padding-right:0px;padding-bottom:0.2em;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:rgba(0, 0, 0, 0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;">UnsafeRawBufferPointer</code>s are their own slice type, <code style="font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;padding-top:0.2em;padding-right:0px;padding-bottom:0.2em;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:rgba(0, 0, 0, 0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;">UnsafeBufferPointer</code>s use the default&nbsp;<code style="font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;padding-top:0.2em;padding-right:0px;padding-bottom:0.2em;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:rgba(0, 0, 0, 0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;">Slice</code>&nbsp;type as a wrapper.</span></span></span></span><br></p><p style="margin-top: 0px; margin-bottom: 16px;"><span class="highlight" style="background-color:rgb(255, 255, 255)"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"><span class="size" style="font-size:16px">Using a&nbsp;<code style="font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;padding-top:0.2em;padding-right:0px;padding-bottom:0.2em;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:rgba(0, 0, 0, 0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;">Slice</code>&nbsp;wrapper is a needless addition when working with buffers—the wrapper is most useful when used to prevent copying of a collection's stored data, but since&nbsp;<code style="font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;padding-top:0.2em;padding-right:0px;padding-bottom:0.2em;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:rgba(0, 0, 0, 0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;">UnsafeBufferPointer</code>s aren't owners of the memory they reference, there is no copying performed when simply creating a new buffer over a subrange of the memory. Moreover, the overhead of a&nbsp;<code style="font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;padding-top:0.2em;padding-right:0px;padding-bottom:0.2em;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:rgba(0, 0, 0, 0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;">Slice</code>&nbsp;wrapper around an&nbsp;<code style="font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;padding-top:0.2em;padding-right:0px;padding-bottom:0.2em;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:rgba(0, 0, 0, 0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;">UnsafeBufferPointer</code>&nbsp;is almost certainly higher than another&nbsp;<code style="font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;padding-top:0.2em;padding-right:0px;padding-bottom:0.2em;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:rgba(0, 0, 0, 0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;">UnsafeBufferPointer</code>. instance.</span></span></span></span><br></p><p style="margin-top: 0px; margin-bottom: 16px;"><span class="highlight" style="background-color:rgb(255, 255, 255)"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"><span class="size" style="font-size:16px">The&nbsp;<code style="font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;padding-top:0.2em;padding-right:0px;padding-bottom:0.2em;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:rgba(0, 0, 0, 0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;">Slice</code>&nbsp;wrapper makes using buffer pointers as parameters more cumbersome than necessary. To pass a slice of a buffer to a function taking a buffer, you need to create a new buffer manually:</span></span></span></span><br></p><div style="margin-bottom:16px;color:rgb(51, 51, 51);font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';font-size:16px;background-color:rgb(255, 255, 255);"><pre style="font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;margin-top:0px;margin-bottom:0px;line-height:1.45;word-wrap:normal;padding-top:16px;padding-right:16px;padding-bottom:16px;padding-left:16px;overflow-y:auto;overflow-x:auto;background-color:rgb(247, 247, 247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal;"><span class="colour" style="color:rgb(167, 29, 93)">func</span> <span class="colour" style="color:rgb(121, 93, 163)">_operateOnBuffer</span>&lt;<span class="colour" style="color:rgb(237, 106, 67)">T</span>&gt;(<span class="colour" style="color:rgb(121, 93, 163)">_</span> <span style="">buffer</span>: <span class="colour" style="color:rgb(0, 134, 179)">UnsafeMutableBufferPointer</span>&lt;T&gt;) {
    <span class="colour" style="color:rgb(150, 152, 150)">// ...</span>
<span class="colour" style="color:rgb(150, 152, 150)"></span>}

<span class="colour" style="color:rgb(167, 29, 93)">let</span> buffer<span class="colour" style="color:rgb(167, 29, 93)">:</span> <span class="colour" style="color:rgb(0, 134, 179)">UnsafeMutableBufferPointer</span><span class="colour" style="color:rgb(167, 29, 93)">&lt;</span><span class="colour" style="color:rgb(0, 134, 179)">Int</span><span class="colour" style="color:rgb(167, 29, 93)">&gt;</span> <span class="colour" style="color:rgb(167, 29, 93)">=</span> <span class="colour" style="color:rgb(167, 29, 93)">...</span>
<span class="colour" style="color:rgb(0, 134, 179)">_operateOnBuffer</span>(buffer)            <span class="colour" style="color:rgb(150, 152, 150)">// okay</span>
<span class="colour" style="color:rgb(150, 152, 150)"></span><span class="colour" style="color:rgb(0, 134, 179)">_operateOnBuffer</span>(buffer[<span class="colour" style="color:rgb(0, 134, 179)">0</span><span class="colour" style="color:rgb(167, 29, 93)">..&lt;</span><span class="colour" style="color:rgb(0, 134, 179)">16</span>])    <span class="colour" style="color:rgb(150, 152, 150)">// error: type mismatch</span>
<span class="colour" style="color:rgb(150, 152, 150)"></span><span class="colour" style="color:rgb(167, 29, 93)">let</span> subBuffer <span class="colour" style="color:rgb(167, 29, 93)">=</span> <span class="colour" style="color:rgb(0, 134, 179)">UnsafeMutableBufferPointer</span>(<span class="colour" style="color:rgb(0, 134, 179)">start</span>: buffer, <span class="colour" style="color:rgb(0, 134, 179)">count</span>: <span class="colour" style="color:rgb(0, 134, 179)">16</span>)
<span class="colour" style="color:rgb(0, 134, 179)">_operateOnBuffer</span>(subBuffer)         <span class="colour" style="color:rgb(150, 152, 150)">// okay</span><br></pre></div>
<p style="margin-top: 0px; margin-bottom: 16px;"><span class="highlight" style="background-color:rgb(255, 255, 255)"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"><span class="size" style="font-size:16px">The wrapper complicates subscript assignment, as well. Instead of using simple assignment to copy all the elements of one buffer into a memory range of another, you must either manually create a slice or subscript the source buffer with its full range:</span></span></span></span><br></p><div style="margin-bottom:16px;color:rgb(51, 51, 51);font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';font-size:16px;background-color:rgb(255, 255, 255);"><pre style="font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;margin-top:0px;margin-bottom:0px;line-height:1.45;word-wrap:normal;padding-top:16px;padding-right:16px;padding-bottom:16px;padding-left:16px;overflow-y:auto;overflow-x:auto;background-color:rgb(247, 247, 247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal;"><span class="colour" style="color:rgb(167, 29, 93)">let</span> biggerBuffer<span class="colour" style="color:rgb(167, 29, 93)">:</span> <span class="colour" style="color:rgb(0, 134, 179)">UnsafeMutableBufferPointer</span><span class="colour" style="color:rgb(167, 29, 93)">&lt;</span><span class="colour" style="color:rgb(0, 134, 179)">Int</span><span class="colour" style="color:rgb(167, 29, 93)">&gt;</span> <span class="colour" style="color:rgb(167, 29, 93)">=</span> <span class="colour" style="color:rgb(167, 29, 93)">...</span>
<span class="colour" style="color:rgb(167, 29, 93)">let</span> smallerBuffer<span class="colour" style="color:rgb(167, 29, 93)">:</span> <span class="colour" style="color:rgb(0, 134, 179)">UnsafeMutableBufferPointer</span><span class="colour" style="color:rgb(167, 29, 93)">&lt;</span><span class="colour" style="color:rgb(0, 134, 179)">Int</span><span class="colour" style="color:rgb(167, 29, 93)">&gt;</span> <span class="colour" style="color:rgb(167, 29, 93)">=</span> <span class="colour" style="color:rgb(167, 29, 93)">...</span>

biggerBuffer[<span class="colour" style="color:rgb(0, 134, 179)">0</span><span class="colour" style="color:rgb(167, 29, 93)">..&lt;</span>smallerBuffer.<span class="colour" style="color:rgb(0, 134, 179)">count</span>] <span class="colour" style="color:rgb(167, 29, 93)">=</span> 
    smallerBuffer[<span class="colour" style="color:rgb(0, 134, 179)">0</span><span class="colour" style="color:rgb(167, 29, 93)">..&lt;</span>smallerBuffer.<span class="colour" style="color:rgb(0, 134, 179)">count</span>]<br></pre></div>
<h2 style="margin-top:24px;margin-bottom:16px;line-height:1.25;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238, 238, 238);color:rgb(51, 51, 51);font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';background-color:rgb(255, 255, 255);"><a style="background-color:transparent;-webkit-text-decoration-skip:objects;color:rgb(64, 120, 192);text-decoration:none;float:left;padding-right:4px;line-height:1;" href="https://gist.github.com/natecook1000/a239f4db2704db9c5d54d540c0a09499#proposed-solution"></a>Proposed solution<br></h2><p style="margin-top: 0px; margin-bottom: 16px;"><span class="highlight" style="background-color:rgb(255, 255, 255)"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"><span class="size" style="font-size:16px">The proposed solution is to switch the&nbsp;<code style="font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;padding-top:0.2em;padding-right:0px;padding-bottom:0.2em;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:rgba(0, 0, 0, 0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;">UnsafeBufferPointer</code>s to be their own slice type. This uses less overhead than the&nbsp;<code style="font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;padding-top:0.2em;padding-right:0px;padding-bottom:0.2em;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:rgba(0, 0, 0, 0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;">Slice</code>&nbsp;type, which needs to store both the original buffer and a bounding range.</span></span></span></span><br></p><p style="margin-top: 0px; margin-bottom: 16px;"><span class="highlight" style="background-color:rgb(255, 255, 255)"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"><span class="size" style="font-size:16px">The operations above are simpler with this change:</span></span></span></span><br></p><div style="margin-bottom:16px;color:rgb(51, 51, 51);font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';font-size:16px;background-color:rgb(255, 255, 255);"><pre style="font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;margin-top:0px;margin-bottom:0px;line-height:1.45;word-wrap:normal;padding-top:16px;padding-right:16px;padding-bottom:16px;padding-left:16px;overflow-y:auto;overflow-x:auto;background-color:rgb(247, 247, 247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal;"><span class="colour" style="color:rgb(0, 134, 179)">_operateOnBuffer</span>(buffer[<span class="colour" style="color:rgb(0, 134, 179)">0</span><span class="colour" style="color:rgb(167, 29, 93)">..&lt;</span><span class="colour" style="color:rgb(0, 134, 179)">16</span>])        <span class="colour" style="color:rgb(150, 152, 150)">// subscripting okay</span>
<span class="colour" style="color:rgb(150, 152, 150)"></span>
<span class="colour" style="color:rgb(150, 152, 150)">// no need to subscript 'smallerBuffer'</span>
<span class="colour" style="color:rgb(150, 152, 150)"></span>biggerBuffer[<span class="colour" style="color:rgb(0, 134, 179)">0</span><span class="colour" style="color:rgb(167, 29, 93)">..&lt;</span>smallerBuffer.<span class="colour" style="color:rgb(0, 134, 179)">count</span>] <span class="colour" style="color:rgb(167, 29, 93)">=</span> smallerBuffer <br></pre></div>
<h2 style="margin-top:24px;margin-bottom:16px;line-height:1.25;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238, 238, 238);color:rgb(51, 51, 51);font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';background-color:rgb(255, 255, 255);"><a style="background-color:transparent;-webkit-text-decoration-skip:objects;color:rgb(64, 120, 192);text-decoration:none;float:left;padding-right:4px;line-height:1;" href="https://gist.github.com/natecook1000/a239f4db2704db9c5d54d540c0a09499#detailed-design"></a>Detailed design<br></h2><p style="margin-top: 0px; margin-bottom: 16px;"><span class="highlight" style="background-color:rgb(255, 255, 255)"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"><span class="size" style="font-size:16px">The change follows the example of the raw buffer pointer types:</span></span></span></span><br></p><div style="margin-bottom:16px;color:rgb(51, 51, 51);font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';font-size:16px;background-color:rgb(255, 255, 255);"><pre style="font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;margin-top:0px;margin-bottom:0px;line-height:1.45;word-wrap:normal;padding-top:16px;padding-right:16px;padding-bottom:16px;padding-left:16px;overflow-y:auto;overflow-x:auto;background-color:rgb(247, 247, 247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal;"><span class="colour" style="color:rgb(167, 29, 93)">struct</span> <span class="colour" style="color:rgb(121, 93, 163)">UnsafeBufferPointer</span>&lt;<span class="colour" style="color:rgb(237, 106, 67)">Element</span>&gt; : <span class="colour" style="color:rgb(121, 93, 163)"><span class="colour" style="color:rgb(0, 134, 179)">Collection</span>, <span class="colour" style="color:rgb(167, 29, 93)">...</span> </span>{
    <span class="colour" style="color:rgb(150, 152, 150)">// other declarations</span>
<span class="colour" style="color:rgb(150, 152, 150)"></span>    <span class="colour" style="color:rgb(167, 29, 93)">subscript</span>(<span class="colour" style="color:rgb(0, 134, 179)">bounds</span>: <span class="colour" style="color:rgb(0, 134, 179)">Range</span><span class="colour" style="color:rgb(167, 29, 93)">&lt;</span><span class="colour" style="color:rgb(0, 134, 179)">Int</span><span class="colour" style="color:rgb(167, 29, 93)">&gt;</span>) <span class="colour" style="color:rgb(167, 29, 93)">-&gt;</span> <span class="colour" style="color:rgb(0, 134, 179)">UnsafeBufferPointer</span> {
        <span class="colour" style="color:rgb(167, 29, 93)">get</span> {
            <span class="colour" style="color:rgb(150, 152, 150)">// check bounds</span>
<span class="colour" style="color:rgb(150, 152, 150)"></span>            <span class="colour" style="color:rgb(167, 29, 93)">return</span> <span class="colour" style="color:rgb(0, 134, 179)">UnsafeMutableBufferPointer</span>(
                <span class="colour" style="color:rgb(0, 134, 179)">start</span>: <span class="colour" style="color:rgb(237, 106, 67)">self</span> <span class="colour" style="color:rgb(167, 29, 93)">+</span> bounds.<span style="">lowerBound</span>,
                <span class="colour" style="color:rgb(0, 134, 179)">count</span>: bounds.<span class="colour" style="color:rgb(0, 134, 179)">count</span>)
        }
    }
}

<span class="colour" style="color:rgb(167, 29, 93)">struct</span> <span class="colour" style="color:rgb(121, 93, 163)">UnsafeMutableBufferPointer</span>&lt;<span class="colour" style="color:rgb(237, 106, 67)">Element</span>&gt; : <span class="colour" style="color:rgb(121, 93, 163)"><span class="colour" style="color:rgb(0, 134, 179)">Collection</span>, <span class="colour" style="color:rgb(167, 29, 93)">...</span> </span>{
    <span class="colour" style="color:rgb(150, 152, 150)">// other declarations</span>
<span class="colour" style="color:rgb(150, 152, 150)"></span>    <span class="colour" style="color:rgb(167, 29, 93)">subscript</span>(<span class="colour" style="color:rgb(0, 134, 179)">bounds</span>: <span class="colour" style="color:rgb(0, 134, 179)">Range</span><span class="colour" style="color:rgb(167, 29, 93)">&lt;</span><span class="colour" style="color:rgb(0, 134, 179)">Int</span><span class="colour" style="color:rgb(167, 29, 93)">&gt;</span>) <span class="colour" style="color:rgb(167, 29, 93)">-&gt;</span> <span class="colour" style="color:rgb(0, 134, 179)">UnsafeMutableBufferPointer</span> {
        <span class="colour" style="color:rgb(167, 29, 93)">get</span> {
            <span class="colour" style="color:rgb(150, 152, 150)">// check bounds</span>
<span class="colour" style="color:rgb(150, 152, 150)"></span>            <span class="colour" style="color:rgb(167, 29, 93)">return</span> <span class="colour" style="color:rgb(0, 134, 179)">UnsafeMutableBufferPointer</span>(
                <span class="colour" style="color:rgb(0, 134, 179)">start</span>: <span class="colour" style="color:rgb(237, 106, 67)">self</span> <span class="colour" style="color:rgb(167, 29, 93)">+</span> bounds.<span style="">lowerBound</span>,
                <span class="colour" style="color:rgb(0, 134, 179)">count</span>: bounds.<span class="colour" style="color:rgb(0, 134, 179)">count</span>)
        }
        <span class="colour" style="color:rgb(167, 29, 93)">set</span> {
            <span class="colour" style="color:rgb(150, 152, 150)">// check bounds</span>
<span class="colour" style="color:rgb(150, 152, 150)"></span>            <span class="colour" style="color:rgb(0, 134, 179)">_writeBackMutableSlice</span>(<span class="colour" style="color:rgb(167, 29, 93)">&amp;</span><span class="colour" style="color:rgb(237, 106, 67)">self</span>, <span class="colour" style="color:rgb(0, 134, 179)">bounds</span>: bounds, <span class="colour" style="color:rgb(0, 134, 179)">slice</span>: newValue)
        }
    }
}<br></pre></div>
<h2 style="margin-top:24px;margin-bottom:16px;line-height:1.25;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238, 238, 238);color:rgb(51, 51, 51);font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';background-color:rgb(255, 255, 255);"><a style="background-color:transparent;-webkit-text-decoration-skip:objects;color:rgb(64, 120, 192);text-decoration:none;float:left;padding-right:4px;line-height:1;" href="https://gist.github.com/natecook1000/a239f4db2704db9c5d54d540c0a09499#impact-on-existing-code"></a>Impact on existing code<br></h2><div style="margin-top:0px;color:rgb(51, 51, 51);font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';font-size:16px;background-color:rgb(255, 255, 255);margin-bottom:0px !important;">Any existing code that works with slices of UnsafeMutableBufferPointer and specifies the&nbsp;<code style="font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;padding-top:0.2em;padding-right:0px;padding-bottom:0.2em;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:rgba(0, 0, 0, 0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;">Slice</code>&nbsp;type explicitly will need to change that specification. This isn't a terribly common thing to do (I can't find any in the standard library or test suite), so the impact of the change should be minor.<br></div>
<div style="margin-top:0px;color:rgb(51, 51, 51);font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';font-size:16px;background-color:rgb(255, 255, 255);margin-bottom:0px !important;"><br></div>
<div style="margin-top:0px;color:rgb(51, 51, 51);font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';font-size:16px;background-color:rgb(255, 255, 255);margin-bottom:0px !important;"><br></div>
<div><u>_______________________________________________</u><br></div>
<div>swift-evolution mailing list<br></div>
<div><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br></div>
<div><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br></div>
</blockquote><div><br></div>
</body>
</html>