chiark / gitweb /
segment labelling work-in-progress - yet to do are labels and graph colouring
[trains.git] / layout / graph-data.h
index b9fbfe94ad11c5a255acded1be6d59ca021f879c..bd44975b02c41bd5061cb41eccaefded6620852d 100644 (file)
@@ -17,6 +17,8 @@ struct Segment {
   const char *segname; /* 0 if unknown (usually elided by extractgraph) */
   int n_movfeats;
   MovFeat *movfeats; /* [0] is fixed */
+  MovFeat *starfeature; /* set by movfeatmultedges */
+  int u;
 };
 
 struct MovFeat {
@@ -33,7 +35,7 @@ struct EdgeEnd {
 };
 
 struct Edge {
-  int edgenum;
+  const char *pname;
   double distance;
   MovFeat *subseg;
   int movpos; /* 0 if fixed */
@@ -47,8 +49,10 @@ struct NodeSide {
 };
 
 struct Node {
-  int nodenum;
+  const char *pname;
   Node *back, *next;
+  double x,y,a;
+  int layermin,layermax;
   NodeSide sides[2];
 };
 
@@ -57,6 +61,42 @@ struct NodeList {
 };
 
 extern NodeList all_nodes;
+extern int next_nodenum, next_edgenum;
 
+extern Segment *all_segments[];
+
+
+#define FOR_ALL_NODES(node) for (node=all_nodes.head; node; node=node->next)
+#define FOR_BOTH(sideend) for (sideend=0; sideend<2; sideend++)
+
+#define FOR_NODE_EDGEENDS(side,edgeend, node)  \
+  FOR_BOTH(side)                               \
+    FOR_SIDE_EDGEENDS(edgeend, (node),side)
+
+#define FOR_SIDE_EDGEENDS(edgeend, node,side) \
+  for (edgeend=(node)->sides[(side)].head; edgeend; edgeend=edgeend->next)
+
+#define FOR_SEGMENT_MOVFEATS(i,f, segment) \
+  for (i=0, f=segment->movfeats; i < segment->n_movfeats; i++, f++)
+
+/* Iteration over edges: 
+ *   FOR_ALL_NODES(node) {
+ *     FOR_EDGES(edge, node,side,edgeend)
+ *       <statement>|<block>
+ *   }
+ * arranges execute statement/block once for each edge, setting edge
+ * appropriately.  edgeend must be of type EdgeEnd*, and side of type
+ * int; these are used as working variables by FOR_EDGES.
+ */
+#define FOR_EDGES(edge, node,side,edgeend)             \
+    FOR_NODE_EDGEENDS(side,edgeend, node)                      \
+      if ((edge= edgeend->edge), edgeend->end) {       \
+        /* do each edge once, from end 0, only */      \
+      } else
+
+#define FOR_ALL_SEGMENTS(segmentp,segment)     \
+  for (segmentp=all_segments;                  \
+       (segment= *segmentp);                   \
+       segmentp++)
 
 #endif /*GRAPH_DATA_H*/