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 */
25 const char *movfeat; /* 0 if fixed */
30 EdgeEnd *back, *next; /* other ends at same side of same node */
31 Edge *edge; /* edge->ends[end].edge==edge */
32 int end; /* edge->ends[end].edge==end */
40 int movpos; /* 0 if fixed */
45 Node *node; /* node->edges[side].node==node */
46 int side; /* node->edges[side].side==side */
60 extern NodeList all_nodes;
61 extern int next_nodenum, next_edgenum;
64 #define FOR_ALL_NODES(node) for (node=all_nodes.head; node; node=node->next)
65 #define FOR_BOTH(sideend) for (sideend=0; sideend<2; sideend++)
67 #define FOR_NODE_EDGEENDS(side,edgeend, node) \
69 FOR_SIDE_EDGEENDS(edgeend, (node),side)
71 #define FOR_SIDE_EDGEENDS(edgeend, node,side) \
72 for (edgeend=(node)->sides[(side)].head; edgeend; edgeend=edgeend->next)
74 #define FOR_SEGMENT_MOVFEATS(i,f, segment) \
75 for (i=0, f=segment->movfeats; i < segment->n_movfeats; i++, f++)
77 /* Iteration over edges:
78 * FOR_ALL_NODES(node) {
79 * FOR_EDGES(edge, node,side,edgeend)
82 * arranges execute statement/block once for each edge, setting edge
83 * appropriately. edgeend must be of type EdgeEnd*, and side of type
84 * int; these are used as working variables by FOR_EDGES.
86 #define FOR_EDGES(edge, node,side,edgeend) \
87 FOR_NODE_EDGEENDS(side,edgeend, node) \
88 if ((edge= edgeend->edge), edgeend->end) { \
89 /* do each edge once, from end 0, only */ \
93 #endif /*GRAPH_DATA_H*/