chiark / gitweb /
smaller minimisations
[moebius2.git] / mgraph.h
index 8636b91bff06efdcbdfcf275123874f514eb9402..85f1a3c8d0ef621e8417a2715c1af014df187e91 100644 (file)
--- a/mgraph.h
+++ b/mgraph.h
@@ -9,7 +9,7 @@
  *                       | :
  *     ___ X-2 ___ X-1 ___| 0  ___  1  ___  2  ___  3  ___  4  __
  *         Y-1     Y-1    |0:      0       0       0       0
- *        /  \    /  \    / :\    /  \    /  \    /  \    / !! \
+ *        /  \    /  \    / :\    /  \    /  \    /  \    /  \
  *       /    \  /    \  /| : \  /    \  /    \  /    \  /    \
  *     X-3 ___ X-2 ___ X-1|___  0  ___  1  ___  2  ___  3  ___  4
  *     Y-2     Y-2     Y-2| :  1       1       1       1       1
@@ -42,7 +42,7 @@
  *
  * Node x,y for
  *   0 <= x < X = 2^XBITS     x = distance along
- *   0 <= y < Y = 2^YBITS-1     y = distance across
+ *   0 <= y < Y = 2^YBITS-1   y = distance across
  *
  * Vertices are in reading order from diagram above ie x varies fastest.
  *
@@ -60,8 +60,8 @@
  *                  /  \
  *                4/   5\
  *
- * vertex number:   0000 | y     | x
- *                        YBITS   XBITS
+ * vertex number:   0000 | y      | x
+ *                        (YBITS)   XBITS
  */
 
 #ifndef MGRAPH_H
 
 #include "common.h"
 
-#define XBITS 4
-#define X (1<<XBITS)
-#define YBITS 4
+#ifndef DEFSZ /* DEFSZ may be (Y/2-1)*10 + XBITS ie Y is 2*<tens>+1 */
+#define XBITS 3
+#define YBITS 3
 #define Y ((1<<YBITS) - 1)
+#define YMASK (Y << YSHIFT)
+#else
+#define XBITS  (DEFSZ % 10)
+#define Y      ((DEFSZ / 10)*2+1)
+#endif
+
+#define X (1<<XBITS)
 
 #define N (X*Y)
 #define XMASK (X-1)
 #define YSHIFT XBITS
 #define Y1 (1 << YSHIFT)
-#define YMASK (Y << YSHIFT)
 
 #define V6 6
+#define V3 3
 
 #define FOR_VERTEX(v) \
   for ((v)=0; (v)<N; (v)++)
 #define FOR_VPEDGE(v,e) \
   for ((e)=0; (e)<V6; (e)++)
 
-extern int edge_end2(unsigned v1, int e);
+int edge_end2(unsigned v1, int e);
 #define EDGE_END2 edge_end2
 
-#define RIM_VERTEX_P(v) (((v) & YMASK) == 0 || ((v) & YMASK) == (Y-1)*Y1)
+/* given    v1,e     s.t.  v2==EDGE_END2(v1,e) >= 0,
+ * returns  eprime   s.t.  v1==EDGE_END2(v2,eprime) */
+int edge_reverse(int v1, int e);
+
+#define EDGE_OPPOSITE(e) (((e)+V3) % V6)
+
+#define RIM_VERTEX_P(v) (((v) & ~XMASK) == 0 || ((v) & ~XMASK) == (Y-1)*Y1)
 
 #define FOR_VEDGE_X(v1,e,v2,init,otherwise)    \
   FOR_VPEDGE((v1),(e))                         \