1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
#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 */
|