Приведение кортежа указателей к указателю указателей

У меня есть кусок кода C:

#define AV_NUM_DATA_POINTERS 8
uint8_t *data[AV_NUM_DATA_POINTERS];

В быстро сгенерированном интерфейсе это выглядит так:

var data: (UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?)

Есть функция, которой нужна эта переменная data. Его представление в C выглядит следующим образом:

int sws_scale(..., const uint8_t *const srcSlice[], ...);

Однако swift создает следующую подпись:

func sws_scale(..., _ srcSlice: UnsafePointer<UnsafePointer<UInt8>?>!, ...) -> Int32

Каков наилучший способ привести огромный кортеж к типу, который будет работать для функции sws_scale?


person carlossless    schedule 26.05.2017    source источник
comment
Это может помочь: stackoverflow.com/questions/29469158/   -  person Martin R    schedule 26.05.2017


Ответы (1)


Пример с сайта Swift.org — миграция UnsafeRawPointer:

var bytes: (CChar, CChar, CChar, CChar) = (0x61, 0x62, 0x63, 0)
let name: String = withUnsafePointer(to: &bytes) { ptr -> String in
   return String(cString: UnsafeRawPointer(ptr).assumingMemoryBound(to: CChar.self))
}

Применяется к sws_scale:

var data: (UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?)
withUnsafePointer(to: data) { dataPointer in
   let dataPointer =
      UnsafeRawPointer(dataPointer)
         .assumingMemoryBound(to: UnsafePointer<UInt8>?.self)

   sws_scale(…, dataPointer, …)
}

ЗАПРЕЩАЕТСЯ делать следующее:

withUnsafePointer(to: &data.0)

Я столкнулся с проблемой выравнивания памяти при использовании вышеуказанного в оптимизированной сборке.

person fumoboy007    schedule 14.02.2019