2 * util.h - utility functions and macros
7 #include "wimlib/compiler.h"
8 #include "wimlib/types.h"
14 /* Cast a pointer to a struct member to a pointer to the containing struct. */
15 #define container_of(ptr, type, member) \
16 ((type *)((char *)(ptr) - offsetof(type, member)))
18 /* Calculate 'n / d', but round up instead of down. */
19 #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
21 /* Calculate 'n % d', but return 'd' if the result would be 0. */
22 #define MODULO_NONZERO(n, d) (((n) % (d)) ? ((n) % (d)) : (d))
24 /* Get the number of elements of an array type. */
25 #define ARRAY_LEN(array) (sizeof(array) / sizeof((array)[0]))
27 /* Round 'v' up to the next 'alignment'-byte aligned boundary. 'alignment' must
29 #define ALIGN(v, alignment) (((v) + ((alignment) - 1)) & ~((alignment) - 1))
31 /* Maximum number of bytes that can be allocated on the stack.
33 * Note: this isn't a hard bound on the stack space used, since this is just for
34 * individual arrays. The full call stack could use more than this. */
35 #define STACK_MAX 32768
37 /* Default size of file I/O buffer. Currently assumed to be <= STACK_MAX. */
38 #define BUFFER_SIZE 32768
45 wimlib_malloc(size_t size) _malloc_attribute;
48 wimlib_free_memory(void *p);
51 wimlib_realloc(void *ptr, size_t size);
54 wimlib_calloc(size_t nmemb, size_t size) _malloc_attribute;
57 wimlib_strdup(const char *str) _malloc_attribute;
61 wimlib_wcsdup(const wchar_t *str) _malloc_attribute;
65 wimlib_aligned_malloc(size_t size, size_t alignment) _malloc_attribute;
68 wimlib_aligned_free(void *ptr);
71 memdup(const void *mem, size_t size) _malloc_attribute;
73 #define MALLOC wimlib_malloc
74 #define FREE wimlib_free_memory
75 #define REALLOC wimlib_realloc
76 #define CALLOC wimlib_calloc
77 #define STRDUP wimlib_strdup
78 #define WCSDUP wimlib_wcsdup
79 #define ALIGNED_MALLOC wimlib_aligned_malloc
80 #define ALIGNED_FREE wimlib_aligned_free
88 mempcpy(void *dst, const void *src, size_t n);
91 /**************************
92 * Random number generation
93 **************************/
96 get_random_bytes(void *p, size_t n);
99 get_random_alnum_chars(tchar *p, size_t n);
101 /************************
102 * Hashing and comparison
103 ************************/
106 is_power_of_2(unsigned long n)
108 return (n != 0 && (n & (n - 1)) == 0);
115 return n * 0x9e37fffffffc0001ULL;
119 cmp_u32(u32 n1, u32 n2)
129 cmp_u64(u64 n1, u64 n2)
138 /************************
140 ************************/
143 get_available_cpus(void);
146 get_available_memory(void);
148 #endif /* _WIMLIB_UTIL_H */