From a5f0d6ae9ace560b67c114af9071a268d8df2dc9 Mon Sep 17 00:00:00 2001 From: justanothercatgirl Date: Thu, 16 May 2024 22:10:25 +0300 Subject: added dynarray implementation --- include/utility.h | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 include/utility.h (limited to 'include/utility.h') 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 -- cgit v1.2.3-70-g09d2