chiark / gitweb /
fix threading bugs and arrangements
[moebius2.git] / mgraph.h
index 4ab020585b8e57609cbff0808aedbc2f1dc54d27..2ac57c7f6e7b71e333a9190c4653481a81a4c838 100644 (file)
--- a/mgraph.h
+++ b/mgraph.h
 #define V6 6
 #define V3 3
 
-#define FOR_VERTEX(v) \
-  for ((v)=0; (v)<N; (v)++)
+
+/* Loop constructors are macros of the form
+ *    LOOP(v,zero,n, precomp)
+ * which work much like this one:
+ */
+#define INNER(v,zero,n, precomp)  \
+  for ((v)=(zero); precomp, (v)<(n); (v)++)
+
+#define FOR_VERTEX(v,loop) \
+  loop ((v), 0, N, NOTHING)
 
 #define FOR_VPEDGE(e) \
   for ((e)=0; (e)<V6; (e)++)
@@ -117,17 +125,15 @@ int edge_reverse(int v1, int e);
 #define FOR_VEDGE(v1,e,v2)                     \
   FOR_VEDGE_X(v1,e,v2,NOTHING,NOTHING)
 
-#define FOR_EDGE(v1,e,v2)                      \
-  FOR_VERTEX((v1))                             \
+#define FOR_EDGE(v1,e,v2, loop)                        \
+  FOR_VERTEX((v1), loop)                       \
     FOR_VEDGE((v1),(e),(v2))
 
-#define FOR_RIM_VERTEX(vy,vx,v)                                        \
-  for ((vy)=0; (vy)<Y; (vy)+=Y-1)                              \
-    for ((vx)=0; (v)= (vy)<<YSHIFT | (vx), (vx)<X; (vx)++)
+#define FOR_RIM_VERTEX(vy,vx,v, loop)          \
+  for ((vy)=0; (vy)<Y; (vy)+=Y-1)              \
+    loop ((vx), 0, X, (v)= (vy)<<YSHIFT | (vx))
 
-#define VERTICES_SPAN_JOIN_P(v0,v1)            \
-  /* v0 and v1 must be (nearly) adjacent */    \
-  (!!((v0) ^ (v1) ^ (1<<(XBITS-1))))
+int vertices_span_join_p(int v0, int v1);
 
 typedef double Vertices[N][D3];
 struct Vertices { Vertices a; };