#pragma once #include #include #include #include #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #include #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))