igraph/ext/cIGraph_utility.c

72 lines
1.3 KiB
C

#include "igraph.h"
#include "ruby.h"
#include "cIGraph.h"
igraph_integer_t cIGraph_get_vertex_id(VALUE graph, VALUE v){
VALUE v_ary;
VALUE idx;
igraph_t *igraph;
Data_Get_Struct(graph, igraph_t, igraph);
v_ary = ((VALUE*)igraph->attr)[0];
idx = rb_funcall(v_ary,rb_intern("index"),1,v);
if(idx != Qnil)
return NUM2INT(idx);
rb_raise(cIGraphError, "Unable to find vertex\n");
return -1;
}
VALUE cIGraph_get_vertex_object(VALUE graph, igraph_integer_t n){
VALUE v_ary;
VALUE obj;
igraph_t *igraph;
Data_Get_Struct(graph, igraph_t, igraph);
v_ary = ((VALUE*)igraph->attr)[0];
obj = rb_ary_entry(v_ary,n);
return obj;
}
int cIGraph_vertex_arr_to_id_vec(VALUE graph, VALUE va, igraph_vector_t *nv){
VALUE vertex;
VALUE tmp;
VALUE i;
tmp = rb_check_array_type(va);
if(NIL_P(tmp))
rb_raise(cIGraphError, "Array expected\n");
//Initialize edge vector
//igraph_vector_init_int(nv,0);
for (i=0; i<RARRAY_LEN(va); i++) {
vertex = RARRAY_PTR(va)[i];
igraph_vector_push_back(nv,cIGraph_get_vertex_id(graph, vertex));
}
return 0;
}
VALUE cIGraph_include(VALUE self, VALUE v){
VALUE v_ary;
igraph_t *igraph;
Data_Get_Struct(self, igraph_t, igraph);
v_ary = ((VALUE*)igraph->attr)[0];
return rb_ary_includes(v_ary,v);
}