By default (at least) C functions that deal in pointers have those parameters & return values translated to various kinds of Unsafe*Pointer.
I often wrap those in a simple final class to allow me to safely manage their lifetimes, e.g.:
@dynamicMemberLookup
final class Image {
let contents: UnsafeMutablePointer<cImage>
init(_ contents: UnsafeMutablePointer<cImage>) {
self.contents = contents
}
subscript<T>(dynamicMember keyPath: KeyPath<cImage, T>) -> T {
contents.pointee[keyPath: keyPath]
}
deinit {
cImageDestroy(contents)
}
}
This isn't complicated but it gets repetitive, and it still requires some manual labour to wrap & unwrap at appropriate times.
Is there any way to autogenerate this boilerplate? Ideally not as a macro (build times ) but I'd consider even those.
And is there some way to have Swift synthesise the imported C/C++ API as using these boxes, rather than the raw Unsafe*Pointer types?