You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
2.7 KiB
103 lines
2.7 KiB
#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;
|
|
}
|
|
|