summaryrefslogtreecommitdiff
path: root/vere/pkg/ur/defs.h
diff options
context:
space:
mode:
authorpolwex <polwex@sortug.com>2025-10-05 21:56:51 +0700
committerpolwex <polwex@sortug.com>2025-10-05 21:56:51 +0700
commitfcedfddf00b3f994e4f4e40332ac7fc192c63244 (patch)
tree51d38e62c7bdfcc5f9a5e9435fe820c93cfc9a3d /vere/pkg/ur/defs.h
claude is gud
Diffstat (limited to 'vere/pkg/ur/defs.h')
-rw-r--r--vere/pkg/ur/defs.h86
1 files changed, 86 insertions, 0 deletions
diff --git a/vere/pkg/ur/defs.h b/vere/pkg/ur/defs.h
new file mode 100644
index 0000000..68d6f74
--- /dev/null
+++ b/vere/pkg/ur/defs.h
@@ -0,0 +1,86 @@
+/// @file
+
+#ifndef UR_DEFS_H
+#define UR_DEFS_H
+
+#include <assert.h>
+#include <inttypes.h>
+#include <limits.h>
+
+typedef uint8_t ur_bool_t;
+
+#define ur_min(a, b) ( ((a) < (b)) ? (a) : (b) )
+#define ur_max(a, b) ( ((a) > (b)) ? (a) : (b) )
+
+/*
+** fibonacci constants, for convenient initialization of
+** objects intended to be reallocated with fibonacci growth
+*/
+#define ur_fib10 55
+#define ur_fib11 89
+#define ur_fib12 144
+#define ur_fib27 196418
+#define ur_fib28 317811
+#define ur_fib33 3524578
+#define ur_fib34 5702887
+
+/*
+** bit-masking helpers
+*/
+#define ur_mask_3(a) (a & 0x7)
+#define ur_mask_8(a) (a & 0xff)
+#define ur_mask_31(a) (a & 0x7fffffff)
+#define ur_mask_62(a) (a & 0x3fffffffffffffffULL)
+
+/*
+** bloq (binary exponent) conversions
+*/
+#define ur_bloq_up1(a) ( (a + 0x1) >> 1 )
+#define ur_bloq_up2(a) ( (a + 0x3) >> 2 )
+#define ur_bloq_up3(a) ( (a + 0x7) >> 3 )
+
+/*
+** atom measurement
+*/
+#if (32 == (CHAR_BIT * __SIZEOF_INT__))
+# define ur_lz32 __builtin_clz
+# define ur_tz32 __builtin_ctz
+#elif (32 == (CHAR_BIT * __SIZEOF_LONG__))
+# define ur_lz32 __builtin_clzl
+# define ur_tz32 __builtin_ctzl
+#else
+# error "port me"
+#endif
+
+#if (64 == (CHAR_BIT * __SIZEOF_LONG__))
+# define ur_lz64 __builtin_clzl
+# define ur_tz64 __builtin_ctzl
+#elif (64 == (CHAR_BIT * __SIZEOF_LONG_LONG__))
+# define ur_lz64 __builtin_clzll
+# define ur_tz64 __builtin_ctzll
+#else
+# error "port me"
+#endif
+
+#define ur_lz8(a) ( ur_lz32(a) - 24 )
+#define ur_tz8 ur_tz32
+
+#define ur_met0_8(a) ( (a) ? 8 - ur_lz8(a) : 0 )
+#define ur_met0_32(a) ( (a) ? 32 - ur_lz32(a) : 0 )
+#define ur_met0_64(a) ( (a) ? 64 - ur_lz64(a) : 0 )
+
+/*
+** unsafe wrt trailing null bytes, which are invalid
+*/
+inline uint64_t
+ur_met0_bytes_unsafe(uint64_t len, uint8_t *byt)
+{
+ uint64_t last = len - 1;
+ return (last << 3) + ur_met0_8(byt[last]);
+}
+
+#define ur_met3_8(a) ur_bloq_up3(ur_met0_8(a))
+#define ur_met3_32(a) ur_bloq_up3(ur_met0_32(a))
+#define ur_met3_64(a) ur_bloq_up3(ur_met0_64(a))
+
+#endif /* ifndef UR_DEFS_H */