diff options
author | justanothercatgirl <sotov2070@gmail.com> | 2024-05-16 22:10:25 +0300 |
---|---|---|
committer | justanothercatgirl <sotov2070@gmail.com> | 2024-05-16 22:13:43 +0300 |
commit | a5f0d6ae9ace560b67c114af9071a268d8df2dc9 (patch) | |
tree | ad8afa865b8f66f0ab1ee54032ac116139b54857 /include/utility.h |
added dynarray implementation
Diffstat (limited to 'include/utility.h')
-rw-r--r-- | include/utility.h | 76 |
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 |