Используя Swig, как мне преобразовать const uint64_t * в массив ruby? - PullRequest
1 голос
/ 03 марта 2020

Я использую Swig, чтобы обернуть библиотеку c для использования с Ruby. Есть несколько функций, которые возвращают массив из uint32_t и uint64_t в качестве указателей.

Например, что-то вроде:

const uint64_t *foo();
const uint32_t *bar();

Я чувствую, что смогу отобразить их в ruby массивы Integer с %typemap, но не может найти хороший пример.

Отображение по умолчанию возвращает указатель swig, ie #<SWIG::TYPE_p_unsigned_long_long:0x0000000002204200>

, включая stdint.i через %include "stdint.i", кажется, позволяет обрабатывать uint64_t, но не указатели на них.

Обновление

Я попробовал следующую карту типов. И, похоже, работает, есть ли лучший способ?

%typemap(out) const uint64_t* {
   VALUE arr;
   arr = rb_ary_new();
   VALUE v1 = INT2NUM(*$1);
   VALUE v2 = INT2NUM(*($1+1));
   rb_ary_push(arr, v1 );
   rb_ary_push(arr, v2 );
   $result = arr;
}
...