|
- #include "igraph.h"
- #include "ruby.h"
- #include "cIGraph.h"
-
- /* call-seq:
- * graph.each_vertex{|v| } -> nil
- *
- * Iterates through all the vertices in the graph. Also accessible via
- * IGraph#each which is used by Enumerable to provide other methods.
- *
- * Example:
- *
- * g = IGraph.new([1,2,3,4],true)
- * g.each do |v|
- * puts v
- * end
- * g.find_all{|v| v > 2} #returns [3,4]
- *
- */
-
- VALUE cIGraph_each_vertex(VALUE self){
-
- igraph_t *graph;
- igraph_vs_t vs;
- igraph_vit_t vit;
-
- Data_Get_Struct(self, igraph_t, graph);
-
- igraph_vs_all(&vs);
- igraph_vit_create(graph, vs, &vit);
-
- while(!IGRAPH_VIT_END(vit)) {
- rb_yield(cIGraph_get_vertex_object(self,IGRAPH_VIT_GET(vit)));
- IGRAPH_VIT_NEXT(vit);
- }
-
- igraph_vit_destroy(&vit);
- igraph_vs_destroy(&vs);
-
- return Qnil;
-
- }
- /* call-seq:
- * graph.each_edge(mode){|v,w| } -> nil
- *
- * Iterates through all the edges in the graph. mode specifies the order the
- * edges are returned: IGRAPH_EDGEORDER_ID, edge id order.
- * IGRAPH_EDGEORDER_FROM, vertex id order, the id of the source vertex
- * counts for directed graphs. The order of the adjacent edges of a given
- * vertex is arbitrary. IGRAPH_EDGEORDER_TO, vertex id order, the id of the
- * target vertex counts for directed graphs. The order of the adjacent edges
- * of a given vertex is arbitrary. For undirected graph the latter two are
- * the same.
- *
- * Example:
- *
- * g = IGraph.new([1,2,3,4],true)
- * g.each_edge(IGraph::EDGORDER_ID) do |v,w|
- * puts "#{v} -> #{w}"
- * end
- *
- */
- VALUE cIGraph_each_edge(VALUE self, VALUE order){
-
- igraph_t *graph;
- igraph_es_t es;
- igraph_eit_t eit;
- igraph_edgeorder_type_t order_t = NUM2INT(order);
-
- igraph_integer_t from;
- igraph_integer_t to;
-
- Data_Get_Struct(self, igraph_t, graph);
-
- igraph_es_all(&es,order_t);
- igraph_eit_create(graph, es, &eit);
-
- while(!IGRAPH_EIT_END(eit)) {
- igraph_edge(graph,IGRAPH_EIT_GET(eit),&from,&to);
- rb_yield(rb_ary_new3(2,
- cIGraph_get_vertex_object(self, from),
- cIGraph_get_vertex_object(self, to)));
- IGRAPH_EIT_NEXT(eit);
- }
-
- igraph_eit_destroy(&eit);
- igraph_es_destroy(&es);
-
- return Qnil;
-
- }
-
- /* call-seq:
- * graph.each_edge_eid(mode){|id| } -> nil
- *
- * Iterates through all the edges in the graph. mode specifies the order the
- * edges are returned: IGRAPH_EDGEORDER_ID, edge id order.
- * IGRAPH_EDGEORDER_FROM, vertex id order, the id of the source vertex
- * counts for directed graphs. The order of the adjacent edges of a given
- * vertex is arbitrary. IGRAPH_EDGEORDER_TO, vertex id order, the id of the
- * target vertex counts for directed graphs. The order of the adjacent edges
- * of a given vertex is arbitrary. For undirected graph the latter two are
- * the same.
- *
- * Example:
- *
- * g = IGraph.new([1,2,3,4],true)
- * g.each_edge(IGraph::EDGORDER_ID) do |id|
- * puts id
- * end
- *
- */
- VALUE cIGraph_each_edge_eid(VALUE self, VALUE order){
-
- igraph_t *graph;
- igraph_es_t es;
- igraph_eit_t eit;
- igraph_edgeorder_type_t order_t = NUM2INT(order);
-
- Data_Get_Struct(self, igraph_t, graph);
-
- igraph_es_all(&es,order_t);
- igraph_eit_create(graph, es, &eit);
-
- while(!IGRAPH_EIT_END(eit)) {
- rb_yield(INT2NUM(IGRAPH_EIT_GET(eit)));
- IGRAPH_EIT_NEXT(eit);
- }
-
- igraph_eit_destroy(&eit);
- igraph_es_destroy(&es);
-
- return Qnil;
-
- }
|