#ifndef PRB_MACROS_H #define PRB_MACROS_H #define ASSERT(E) if (!(E)) { *(int *)0 = 0; } #define ARRCNT(A) (sizeof(A)/sizeof(*(A))) #define OFFSETOF(T, E) ((size_t)(&(((T *)(0))->E))) #define MIN(A, B) (((A) < (B)) ? (A) : (B)) #define MAX(A, B) (((A) > (B)) ? (A) : (B)) #define CLAMP(A, X, B) (((X) < (A)) ? (A) : \ (((X) > (B)) ? (B) : (X))) #define CLAMPTOP(A, B) MIN(A, B) #define CLAMPBOT(A, B) MAX(A, B) #define SWAP(T, A, B) { T tmp = A; A = B; B = tmp; } /* NOTE(pryazha): Memory */ #define MEM0(P, N) memset((P), 0, (N)) #define MEM0STRUCT(P) MEM0((P), sizeof(*(P))) #define MEMCPY(D, S, N) memmove((D), (S), (N)) #define MEMMATCH(A, B, N) (memcmp((A), (B), (N)) == 0) #define KB(N) N*1024 #define MB(N) KB(N)*1024 #define GB(N) MB(N)*1024 /* NOTE(pryazha): Singly-linked list */ #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)) /* NOTE(pryazha): Doubly-linked list */ #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(L, F, 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))) #endif /* PRB_MACROS_H */