summaryrefslogtreecommitdiff
path: root/src/curve.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/curve.h')
-rw-r--r--src/curve.h25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/curve.h b/src/curve.h
new file mode 100644
index 0000000..dc003c1
--- /dev/null
+++ b/src/curve.h
@@ -0,0 +1,25 @@
+#ifndef CURVE_H
+#define CURVE_H
+
+#include <limits.h>
+
+#define BIT_OF(X, I) (((X) >> (I)) & 1ULL)
+
+static uintptr_t zorder(int x, int y) {
+ uintptr_t z = 0;
+ // interleaving bits results in a point on the z-order curve
+ for (int i = 0; i < sizeof(x) * CHAR_BIT; i++)
+ z |= (BIT_OF(x, i) << i*2) | (BIT_OF(y, i) << (i*2 + 1));
+ return z;
+}
+
+static void unzorder(uintptr_t z, int *x, int *y) {
+ *x = 0; *y = 0;
+ for (int i = 0; i < sizeof(z) * CHAR_BIT / 2; i++) {
+ *x |= BIT_OF(z, i*2) << i;
+ *y |= BIT_OF(z, i*2 + 1) << i;
+ }
+}
+
+#undef BIT_OF
+#endif