2009-11-10 8 views
1

J'utilise SWIG pour envelopper une interface C dans Ruby. Compte tenu de deux structUtilisation de blocs Ruby de C avec SWIG

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

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

comment puis-je créer une méthode #each qui donne le sommet en cours, afin que je puisse le traiter en Ruby. Actuellement, mon fichier d'interface SWIG contient quelque chose comme

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

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

Merci d'avance pour votre aide.

--t6d

Répondre

1

Une façon est de convertir le sommet à une valeur avec les fonctions rasade. La fonction swig pour envelopper la structure C en tant qu'objet ruby ​​/ swig est SWIG_NewPointerObj.

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

SWIG_NewPointerObj/SWIGTYPE_p_ * sont définis comme des macros dans l'emballage, de sorte que vous devrez appeler le code ci-dessus de l'enveloppe (qui se produira lorsque vous utilisez% s'étendre).