summaryrefslogtreecommitdiff
path: root/prb_macros.h
blob: 5a38ae4858d523c20d68c521e24157b0a7e678e1 (plain)
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 */