ref: f865f1a64f13e4ef0edd5aa2b0f6d5621b22ba84
dir: /base.h/
#pragma once #include <assert.h> #include <limits.h> #include <stdbool.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> // clang or gcc or msvc or other #if defined(__clang__) #define ORCA_OPT_MINSIZE __attribute__((minsize)) #elif defined(__GNUC__) #define ORCA_OPT_MINSIZE __attribute__(("Os")) #elif defined(_MSC_VER) #define ORCA_OPT_MINSIZE #else #define ORCA_OPT_MINSIZE #endif // (gcc / clang) or msvc or other #if defined(__GNUC__) || defined(__clang__) #define ORCA_FORCE_INLINE __attribute__((always_inline)) inline #define ORCA_FORCE_STATIC_INLINE __attribute__((always_inline)) static inline #define ORCA_FORCE_NO_INLINE __attribute__((noinline)) #elif defined(_MSC_VER) #define ORCA_FORCE_INLINE __forceinline #define ORCA_FORCE_STATIC_INLINE __forceinline static #define ORCA_FORCE_NO_INLINE __declspec(noinline) #else #define ORCA_FORCE_INLINE inline #define ORCA_FORCE_STATIC_INLINE inline static #define ORCA_FORCE_NO_INLINE #endif // (gcc / clang) or other #if defined(__GNUC__) || defined(__clang__) #define ORCA_ASSUME_ALIGNED(_ptr, _alignment) \ __builtin_assume_aligned(_ptr, _alignment) #define ORCA_PURE __attribute__((pure)) #define ORCA_LIKELY(_x) __builtin_expect(_x, 1) #define ORCA_UNLIKELY(_x) __builtin_expect(_x, 0) #define ORCA_OK_IF_UNUSED __attribute__((unused)) #else #define ORCA_ASSUME_ALIGNED(_ptr, _alignment) (_ptr) #define ORCA_PURE #define ORCA_LIKELY(_x) (_x) #define ORCA_UNLIKELY(_x) (_x) #define ORCA_OK_IF_UNUSED #endif // array count, safer on gcc/clang #if defined(__GNUC__) || defined(__clang__) #define ORCA_ASSERT_IS_ARRAY(_array) \ (sizeof(char[1 - 2 * __builtin_types_compatible_p( \ __typeof(_array), __typeof(&(_array)[0]))]) - \ 1) #define ORCA_ARRAY_COUNTOF(_array) \ (sizeof(_array) / sizeof((_array)[0]) + ORCA_ASSERT_IS_ARRAY(_array)) #else // pray #define ORCA_ARRAY_COUNTOF(_array) (sizeof(_array) / sizeof(_array[0])) #endif #define ORCA_Y_MAX UINT16_MAX #define ORCA_X_MAX UINT16_MAX typedef uint8_t U8; typedef int8_t I8; typedef uint16_t U16; typedef int16_t I16; typedef uint32_t U32; typedef int32_t I32; typedef uint64_t U64; typedef int64_t I64; typedef size_t Usz; typedef ssize_t Isz; typedef char Glyph; typedef U8 Mark; typedef Glyph* Gbuffer; typedef struct { Gbuffer buffer; U16 height; U16 width; } Field; ORCA_FORCE_STATIC_INLINE Usz orca_round_up_power2(Usz x) { assert(x <= SIZE_MAX / 2 + 1); x -= 1; x |= (x >> 1); x |= (x >> 2); x |= (x >> 4); x |= (x >> 8); x |= (x >> 16); #if SIZE_MAX > UINT32_MAX x |= (x >> 32); #endif return x + 1; }