session-ios/SessionUtilitiesKit/General/Collection+Utilities.swift

46 lines
2.0 KiB
Swift

// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
import Foundation
extension Collection {
public subscript(ifValid index: Index) -> Iterator.Element? {
return self.indices.contains(index) ? self[index] : nil
}
}
public extension Collection {
/// This creates an UnsafeMutableBufferPointer to access data in memory directly. This result pointer provides no automated
/// memory management so after use you are responsible for handling the life cycle and need to call `deallocate()`.
func unsafeCopy() -> UnsafeMutableBufferPointer<Element> {
let copy = UnsafeMutableBufferPointer<Element>.allocate(capacity: self.underestimatedCount)
_ = copy.initialize(from: self)
return copy
}
}
public extension Collection where Element == [CChar] {
/// This creates an array of UnsafePointer types to access data of the C strings in memory. This array provides no automated
/// memory management of it's children so after use you are responsible for handling the life cycle of the child elements and
/// need to call `deallocate()` on each child.
func unsafeCopy() -> [UnsafePointer<CChar>?] {
return self.map { value in
let copy = UnsafeMutableBufferPointer<CChar>.allocate(capacity: value.count)
_ = copy.initialize(from: value)
return UnsafePointer(copy.baseAddress)
}
}
}
public extension Collection where Element == [UInt8] {
/// This creates an array of UnsafePointer types to access data of the C strings in memory. This array provides no automated
/// memory management of it's children so after use you are responsible for handling the life cycle of the child elements and
/// need to call `deallocate()` on each child.
func unsafeCopy() -> [UnsafePointer<UInt8>?] {
return self.map { value in
let copy = UnsafeMutableBufferPointer<UInt8>.allocate(capacity: value.count)
_ = copy.initialize(from: value)
return UnsafePointer(copy.baseAddress)
}
}
}