A bit late to this game, because I didn’t fully understand the “point” of 
ManagedBuffer(Pointer). After a good week of messing around with these in 
Dictionary/Array/String, I now have Opinions.

I agree ManagedBufferPointer is largely unnecessary. However it’s seeming a lot 
like ManagedBuffer (and its equivalents) are suboptimal for the standard 
library’s purposes too!

In particular, pretty much every one of these buffers that I see wants to be a 
subclass of some NS* collection so that it can be toll-free bridged into 
objective C. This means that all those types are forced to directly drop down 
to allocWithTailElems, rather than using a nice abstraction that does it for 
them. Array does this right now, and I’ve got a PR up for review that’s doing 
the same thing to the HashedCollections. It’s an outstanding bug that String 
isn’t doing this (forcing its buffer to be wrapped in another class to be 
bridged).

I don’t really feel any pain from directly using allocWithTailElems, it’s a 
great API. It just leaves me at a loss for when I’d reach for ManagedBuffer at 
all, as it’s very limited.


> On Oct 13, 2016, at 3:11 PM, Erik Eckstein via swift-evolution 
> <[email protected]> wrote:
> 
> I created a proposal: https://github.com/apple/swift-evolution/pull/545 
> <https://github.com/apple/swift-evolution/pull/545>
> 
>> On Oct 11, 2016, at 11:32 PM, Dave Abrahams via swift-evolution 
>> <[email protected] <mailto:[email protected]>> wrote:
>> 
>> 
>> on Tue Oct 11 2016, Károly Lőrentey <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>>> +1
>>> 
>>> ManagedBuffer has been really useful a couple of times, but I never
>>> found a use for ManagedBufferPointer. I can’t even say I’m entirely
>>> sure what need it was originally designed to fulfill.
>> 
>> The real need is/was to be able to do the same kind of storage
>> management in classes not derived from ManagedBuffer.  This can be
>> important for bridging, where the buffers of various native swift
>> containers need to be derived from, e.g., NSString or NSArray.  That is,
>> however, an extremely stdlib-specifc need.
>> 
>> 
>>>> On 2016-10-11, at 00:12, Erik Eckstein via swift-evolution
>>> <[email protected] <mailto:[email protected]>> wrote:
>>>> 
>>>> The purpose of ManagedBufferPointer is to create a buffer with a custom 
>>>> class-metadata to be able
>>> to implement a custom deinit (e.g. to destroy the tail allocated elements).
>>>> It was used in Array (before I replaced it with the new 
>>>> tail-allocated-array-built-ins). But now
>>> it’s not used anymore in the standard library.
>>>> 
>>>> As a replacement for ManagedBufferPointer one can just derive a class from 
>>>> ManagedBuffer and implement the deinit in the derived class.
>>>> 
>>>> final class MyBuffer : ManagedBuffer<MyHeader, MyElements> {
>>>>  deinit {
>>>>    // do whatever needs to be done
>>>>  }
>>>> }
>>>> 
>>>> // creating MyBuffer:
>>>> let b = MyBuffer.create(minimumCapacity: 27, makingHeaderWith: { myb in 
>>>> return MyHeader(...) })
>>>> 
>>>> IMO ManagedBuffer is much cleaner than ManagedBufferPointer (it doesn’t 
>>>> need this custom
>>> bufferClass to be passed to the constructor). Also ManagedBufferPointer 
>>> doesn’t use SIL
>>> tail-allocated arrays internally. Although this is not something visible to 
>>> the programmer, it makes
>>> life easier for the compiler.
>>>> 
>>>> So I suggest that we deprecate ManagedBufferPointer.
>>>> 
>>>> Erik
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> [email protected] <mailto:[email protected]>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> [email protected] <mailto:[email protected]>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>> 
>> 
>> -- 
>> -Dave
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> [email protected] <mailto:[email protected]>
>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> _______________________________________________
> swift-evolution mailing list
> [email protected]
> https://lists.swift.org/mailman/listinfo/swift-evolution

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

Reply via email to