csnip  0.1
util.h
Go to the documentation of this file.
1 #ifndef CSNIP_UTIL_H
2 #define CSNIP_UTIL_H
3 
16 #include <string.h>
17 
19 #define csnip_Tswap(type, a, b) \
20  do { \
21  type csnip_tmp =(a); \
22  (a) = (b); \
23  (b) = csnip_tmp; \
24  } while(0)
25 
31 #define csnip_Swap(a, b) \
32  do { \
33  typeof(a) csnip_tmp = (a); \
34  (a) = (b); \
35  (b) = csnip_tmp; \
36  } while(0)
37 
43 #define csnip_Cswap(a, b) \
44  do { \
45  _Static_assert(sizeof(a) == sizeof(b)); \
46  char csnip_tmp[sizeof(a)]; \
47  memcpy(csnip_tmp, &(a), sizeof(csnip_tmp)); \
48  (a) = (b); \
49  memcpy(&(b), csnip_tmp, sizeof(csnip_tmp)); \
50  } while(0)
51 
53 #define csnip_Min(a, b) \
54  ((a) < (b) ? (a) : (b))
55 
57 #define csnip_Max(a, b) \
58  ((a) > (b) ? (a) : (b))
59 
61 #define csnip_Static_len(a) (sizeof(a) / sizeof(*(a)))
62 
64 inline size_t csnip_next_pow_of_2(size_t a)
65 {
66  if (a == 0)
67  return 1;
68  --a;
69  a |= a >> 1;
70  a |= a >> 2;
71  a |= a >> 4;
72  a |= a >> 8;
73  a |= a >> 16;
74  if (sizeof(a) > 4)
75  a |= a >> 32;
76  ++a;
77  return a;
78 }
79 
88 #define csnip_Fill_n(dest, len, val) \
89  do { \
90  size_t csnip__n = (size_t)(len); \
91  size_t csnip__i = 0; \
92  for (; csnip__i < csnip__n; ++csnip__i) { \
93  (dest)[csnip__i] = (val); \
94  } \
95  } while (0)
96 
102 #define csnip_Fill(dest_begin, dest_end, val) \
103  csnip_Fill_n(dest_begin, (dest_end) - (dest_begin), val)
104 
112 #define csnip_Copy_n(src, len, dest) \
113  do { \
114  size_t csnip__n = (size_t)(len); \
115  size_t csnip__i = 0; \
116  for (; csnip__i < csnip__n; ++csnip__i) \
117  { \
118  (dest)[csnip__i] = (src)[csnip__i]; \
119  } \
120  } while (0)
121 
127 #define csnip_Copy(src_begin, src_end, dest) \
128  csnip_Copy_n(src_begin, (src_end) - (src_begin), dest)
129 
132 #endif /* CSNIP_UTIL_H */
133 
134 #if defined(CSNIP_SHORT_NAMES) && !defined(CSNIP_UTIL_HAVE_SHORT_NAMES)
135 #define Tswap csnip_Tswap
136 #define Swap csnip_Swap
137 #define Cswap csnip_Cswap
138 #define Min csnip_Min
139 #define Max csnip_Max
140 #define Static_len csnip_Static_len
141 #define next_pow_of_2 csnip_next_pow_of_2
142 #define Fill_n csnip_Fill_n
143 #define Fill csnip_Fill
144 #define Copy_n csnip_Copy_n
145 #define Copy csnip_Copy
146 #define CSNIP_UTIL_HAVE_SHORT_NAMES
147 #endif /* CSNIP_SHORT_NAMES && !CSNIP_UTIL_HAVE_SHORT_NAMES */
size_t csnip_next_pow_of_2(size_t a)
Compute the next power of 2 of a number.
Definition: util.h:64