101 lines
2.6 KiB
C
101 lines
2.6 KiB
C
#pragma once
|
|
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include <math.h>
|
|
|
|
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
|
|
|
#include <stdio.h>
|
|
#define ASSERT(cond) if (!(cond)) { fprintf(stderr, "%s:%d (%s): Assertion failed: %s\n", __FILE__, __LINE__, __func__, #cond); __builtin_trap(); }
|
|
|
|
#define NOT_IMPLEMENTED() ASSERT(0 && "Not implemented")
|
|
#define NOT_REACHABLE() ASSERT(0 && "Not reachable")
|
|
#define INCOMPLETE(cond) if (!(cond)) { fprintf(stderr, "%s:%d (%s): Incomplete: %s\n", __FILE__, __LINE__, __func__, #cond); __builtin_trap(); }
|
|
#define BP() asm("int3;nop;")
|
|
|
|
#define IS_POWER_OF_TWO(x) (((x) & ((x) - 1)) == 0)
|
|
|
|
#define container_of(ptr, type, member) (type *)((char *)(ptr) - offsetof(type, member))
|
|
|
|
typedef uint64_t u64;
|
|
typedef uint32_t u32;
|
|
typedef uint16_t u16;
|
|
typedef uint8_t u8;
|
|
|
|
typedef int64_t i64;
|
|
typedef int32_t i32;
|
|
typedef int16_t i16;
|
|
typedef int8_t i8;
|
|
|
|
typedef size_t usize;
|
|
typedef ptrdiff_t isize;
|
|
|
|
typedef float f32;
|
|
typedef double f64;
|
|
|
|
|
|
#define log(level, fmt, ...) fprintf(stderr, "[" level "] %s:%d (%s): " fmt "\n", __FILE__, __LINE__, __func__, ##__VA_ARGS__)
|
|
|
|
#define LOG_LEVEL_TRACE 6
|
|
#define LOG_LEVEL_DEBUG 5
|
|
#define LOG_LEVEL_VERBOSE 4
|
|
#define LOG_LEVEL_INFO 3
|
|
#define LOG_LEVEL_WARNING 2
|
|
#define LOG_LEVEL_ERROR 1
|
|
#define LOG_LEVEL_FATAL 0
|
|
|
|
#define LOG_LEVEL LOG_LEVEL_DEBUG
|
|
|
|
#if (LOG_LEVEL >= LOG_LEVEL_TRACE)
|
|
#define logt(fmt, ...) log("TRACE", fmt, ##__VA_ARGS__)
|
|
#else
|
|
#define logt(fmt, ...)
|
|
#endif
|
|
|
|
#if (LOG_LEVEL >= LOG_LEVEL_DEBUG)
|
|
#define logd(fmt, ...) log("\033[1;34mDEBUG\033[0m", fmt, ##__VA_ARGS__)
|
|
#else
|
|
#define logd(fmt, ...)
|
|
#endif
|
|
|
|
#if (LOG_LEVEL >= LOG_LEVEL_VERBOSE)
|
|
#define logv(fmt, ...) log("\033[1;32mVERBOSE\033[0m", fmt, ##__VA_ARGS__)
|
|
#else
|
|
#define logv(fmt, ...)
|
|
#endif
|
|
|
|
#if (LOG_LEVEL >= LOG_LEVEL_INFO)
|
|
#define logi(fmt, ...) log("\033[1;32mINFO\033[0m", fmt, ##__VA_ARGS__)
|
|
#else
|
|
#define logi(fmt, ...)
|
|
#endif
|
|
|
|
#if (LOG_LEVEL >= LOG_LEVEL_WARNING)
|
|
#define logw(fmt, ...) log("\033[1;33mWARNING\033[0m", fmt, ##__VA_ARGS__)
|
|
#else
|
|
#define logw(fmt, ...)
|
|
#endif
|
|
|
|
#if (LOG_LEVEL >= LOG_LEVEL_ERROR)
|
|
#define loge(fmt, ...) log("\033[1;31mERROR\033[0m", fmt, ##__VA_ARGS__)
|
|
#else
|
|
#define loge(fmt, ...)
|
|
#endif
|
|
|
|
#if (LOG_LEVEL >= LOG_LEVEL_FATAL)
|
|
#define logf(fmt, ...) do { log("\033[1;31mFATAL\033[0m", fmt, ##__VA_ARGS__); __builtin_trap(); } while (0)
|
|
#else
|
|
#define logf(fmt, ...)
|
|
#endif
|
|
|
|
|
|
#define Kilobytes(x) ((u64) (x) << 10)
|
|
#define Megabytes(x) ((u64) (x) << 20)
|
|
#define Gigabytes(x) ((u64) (x) << 30)
|
|
|
|
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
|
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
|
#define CLAMP(x, lo, hi) ((x) < (lo) ? (lo) : (x) > (hi) ? (hi) : (x))
|