The convenience initialiser should exist on all of the unsafe buffers, not just 
the raw (untyped) ones.

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<T>/Array<T>.

Also, there seem to be some implicit conversions for the unsafe-pointer types, 
but UMBP -> UBP requires an awkward initialiser. We should introduce an 
implicit conversion for that case or add an “immutable” computed property to 
UMBP.

And while we’re on the subject, memory allocation/deallocation functions are 
weirdly dispersed. In order to allocate an UnsafeMutableBufferPointer<T>, for 
instance, you have to do:

var buffer: UnsafeMutableBufferPointer<T>
init(length: Int) {
  let b  = UnsafeMutablePointer<T>.allocate(capacity: length)
  buffer = UnsafeMutableBufferPointer(start: b, count: length)
}

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.

- Karl

> On 21 Mar 2017, at 03:21, Andrew Trick via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> This proposal amends SE-0138: Normalize UnsafeRawBufferPointer Slices
> to fix a design bug: https://github.com/apple/swift-evolution/pull/651
> 
> The issue was discussed on swift-evolution in Nov/Dec:
> See [swift-evolution] [Pitch] Normalize Slice Types for Unsafe Buffers
> https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20161128/029108.html
> 
> The implementation of this fix is in PR #8222:
> https://github.com/apple/swift/pull/8222
> 
> Fix: Change Unsafe[Mutable]RawBufferPointer's SubSequence type
> 
> Original: Unsafe[Mutable]RawBufferPointer.SubSequence = 
> Unsafe[Mutable]RawBufferPointer
> 
> Fixed: Unsafe[Mutable]RawBufferPointer.SubSequence = 
> [Mutable]RandomAccessSlice<Unsafe[Mutable]RawBufferPointer>
> 
> This is a source breaking bug fix that only applies to
> post-3.0.1. It's extremely unlikely that any Swift 3 code would rely
> on the SubSequence type beyond the simple use case of passing a
> raw buffer subrange to an another raw buffer argument:
> 
> `takesRawBuffer(buffer[i..<j])`
> 
> A diagnostic message now instructs users to convert the slice to a
> buffer using a `rebasing` initializer:
> 
> `takesRawBuffer(UnsafeRawBufferPointer(rebasing: buffer[i..<j]))`
> 
> To support this, the following `rebasing` initializers are added:
> 
> extension UnsafeRawBufferPointer {
>  public init(rebasing slice: RandomAccessSlice<UnsafeRawBufferPointer>)
>  public init(
>    rebasing slice: MutableRandomAccessSlice<UnsafeMutableRawBufferPointer>
>  )
> }
> 
> extension UnsafeMutableRawBufferPointer {
>  public init(
>    rebasing slice: MutableRandomAccessSlice<UnsafeMutableRawBufferPointer>
>  )
> }
> 
> The source compatibility test builds are unnaffected by this change.
> 
> -Andy
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to