> On Aug 19, 2017, at 9:12 PM, Taylor Swift <[email protected]> wrote:
> 
>> and the other methods should take both an offset parameter instead of a 
>> count parameter:
>> 
>> initialize(from:at:)
>> assign(from:at:)
>> moveInitialize(from:at:)
>> moveAssign(from:at:)
>> 
>> which provides maximum explicitness. This requires improvements to buffer 
>> pointer slicing though. But I’m not a fan of the mission creep that’s 
>> working into this proposal (i only originally wrote the thing to get 
>> allocate(capacity:) and deallocate() into UnsafeMutableBufferPointer!)
> 
> I’m open to that, with source.count <= self.count + index. They are 
> potentially ambiguous (the `at` could refer to a source index) but consistent 
> with the idea that this API is for copying an entire source buffer into a 
> slice of the destination buffer. Again, we need to find real code that 
> benefits from this, but I expect the stdlib could use these.

In case that typo wasn’t obvious, we actually want the precondition: `offset + 
source.count <= self.count` (your latest proposal draft is correct).

> The more I think the more I believe using from:at: is the right approach. The 
> only problem is that it would have to be written as a generic on Collectionor 
> Sequence to avoid having to provide up to 4 overloads for each operation, 
> since we would want these to work well with buffer slices as well as buffers 
> themselves. That puts them uncomfortably close to the turf of the existing 
> buffer pointer Sequence API though.

It would have to be a generic method taking a RandomAccessCollection. Calling 
that would rely on tricky type inference. For now, I prefer the explicitly 
typed API in your current proposal.

> Or we could make UnsafeMutableBufferPointer its own slice type. Right now 
> MutableRandomAccessSlice<UnsafeMutableBufferPointer<Element>> takes up 4 
> words of storage when it really only needs two.


A slice needs to be a separate type because of the indexing semantics:
https://github.com/apple/swift-evolution/commit/c8165b41b188c3d095425a0b4636fcf299ee9036
 
<https://github.com/apple/swift-evolution/commit/c8165b41b188c3d095425a0b4636fcf299ee9036>

Note that it's actually a feature that Subsequence refers back to its original 
buffer. If we cared enough, we could define a buffer slice type that exposes 
most of the buffer API. I just don't think we need to worry about that level of 
convenience yet, especially with you adding the `at:` labels. I'm fine if 
developers resort to `init(rebasing:)` in rare cases. Again, once we have a 
safe move-only or reference counted buffer type, that will be the better choice 
for Swift APIs. For now, this is still largely driven by C interop.

I like this proposal as it stands!
https://github.com/kelvin13/swift-evolution/blob/9d305ced7b82b9cf5854b55b3f0d08952853d046/proposals/0184-improved-pointers.md

-Andy
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to