mirror of
https://github.com/HaishinKit/HaishinKit.swift.git
synced 2026-05-07 20:12:28 +00:00
33 lines
1.2 KiB
Swift
33 lines
1.2 KiB
Swift
import Foundation
|
|
|
|
extension Array where Element == String {
|
|
func withCStrings<R>(_ body: ([UnsafePointer<CChar>]) -> R) -> R {
|
|
var cStringPtrs: [UnsafePointer<CChar>] = []
|
|
cStringPtrs.reserveCapacity(count)
|
|
func loop(_ i: Int, _ current: [UnsafePointer<CChar>], _ body: ([UnsafePointer<CChar>]) -> R) -> R {
|
|
if i == count {
|
|
return body(current)
|
|
}
|
|
return self[i].withCString { cstr in
|
|
var next = current
|
|
next.append(cstr)
|
|
return loop(i + 1, next, body)
|
|
}
|
|
}
|
|
return loop(0, [], body)
|
|
}
|
|
|
|
func withCStringArray<R>(_ body: (UnsafeMutablePointer<UnsafePointer<CChar>?>) -> R) -> R {
|
|
let cStrings = self.map { $0.utf8CString }
|
|
let pointerArray = UnsafeMutablePointer<UnsafePointer<CChar>?>.allocate(capacity: cStrings.count)
|
|
for (i, cString) in cStrings.enumerated() {
|
|
cString.withUnsafeBufferPointer { buf in
|
|
pointerArray[i] = buf.baseAddress
|
|
}
|
|
}
|
|
let result = body(pointerArray)
|
|
pointerArray.deallocate()
|
|
return result
|
|
}
|
|
}
|