diff options
author | Jérémy Zurcher <jeremy@asynk.ch> | 2014-01-10 16:46:46 +0100 |
---|---|---|
committer | Jérémy Zurcher <jeremy@asynk.ch> | 2014-01-10 16:46:46 +0100 |
commit | ef6d10c4980eaf0feeb8569bc983075cc023ad83 (patch) | |
tree | 4f82e80470706ecd53aa5ef0824479e357d6f0d7 /src/lib | |
parent | fb3483672193c2fc360d3c6e450dc051541556e5 (diff) | |
download | eina_graph-ef6d10c4980eaf0feeb8569bc983075cc023ad83.zip eina_graph-ef6d10c4980eaf0feeb8569bc983075cc023ad83.tar.gz |
add eina_graph supports directed graphs
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/eina_graph.c | 23 | ||||
-rw-r--r-- | src/lib/eina_graph.h | 13 | ||||
-rw-r--r-- | src/lib/eina_graph_private.h | 1 |
3 files changed, 32 insertions, 5 deletions
diff --git a/src/lib/eina_graph.c b/src/lib/eina_graph.c index e3bf209..8d887cf 100644 --- a/src/lib/eina_graph.c +++ b/src/lib/eina_graph.c @@ -34,7 +34,7 @@ #include "eina_graph_private.h" EAPI Eina_Graph * -eina_graph_new(unsigned int v, unsigned int step) +eina_graph_new(unsigned int v, unsigned int step, Eina_Bool directed) { unsigned int i; _Eina_Graph *_g; @@ -47,6 +47,7 @@ eina_graph_new(unsigned int v, unsigned int step) } _g->vertices = v; + _g->directed = directed; for (i = 0; i < v; i++) _g->adjs[i] = eina_array_new(step); @@ -65,6 +66,14 @@ eina_graph_free(Eina_Graph *g) free(_g); } +EAPI Eina_Bool +eina_graph_directed(const Eina_Graph *g) +{ + _Eina_Graph * _g = (_Eina_Graph *) g; + + return _g->directed; +} + EAPI unsigned int eina_graph_vertices_count(const Eina_Graph *g) { @@ -152,7 +161,7 @@ eina_graph_edge_add(Eina_Graph *g, unsigned int v, unsigned int w) } if (!eina_array_push_uint(_g->adjs[v], w)) return EINA_FALSE; - if (v != w ) + if (!_g->directed && (v != w)) if (!eina_array_push_uint(_g->adjs[w], v)) return EINA_FALSE; _g->edges++; @@ -169,7 +178,10 @@ eina_graph_dot_write(Eina_Graph *g, FILE *f) Eina_Array *ar; _Eina_Graph * _g = (_Eina_Graph *) g; - fwrite("digraph {\n", 10, 1, f); + if (_g->directed) + fwrite("digraph {\n", 10, 1, f); + else + fwrite("strict graph {\n", 15, 1, f); for (i = 0; i< _g->vertices; i++) { @@ -177,7 +189,10 @@ eina_graph_dot_write(Eina_Graph *g, FILE *f) n = eina_array_count_get(ar); for (j = 0; j < n; j++) { - r = snprintf(buf, 32, "%u -> %u;\n", i, eina_array_uint_nth_get(ar, j)); + if (_g->directed) + r = snprintf(buf, 32, "%u -> %u;\n", i, eina_array_uint_nth_get(ar, j)); + else + r = snprintf(buf, 32, "%u -- %u;\n", i, eina_array_uint_nth_get(ar, j)); fwrite(buf, r, 1, f); } } diff --git a/src/lib/eina_graph.h b/src/lib/eina_graph.h index 3297a22..c47c66a 100644 --- a/src/lib/eina_graph.h +++ b/src/lib/eina_graph.h @@ -46,11 +46,12 @@ typedef struct _Eina_Graph_Opaque Eina_Graph; * * @param v the number of vertices. * @param step grow step for the adjacent lists. + * @param directed graph or not. * * @return a pointer to the Eina_Graph. */ EAPI Eina_Graph * -eina_graph_new(unsigned int v, unsigned int step); +eina_graph_new(unsigned int v, unsigned int step, Eina_Bool directed); /** * free the given graph. @@ -61,6 +62,16 @@ EAPI void eina_graph_free(Eina_Graph *g); /** + * returns true if it is a directed graph. + * + * @param g the graph to consider. + * + * @retur true if this is a directed graph. + */ +EAPI Eina_Bool +eina_graph_directed(const Eina_Graph *g); + +/** * returns the number of vertices of the graph. * * @param g the graph to consider. diff --git a/src/lib/eina_graph_private.h b/src/lib/eina_graph_private.h index 1925cf7..e8138a9 100644 --- a/src/lib/eina_graph_private.h +++ b/src/lib/eina_graph_private.h @@ -95,6 +95,7 @@ typedef struct _Eina_Graph { unsigned int vertices; unsigned int edges; + Eina_Bool directed; Eina_Array *adjs[]; } _Eina_Graph; |