Использование блоков Ruby из C с SWIG - PullRequest
1 голос
/ 10 ноября 2009

Я использую SWIG, чтобы обернуть интерфейс C в Ruby. Учитывая две структуры

typedef struct Vertex {
  int color, discoverd, finished;
  struct Vertex *next;
} Vertex;

typedef struct Graph {
  struct Vertex *vertex;
} Graph;

как я могу создать #each метод, который возвращает текущую вершину, чтобы я мог обработать ее в Ruby. В настоящее время мой файл интерфейса SWIG содержит что-то вроде

%extend Graph {
  void each() {
    Vertex *v;

    v = self->vertex;
    while(v) {
      rb_yield(Qnil); // how do I yield a vertex?
      v = v->next;
    }
  }
};

Заранее спасибо за помощь.

- t6d

1 Ответ

1 голос
/ 01 марта 2010

Один из способов - преобразовать вершину в VALUE с помощью функций swig. Функция swig для обертывания структуры C в качестве объекта ruby ​​/ swig - SWIG_NewPointerObj.

rb_yield(SWIG_NewPointerObj(SWIG_as_voidptr(v), SWIGTYPE_p_Vertex, 0 |  0 ));

SWIG_NewPointerObj / SWIGTYPE_p_ * определены как макросы в оболочке, поэтому вам нужно будет вызвать вышеуказанный код из оболочки (что произойдет, если вы используете% extension).

...