8 typedef struct Edge Edge;
9 typedef struct Segment Segment;
10 typedef struct MovFeat MovFeat;
11 typedef struct EdgeEnd EdgeEnd;
12 typedef struct Node Node;
13 typedef struct NodeList NodeList;
14 typedef struct NodeSide NodeSide;
17 const char *segname; /* 0 if unknown (usually elided by extractgraph) */
19 MovFeat *movfeats; /* [0] is fixed */
20 MovFeat *starfeature; /* set by movfeatmultedges */
26 const char *movfeat; /* 0 if fixed */
31 EdgeEnd *back, *next; /* other ends at same side of same node */
32 Edge *edge; /* edge->ends[end].edge==edge */
33 int end; /* edge->ends[end].edge==end */
41 int movpos; /* 0 if fixed */
46 Node *node; /* node->edges[side].node==node */
47 int side; /* node->edges[side].side==side */
55 int layermin,layermax;
63 extern NodeList all_nodes;
64 extern int next_nodenum, next_edgenum;
66 extern Segment *all_segments[];
69 #define FOR_ALL_NODES(node) for (node=all_nodes.head; node; node=node->next)
70 #define FOR_BOTH(sideend) for (sideend=0; sideend<2; sideend++)
72 #define FOR_NODE_EDGEENDS(side,edgeend, node) \
74 FOR_SIDE_EDGEENDS(edgeend, (node),side)
76 #define FOR_SIDE_EDGEENDS(edgeend, node,side) \
77 for (edgeend=(node)->sides[(side)].head; edgeend; edgeend=edgeend->next)
79 #define FOR_SEGMENT_MOVFEATS(i,f, segment) \
80 for (i=0, f=segment->movfeats; i < segment->n_movfeats; i++, f++)
82 /* Iteration over edges:
83 * FOR_ALL_NODES(node) {
84 * FOR_EDGES(edge, node,side,edgeend)
87 * arranges execute statement/block once for each edge, setting edge
88 * appropriately. edgeend must be of type EdgeEnd*, and side of type
89 * int; these are used as working variables by FOR_EDGES.
91 #define FOR_EDGES(edge, node,side,edgeend) \
92 FOR_NODE_EDGEENDS(side,edgeend, node) \
93 if ((edge= edgeend->edge), edgeend->end) { \
94 /* do each edge once, from end 0, only */ \
97 #define FOR_ALL_SEGMENTS(segmentp,segment) \
98 for (segmentp=all_segments; \
99 (segment= *segmentp); \
102 #endif /*GRAPH_DATA_H*/