Oh, one more thing (about this specific change): If we do this, we should add 
an “offset” parameter to UnsafeMutableBufferPointer.[move]initialize/assign 
(with a default of 0 for source compatibility). Otherwise, it becomes awkward 
to initialise a region of a buffer from another buffer.

What I want to write:
buffer.suffix(from: filled).initialize(from: newData)

If SubSequence is not another unsafe pointer, I’d have to do this:
buffer.baseAddress!.advanced(by: filled).initialize(from: newData)  // Warning: 
deprecated in Swift 4.0

So instead, we should have the ability to write this:
buffer.initialize(startingAt: filled, from: newData) // awkward labels, but src 
compat...

But yeah, this post just reminded me that there are a number of small 
consistency tweaks we could make to the unsafe-buffer API.

- Karl

> On 24 Mar 2017, at 03:22, Karl Wagner <karl.sw...@springsup.com> wrote:
> 
> 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 <mailto: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 
>> <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
>>  
>> <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