/*
* This file is part of mpv.
*
* mpv is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* mpv is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with mpv. If not, see .
*/
class TypeHelper {
// (__bridge void*)
class func bridge(obj: T) -> UnsafeMutableRawPointer {
return UnsafeMutableRawPointer(Unmanaged.passUnretained(obj).toOpaque())
}
// (__bridge T*)
class func bridge(ptr: UnsafeRawPointer) -> T {
return Unmanaged.fromOpaque(ptr).takeUnretainedValue()
}
class func withUnsafeMutableRawPointers(_ arguments: [Any],
pointers: [UnsafeMutableRawPointer?] = [],
closure: (_ pointers: [UnsafeMutableRawPointer?]) -> Void) {
if arguments.count > 0 {
let args = Array(arguments.dropFirst(1))
var newPtrs = pointers
var firstArg = arguments.first
withUnsafeMutableBytes(of: &firstArg) { (ptr: UnsafeMutableRawBufferPointer) in
newPtrs.append(ptr.baseAddress)
withUnsafeMutableRawPointers(args, pointers: newPtrs, closure: closure)
}
return
}
closure(pointers)
}
class func toPointer(_ value: inout T) -> UnsafeMutableRawPointer? {
return withUnsafeMutableBytes(of: &value) { (ptr: UnsafeMutableRawBufferPointer) in
ptr.baseAddress
}
}
// *(char **) MPV_FORMAT_STRING
class func toString(_ obj: UnsafeMutableRawPointer?) -> String? {
guard let str = obj else { return nil }
let cstr = UnsafeMutablePointer>(OpaquePointer(str))
return String(cString: cstr[0])
}
// MPV_FORMAT_FLAG
class func toBool(_ obj: UnsafeMutableRawPointer) -> Bool? {
return UnsafePointer(OpaquePointer(obj))?.pointee
}
// MPV_FORMAT_DOUBLE
class func toDouble(_ obj: UnsafeMutableRawPointer) -> Double? {
return UnsafePointer(OpaquePointer(obj))?.pointee
}
}