#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)++)
#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; };