#define V6 6
#define V3 3
+
+/* 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_VPEDGE(e) \
for ((e)=0; (e)<V6; (e)++)
-int edge_end2(unsigned v1, int e);
-#define EDGE_END2 edge_end2
+extern short edge_end2_memo[][V6];
+#define EDGE_END2(v1,e) edge_end2_memo[v1][e]
/* given v1,e s.t. v2==EDGE_END2(v1,e) >= 0,
* returns eprime s.t. v1==EDGE_END2(v2,eprime) */
FOR_VERTEX((v1), loop) \
FOR_VEDGE((v1),(e),(v2))
-#define FOR_RIM_VERTEX(vy,vx,v, loop) \
- for ((vy)=0; (vy)<Y; (vy)+=Y-1) \
+#define FOR_NEAR_RIM_VERTEX(vy,vx,v, disttorim, loop) \
+ for ((vy)=(disttorim); (vy)<Y; (vy)+=Y-1-2*(disttorim)) \
loop ((vx), 0, X, (v)= (vy)<<YSHIFT | (vx))
+#define FOR_RIM_VERTEX(vy,vx,v, loop) \
+ FOR_NEAR_RIM_VERTEX((vy),(vx),(v), 0, loop)
+
int vertices_span_join_p(int v0, int v1);
typedef double Vertices[N][D3];
struct Vertices { Vertices a; };
+void mgraph_prepare(void);
+
#endif /*MGRAPH_H*/