00001 #ifndef GRAPH_H
00002 #define GRAPH_H
00003 
00004 typedef char *gGeneric;
00005 
00006 typedef struct graph_struct {
00007         gGeneric user_data;
00008 } graph_t;
00009 
00010 typedef struct vertex_struct {
00011         gGeneric user_data;
00012 } vertex_t;
00013 
00014 typedef struct edge_struct {
00015         gGeneric user_data;
00016 } edge_t;
00017 
00018 typedef void (*GRAPH_PFV)(gGeneric);
00019 typedef gGeneric (*GRAPH_PFG)(gGeneric);
00020 
00021 EXTERN graph_t *g_alloc ARGS((void));
00022 EXTERN void g_free ARGS((graph_t *, void(*)(gGeneric), void(*)(gGeneric), void(*)(gGeneric)));
00023 EXTERN void g_check ARGS((graph_t *));
00024 EXTERN graph_t *g_dup ARGS((graph_t *, gGeneric(*)(gGeneric), gGeneric(*)(gGeneric), gGeneric(*)(gGeneric)));
00025 
00026 EXTERN lsList g_get_vertices ARGS((graph_t *));
00027 
00028 #define foreach_vertex(g, lgen, v)                              \
00029         for (lgen = lsStart(g_get_vertices(g));                 \
00030                 lsNext(lgen, &v, LS_NH) == LS_OK        \
00031                    || ((void) lsFinish(lgen), 0); )
00032 
00033 #define foreach_edge(g, lgen, e)                                \
00034         for (lgen = lsStart(g_get_edges(g));                    \
00035                 lsNext(lgen, &e, LS_NH) == LS_OK        \
00036                    || ((void) lsFinish(lgen), 0); )
00037 
00038 EXTERN vertex_t *g_add_vertex ARGS((graph_t *));
00039 EXTERN void g_delete_vertex ARGS((vertex_t *, void (*)(gGeneric), void (*)(gGeneric)));
00040 EXTERN graph_t *g_vertex_graph ARGS((vertex_t *));
00041 
00042 EXTERN lsList g_get_edges ARGS((graph_t *));
00043 EXTERN lsList g_get_in_edges ARGS((vertex_t *));
00044 EXTERN lsList g_get_out_edges ARGS((vertex_t *));
00045 
00046 #define foreach_in_edge(v, lgen, e)                             \
00047         for (lgen = lsStart(g_get_in_edges(v));                 \
00048                 lsNext(lgen, &e, LS_NH) == LS_OK        \
00049                    || ((void) lsFinish(lgen), 0); )
00050 
00051 #define foreach_out_edge(v, lgen, e)                            \
00052         for (lgen = lsStart(g_get_out_edges(v));                \
00053                 lsNext(lgen, &e, LS_NH) == LS_OK        \
00054                    ||  ((void) lsFinish(lgen), 0); )
00055 
00056 EXTERN edge_t *g_add_edge ARGS((vertex_t *, vertex_t *));
00057 EXTERN void g_delete_edge ARGS((edge_t *, void (*)(gGeneric)));
00058 EXTERN graph_t *g_edge_graph ARGS((edge_t *));
00059 EXTERN vertex_t *g_e_source ARGS((edge_t *));
00060 EXTERN vertex_t *g_e_dest ARGS((edge_t *));
00061 
00062 EXTERN array_t *g_dfs ARGS((graph_t *));
00063 EXTERN int g_is_acyclic ARGS((graph_t *));
00064 EXTERN array_t *g_graph_sort ARGS((graph_t *, int (*)(const void *, const void *)));
00065 
00066 EXTERN st_table *g_reachable ARGS((graph_t *, st_table *));
00067 EXTERN st_table *g_EF ARGS((graph_t *, st_table *));
00068 EXTERN st_table *g_SCC ARGS((graph_t *, st_table *));
00069 
00070 #endif