aboutsummaryrefslogtreecommitdiffstats
path: root/include/utility.h
diff options
context:
space:
mode:
authorjustanothercatgirl <sotov2070@gmail.com>2024-05-16 22:10:25 +0300
committerjustanothercatgirl <sotov2070@gmail.com>2024-05-16 22:13:43 +0300
commita5f0d6ae9ace560b67c114af9071a268d8df2dc9 (patch)
treead8afa865b8f66f0ab1ee54032ac116139b54857 /include/utility.h
added dynarray implementation
Diffstat (limited to 'include/utility.h')
-rw-r--r--include/utility.h76
1 files changed, 76 insertions, 0 deletions
diff --git a/include/utility.h b/include/utility.h
new file mode 100644
index 0000000..4f264f0
--- /dev/null
+++ b/include/utility.h
@@ -0,0 +1,76 @@
+#ifndef JUSTANOTHERCATGIRL_HEADERS_UTILITY
+#define JUSTANOTHERCATGIRL_HEADERS_UTILITY
+
+#define stringify(val) _stringify_helper(val)
+#define _stringify_helper(val) #val
+
+#define struct_member_size(type, member) sizeof(( (type*)0 )->member)
+typedef unsigned char byte;
+#define upper_2_power_32(number) (32 - __builtin_clz(number))
+#define upper_2_power_64(number) (64 - __builtin_clzl(number))
+
+typedef int(*qsort_cmp_t)(const void*, const void*);
+#define get_qsort_cmp(type) __qsort_cmps[sizeof(type)]
+extern const qsort_cmp_t __qsort_cmps[];
+
+#ifdef UTILITY_EXPOSE_HELPERS
+ #define _UTILITY_STATIC
+ int __default_char_cmp(const void* a, const void* b);
+ int __default_short_cmp(const void* a, const void* b);
+ int __default_int_cmp(const void* a, const void* b);
+ int __default_long_cmp(const void* a, const void* b);
+ int __default_long_long_cmp(const void* a, const void* b);
+#else
+ #define _UTILITY_STATIC static
+#endif // UTILITY_EXPOSE_HELPERS
+
+
+#ifdef UTILITY_IMPLEMENTATION
+
+_UTILITY_STATIC int __default_char_cmp(const void* a, const void* b) {
+ char x = *(char*)a, y = *(char*)b;
+ if (x < y) return -1;
+ if (x > y) return 1;
+ return 0;
+}
+_UTILITY_STATIC int __default_short_cmp(const void* a, const void* b) {
+ short x = *(short*)a, y = *(short*)b;
+ if (x < y) return -1;
+ if (x > y) return 1;
+ return 0;
+}
+_UTILITY_STATIC int __default_int_cmp(const void* a, const void* b) {
+ int x = *(int*)a, y = *(int*)b;
+ if (x < y) return -1;
+ if (x > y) return 1;
+ return 0;
+}
+_UTILITY_STATIC int __default_long_long_cmp(const void* a, const void* b) {
+ long long x = *(long long*)a, y = *(long long*)b;
+ if (x < y) return -1;
+ if (x > y) return 1;
+ return 0;
+}
+_UTILITY_STATIC int __default_long_cmp(const void* a, const void* b) {
+ long x = *(long*)a, y = *(long*)b;
+ if (x < y) return -1;
+ if (x > y) return 1;
+ return 0;
+}
+
+// cope
+#pragma GCC diagnostic ignored "-Woverride-init" // Is is meant to override it on different platforms
+const qsort_cmp_t __qsort_cmps[] = {
+ [sizeof(char)] = __default_char_cmp,
+ [sizeof(short)] = __default_short_cmp,
+ [sizeof(int)] = __default_int_cmp,
+ [sizeof(long)] = __default_long_cmp,
+ [sizeof(long long)] = __default_long_long_cmp,
+ [64] = 0,
+};
+#pragma GCC diagnostic warning "-Woverride-init"
+
+#endif // UTILITY_IMPLEMENTATION
+
+
+#endif //JUSTANOTHERCATGIRL_HEADERS_UTILITY