summaryrefslogtreecommitdiff
path: root/prb_macros.h
blob: a9a465d039b99805355f89cd23fbf33c936a63ce (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
56
57
58
59
60
61
#ifndef PRB_MACROS_H
#define PRB_MACROS_H

#define Assert(e) if (!(e)) { *(int *)0 = 0; }

#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 Clamp(a, x, b) (((x) < (a)) ? (a) : \
			(((x) > (b)) ? (b) : (x)))
#define ClampTop(a, b) Min(a, b)
#define ClampBottom(a, b) Max(a, b)

#define Swap(t, a, b) { t temp = a; a = b; b = temp; }

/* NOTE(pryazha): Memory */
#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 Kilobytes(n) n*1024
#define Megabytes(n) Kilobytes(n)*1024
#define Gigabytes(n) Megabytes(n)*1024

/* 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(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 */