Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libvgraph/vgraph.h
1808 views
1
#ifndef _GRAPH_H
2
#define _GRAPH_H 1
3
4
#include <cdt.h>
5
6
typedef struct _grnode_s Grnode_t;
7
typedef struct _gredge_s Gredge_t;
8
typedef struct _graph_s Graph_t;
9
typedef struct _grdisc_s Grdisc_t;
10
typedef struct _grdata_s Grdata_t;
11
typedef struct _gralgo_s Gralgo_t;
12
typedef Grdata_t* (*Grdata_f)_ARG_((Gralgo_t*, int, Grdata_t*));
13
typedef int (*Grevent_f)_ARG_((Graph_t*, int, Void_t*, Grdisc_t*));
14
15
struct _grnode_s
16
{ Dtlink_t hold; /* CDT object holder */
17
18
Void_t* label; /* unique node label */
19
20
Gredge_t* oedge; /* list of outgoing edges */
21
Gredge_t* iedge; /* list of incoming edges */
22
Gredge_t* elist; /* edge list being traversed */
23
24
Grnode_t* fold; /* group in union-find struct */
25
26
Grnode_t* link; /* for temporary link list */
27
28
Grdata_t* data; /* list of algorithm data */
29
};
30
31
struct _gredge_s
32
{ Dtlink_t hold; /* CDT object holder */
33
34
Grnode_t* tail; /* tail of edge */
35
Grnode_t* head; /* head of edge */
36
Void_t* label; /* (tail,head,label) ids edge */
37
38
Gredge_t* onext; /* link for node->oedge */
39
Gredge_t* inext; /* link for node->iedge */
40
41
Gredge_t* link; /* for temporary link list */
42
43
Grdata_t* data; /* list of algorithm data */
44
};
45
46
struct _graph_s
47
{ Grdisc_t* disc; /* graph discipline */
48
49
int type; /* directed or undirected */
50
51
Dtdisc_t nddc; /* CDT discipline for nodes */
52
Dt_t* nodes; /* set of nodes */
53
54
Dtdisc_t eddc; /* CDT discipline for edges */
55
Dt_t* edges; /* set of edges */
56
57
Grdata_t* data; /* list of algorithm data */
58
};
59
60
struct _grdisc_s
61
{ ssize_t nodesz; /* size to allocate Grnode_t */
62
ssize_t edgesz; /* size to allocate Gredge_t */
63
ssize_t graphsz; /* size to allocate Graph_t */
64
Grevent_f eventf; /* event handling function */
65
};
66
67
struct _grdata_s
68
{ Grdata_t* next; /* link list of these */
69
Gralgo_t* algo; /* data is for this algorithm */
70
};
71
72
struct _gralgo_s
73
{ Grdata_f dataf; /* to create/delete algo data */
74
int type;
75
};
76
77
78
/* type of graph */
79
#define GR_DIRECTED 0
80
#define GR_UNDIRECTED 1
81
82
83
/* discipline events */
84
#define GR_OPENING 001000
85
#define GR_CLOSING 002000
86
#define GR_NODE 000001 /* node operation */
87
#define GR_EDGE 000002 /* edge operation */
88
#define GR_GRAPH 000004 /* graph operation */
89
90
/* Given s_t a struct type, e_t an element in s_t, and a_d an address of e_t,
91
** GROFFSETOF returns the offset of e_t in s_t, and
92
** GRSTRUCTOF returns the address of the struct that contains e_t.
93
*/
94
#define GROFFSETOF(_st,_e) ((ssize_t)(&((_st*)0)->_e))
95
#define GRSTRUCTOF(_st,_e,_a) (_st*)((unsigned char*)(_a) - GROFFSETOF(_st,_e))
96
97
/* to initialize a discipline structure */
98
#define GRDISC(dc, nsz, esz, gsz, evf) \
99
((dc)->nodesz = (nsz), (dc)->edgesz = (esz), \
100
(dc)->graphsz = (gsz), (dc)->eventf = (evf) )
101
102
/* big number */
103
#define GR_INFINITY ((~((unsigned int)0)) >> 1 )
104
105
/* for internal use of node,edge,graph types */
106
#define _Grnode(oo) ((Grnode_t*)(oo))
107
#define _Gredge(oo) ((Gredge_t*)(oo))
108
#define _Grgraph(oo) ((Grgraph_t*)(oo))
109
110
_BEGIN_EXTERNS_
111
112
#if _BLD_vgraph && defined(__EXPORT__)
113
#define extern __EXPORT__
114
#endif
115
116
extern Graph_t* gropen _ARG_((Grdisc_t*, int));
117
extern int grclose _ARG_((Graph_t*));
118
extern int grrestore _ARG_((Graph_t*));
119
120
extern Grnode_t* grnode _ARG_((Graph_t*, Void_t*, int));
121
extern Gredge_t* gredge _ARG_((Graph_t*, Grnode_t*, Grnode_t*, Void_t*, int));
122
123
extern Grnode_t* grfold _ARG_((Grnode_t*, Grnode_t*));
124
extern Grnode_t* _grfind _ARG_((Grnode_t*));
125
126
extern Grdata_t* _grdata _ARG_((Grdata_t**, Gralgo_t*, int));
127
128
#undef extern
129
130
_END_EXTERNS_
131
132
/* return the representative node for a collapsed set of nodes */
133
#define grfind(nn) (_Grnode(nn)->fold == _Grnode(nn) ? _Grnode(nn) : _grfind(_Grnode(nn)) )
134
135
/* return the data associated with algorithm 'al' for the given object */
136
#define grdtnode(oo,al) \
137
((_Grnode(oo)->data && _Grnode(oo)->data->algo == (al)) ? _Grnode(oo)->data : \
138
_grdata(&_Grnode(oo)->data, (al), GR_NODE) )
139
#define grdtedge(oo,al) \
140
((_Gredge(oo)->data && _Gredge(oo)->data->algo == (al)) ? _Gredge(oo)->data : \
141
_grdata(&_Gredge(oo)->data, (al), GR_EDGE) )
142
#define grdtgraph(oo,al) \
143
((_Grgraph(oo)->data && _Grgraph(oo)->data->algo == (al)) ? _Grgraph(oo)->data : \
144
_grdata(&_Grgraph(oo)->data, (al), GR_GRAPH) )
145
146
/* for traversing all adjacent edges */
147
#define gradjacent(n) ((n)->elist = (n)->oedge)
148
#define grnextedge(n,e) ((n)->elist == (n)->iedge ? (e)-> inext : \
149
((e)->onext ? (e)->onext : ((n)->elist = (n)->iedge)) )
150
151
/******************************************************************************
152
* Functions germane to the algorithm to compute an optimum branching.
153
******************************************************************************/
154
_BEGIN_EXTERNS_
155
156
#if _BLD_vgraph && defined(__EXPORT__)
157
#define extern extern __EXPORT__
158
#endif
159
#if !_BLD_vgraph && defined(__IMPORT__)
160
#define extern extern __IMPORT__
161
#endif
162
163
extern Gralgo_t* Grbranching;
164
165
#undef extern
166
167
#if _BLD_vgraph && defined(__EXPORT__)
168
#define extern __EXPORT__
169
#endif
170
171
extern ssize_t grbranching _ARG_((Graph_t*));
172
extern ssize_t grbrweight _ARG_((Gredge_t*, ssize_t));
173
174
#undef extern
175
176
_END_EXTERNS_
177
178
#endif /*_GRAPH_H*/
179
180