forked from aparoksha/adwaita-swift
47 lines
1.5 KiB
Swift
47 lines
1.5 KiB
Swift
//
|
|
// Array.swift
|
|
// Adwaita
|
|
//
|
|
// Created by david-swift on 06.08.23.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
extension Array where Element == String {
|
|
|
|
/// Get the C version of the array.
|
|
var cArray: UnsafePointer<UnsafePointer<CChar>?>? {
|
|
let cStrings = map { $0.utf8CString }
|
|
let cStringPointers = cStrings.map { $0.withUnsafeBufferPointer { $0.baseAddress } }
|
|
let optionalCStringPointers = cStringPointers + [nil]
|
|
var optionalCStringPointersCopy = optionalCStringPointers
|
|
optionalCStringPointersCopy.withUnsafeMutableBufferPointer { bufferPointer in
|
|
bufferPointer.baseAddress?.advanced(by: cStrings.count).pointee = nil
|
|
}
|
|
let flatArray = optionalCStringPointersCopy.compactMap { $0 }
|
|
let pointer = UnsafeMutablePointer<UnsafePointer<CChar>?>.allocate(capacity: flatArray.count + 1)
|
|
for (index, element) in flatArray.enumerated() {
|
|
pointer.advanced(by: index).pointee = element
|
|
}
|
|
pointer.advanced(by: flatArray.count).pointee = nil
|
|
return UnsafePointer(pointer)
|
|
}
|
|
|
|
/// Get the mutable C version of the array.
|
|
var cMutableArray: UnsafeMutablePointer<UnsafePointer<CChar>?>? {
|
|
let pointer = UnsafeMutablePointer<UnsafePointer<CChar>?>.allocate(
|
|
capacity: count + 1
|
|
)
|
|
|
|
for (index, string) in enumerated() {
|
|
let cstr = strdup(string)
|
|
pointer[index] = UnsafePointer(cstr)
|
|
}
|
|
|
|
pointer[count] = nil
|
|
|
|
return pointer
|
|
}
|
|
|
|
}
|