import Foundation public class SRArray: NSObject { // Used by Rust let pointer: UnsafePointer let length: Int; // Actual array, deallocates objects inside automatically let array: [T]; public override init() { self.array = []; self.pointer = UnsafePointer(self.array); self.length = 0; } public init(_ data: [T]) { self.array = data; self.pointer = UnsafePointer(self.array) self.length = data.count } public func toArray() -> [T] { return Array(self.array) } } public class SRObjectArray: NSObject { let data: SRArray public init(_ data: [NSObject]) { self.data = SRArray(data) } } public class SRData: NSObject { let data: SRArray public override init() { self.data = SRArray() } public init(_ data: [UInt8]) { self.data = SRArray(data) } public init (_ srArray: SRArray) { self.data = srArray } public func toArray() -> [UInt8] { return self.data.toArray() } } public class SRString: SRData { public override init() { super.init([]) } public init(_ string: String) { super.init(Array(string.utf8)) } init(_ data: SRData) { super.init(data.data) } public func toString() -> String { return String(bytes: self.data.array, encoding: .utf8)! } } @_cdecl("retain_object") func retainObject(ptr: UnsafeMutableRawPointer) { let _ = Unmanaged.fromOpaque(ptr).retain() } @_cdecl("release_object") func releaseObject(ptr: UnsafeMutableRawPointer) { let _ = Unmanaged.fromOpaque(ptr).release() } @_cdecl("data_from_bytes") func dataFromBytes(data: UnsafePointer, size: Int) -> SRData { let buffer = UnsafeBufferPointer(start: data, count: size) return SRData(Array(buffer)) } @_cdecl("string_from_bytes") func stringFromBytes(data: UnsafePointer, size: Int) -> SRString { let data = dataFromBytes(data: data, size: size); return SRString(data) }