<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">The convenience initialiser should exist on all of the unsafe buffers, not just the raw (untyped) ones.</div><div class=""><br class=""></div>I’ve run in to this problem a few times, and I think it would get worse if we adopted a ContiguouslyStored protocol to formalise accessing the raw-pointers of generic collections. It would mean that you couldn’t write code that works with UnsafeRawBufferPointer/Data/DispatchData generically, or with UnsafeBufferPointer&lt;T&gt;/Array&lt;T&gt;.<div class=""><br class=""></div><div class="">Also, there seem to be some implicit conversions for the unsafe-pointer types, but UMBP -&gt; UBP requires an awkward initialiser. We should introduce an implicit conversion for that case or add an “immutable” computed property to UMBP.</div><div class=""><br class=""></div><div class="">And while we’re on the subject, memory allocation/deallocation functions are weirdly dispersed. In order to allocate an UnsafeMutableBufferPointer&lt;T&gt;, for instance, you have to do:</div><div class=""><br class=""></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><font face="Courier" class="">var buffer: UnsafeMutableBufferPointer&lt;T&gt;</font></div><div class=""><font face="Courier" class="">init(length: Int) {</font></div><div class=""><font face="Courier" class="">&nbsp; let&nbsp;b&nbsp;&nbsp;=&nbsp;UnsafeMutablePointer&lt;T&gt;.allocate(capacity: length)</font></div><div class=""><font face="Courier" class="">&nbsp; buffer&nbsp;=&nbsp;UnsafeMutableBufferPointer(start: b, count: length)</font></div><div class=""><font face="Courier" class="">}</font></div></blockquote><div class=""><br class=""></div><div class="">Also, the deallocate API feels weird - since it deallocates n items from the head of the pointer, it is a consuming operation and I feel like it should return a new pointer (with @discardableResult). Once you’ve deallocated a memory address, you can never re-allocate that specific location so there is no reason to know about it any more.</div><div class=""><br class=""></div><div class="">- Karl</div><div class=""><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On 21 Mar 2017, at 03:21, Andrew Trick via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">This proposal amends SE-0138: Normalize UnsafeRawBufferPointer Slices<br class="">to fix a design bug: <a href="https://github.com/apple/swift-evolution/pull/651" class="">https://github.com/apple/swift-evolution/pull/651</a><br class=""><br class="">The issue was discussed on swift-evolution in Nov/Dec:<br class="">See [swift-evolution] [Pitch] Normalize Slice Types for Unsafe Buffers<br class=""><a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20161128/029108.html" class="">https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20161128/029108.html</a><br class=""><br class="">The implementation of this fix is in PR #8222:<br class="">https://github.com/apple/swift/pull/8222<br class=""><br class="">Fix: Change Unsafe[Mutable]RawBufferPointer's SubSequence type<br class=""><br class="">Original: Unsafe[Mutable]RawBufferPointer.SubSequence = Unsafe[Mutable]RawBufferPointer<br class=""><br class="">Fixed: Unsafe[Mutable]RawBufferPointer.SubSequence = [Mutable]RandomAccessSlice&lt;Unsafe[Mutable]RawBufferPointer&gt;<br class=""><br class="">This is a source breaking bug fix that only applies to<br class="">post-3.0.1. It's extremely unlikely that any Swift 3 code would rely<br class="">on the SubSequence type beyond the simple use case of passing a<br class="">raw buffer subrange to an another raw buffer argument:<br class=""><br class="">`takesRawBuffer(buffer[i..&lt;j])`<br class=""><br class="">A diagnostic message now instructs users to convert the slice to a<br class="">buffer using a `rebasing` initializer:<br class=""><br class="">`takesRawBuffer(UnsafeRawBufferPointer(rebasing: buffer[i..&lt;j]))`<br class=""><br class="">To support this, the following `rebasing` initializers are added:<br class=""><br class="">extension UnsafeRawBufferPointer {<br class=""> &nbsp;public init(rebasing slice: RandomAccessSlice&lt;UnsafeRawBufferPointer&gt;)<br class=""> &nbsp;public init(<br class=""> &nbsp;&nbsp;&nbsp;rebasing slice: MutableRandomAccessSlice&lt;UnsafeMutableRawBufferPointer&gt;<br class=""> &nbsp;)<br class="">}<br class=""><br class="">extension UnsafeMutableRawBufferPointer {<br class=""> &nbsp;public init(<br class=""> &nbsp;&nbsp;&nbsp;rebasing slice: MutableRandomAccessSlice&lt;UnsafeMutableRawBufferPointer&gt;<br class=""> &nbsp;)<br class="">}<br class=""><br class="">The source compatibility test builds are unnaffected by this change.<br class=""><br class="">-Andy<br class="">_______________________________________________<br class="">swift-evolution mailing list<br class="">swift-evolution@swift.org<br class="">https://lists.swift.org/mailman/listinfo/swift-evolution<br class=""></div></div></blockquote></div><br class=""></div></div></body></html>