#ifndef MACROS_H #define MACROS_H #if ENABLE_ASSERT #define Assert(s) if (!(s)) { __builtin_trap(); } /* *(int *)0 = 0; } */ #else #define Assert(s) #endif #define ArrayCount(a) (sizeof(a)/sizeof(*(a))) #define IntFromPtr(p) (unsigned long long)((char *)(p)/* -(char *)0 */) #define PtrFromInt(n) (void *)(/* (char *)0+ */(n)) #define Member(T, m) (((T *)0)->m) #define OffsetOfMember(T, m) (IntFromPtr(&Member(T, m))) #define Min(a, b) (((a) < (b)) ? (a) : (b)) #define Max(a, b) (((a) > (b)) ? (a) : (b)) #define ClampTop(a, b) Min(a, b) #define ClampBottom(a, b) Max(a, b) #include #define MemoryZero(p, n) memset((p), 0, (n)) #define MemoryZeroStruct(p) MemoryZero((p), sizeof(*(p))) #define MemoryZeroArray(p) MemoryZero((p), sizeof(p)) #define MemoryCopy(d, s, n) memmove((d), (s), (n)) #define MemoryCopyStruct(d, s) MemoryCopy((d), (s), Min(sizeof(*(d)), sizeof(*(s)))) #define MemoryCopyArray(d, s) MemoryCopy((d), (s), Min(sizeof(d), sizeof(s))) #define MemoryMatch(a, b, n) (memcmp((a), (b), (n)) == 0) #define DEG2RAD pi_F32/180.0f #define RAD2DEG 182.0f/pi_F32 /* NOTE(pryazha): Linked lists: */ #define SLLPush(f, l, n) \ ((f) == 0 ? \ ((f) = (l) = (n), (n)->next = 0) : \ ((l)->next = (n), (l) = (n), (n)->next = 0)) #define SLLPop(f, l) \ ((f) == (l) ? \ ((f) = (l) = 0) : \ ((f) = (f)->next)) #define DLLPushBack_NP(f, l, n, next, prev) \ ((f) == 0 ? \ ((f) = (l) = (n), (n)->next = (n)->prev = 0) : \ ((n)->prev = (l), (l)->next = (n), (l) = (n), (n)->next = 0)) #define DLLPushBack(f, l, n) DLLPushBack_NP(f, l, n, next, prev) #define DLLPushFront(f, l, n) DLLPushBack_NP(f, l, n, prev, next) #define DLLRemove(f, l, n) \ ((f) == (n) ? \ ((f) == (l) ? (f) = (l) = 0 : ((f) = (f)->next, (f)->prev = 0)) : \ ((l) == (n) ? ((l) = (l)->prev, (l)->next = 0) : \ ((n)->next->prev = (n)->prev, (n)->prev->next = (n)->next))) #define Kilobytes(n) n*1024 #define Megabytes(n) Kilobytes(n)*1024 #define Gigabytes(n) Megabytes(n)*1024 #endif /* MACROS_H */