> On 05-Aug-2016, at 4:02 PM, Brent Royal-Gordon <[email protected]> wrote:
>
> I don't believe this is possible with an Array; the only way to work with
> uninitialized memory is with an UnsafeMutablePointer.
>
> The simplest solution is probably to load the data into an allocated chunk of
> memory with an UnsafeMutablePointer and then create an NSData object to keep
> track of its lifetime. The `init(bytesNoCopy:length:deallocator:)`
> initializer can be used to make sure it deallocates the memory correctly.
Thanks for the tip. This does mean I have to give up the niceties of arrays
post initialization.
>
> If you don't *need* to use mutable pointers to fill the array, however, a
> custom SequenceType might be a better option. For instance, you could write a
> type like this which returns the data a byte at a time:
>
> struct MyDataSource: SequenceType, GeneratorType {
>
> Then you can write something like this:
>
> var source = MyDataSource(...)
> var array: [UInt8] = []
> array.reserveCapacity(source.initialCapacity)
> array.appendContentsOf(source)
>
> And, et voila, `array` is full of your bytes. From what I can tell, if the
> capacity is already there, the standard library effectively uses a loop as
> tight as any you could hope for:
>
> let base = buffer.firstElementAddress
>
> while (nextItem != nil) && count < capacity {
> (base + count).initialize(to: nextItem!)
> count += 1
> nextItem = stream.next()
> }
> buffer.count = count
>
> So I suspect a custom SequenceType will perform much better than you would
> first guess.
The code I’m working on essentially does serialization. It’s not really
amenable to the inversion of control required for generators.
Best
KS Sreeram
_______________________________________________
swift-users mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-users