aboutsummaryrefslogtreecommitdiff
path: root/include/apos
diff options
context:
space:
mode:
Diffstat (limited to 'include/apos')
-rw-r--r--include/apos/utils.h114
1 files changed, 93 insertions, 21 deletions
diff --git a/include/apos/utils.h b/include/apos/utils.h
index 1d1d6dd..ce48776 100644
--- a/include/apos/utils.h
+++ b/include/apos/utils.h
@@ -49,34 +49,106 @@
#include <apos/types.h>
-static inline uintptr_t align_up(uintptr_t val, uintptr_t a)
-{
- if (!a)
- return val;
+#define align_up(x, y) \
+ _Generic((x), int8_t \
+ : align_up_int8_t, int16_t \
+ : align_up_int16_t, int32_t \
+ : align_up_int32_t, int64_t \
+ : align_up_int64_t, \
+ \
+ uint8_t \
+ : align_up_uint8_t, uint16_t \
+ : align_up_uint16_t, uint32_t \
+ : align_up_uint32_t, uint64_t \
+ : align_up_uint64_t)((x), (y))
- uintptr_t rem = val % a;
+#define DEFINE_ALIGN_UP(type) \
+ static inline type align_up_##type(type val, type a) \
+ { \
+ if (!a) \
+ return val; \
+ \
+ type rem = val % a; \
+ \
+ if (rem == 0) \
+ return val; \
+ \
+ return val + a - rem; \
+ }
- if (rem == 0)
- return val;
+DEFINE_ALIGN_UP(int8_t);
+DEFINE_ALIGN_UP(int16_t);
+DEFINE_ALIGN_UP(int32_t);
+DEFINE_ALIGN_UP(int64_t);
- return val + a - rem;
-}
+DEFINE_ALIGN_UP(uint8_t);
+DEFINE_ALIGN_UP(uint16_t);
+DEFINE_ALIGN_UP(uint32_t);
+DEFINE_ALIGN_UP(uint64_t);
-static inline uintptr_t align_down(uintptr_t val, uintptr_t a)
-{
- if (!a)
- return val;
+#define align_down(x, y) \
+ _Generic((x), int8_t \
+ : align_down_int8_t, int16_t \
+ : align_down_int16_t, int32_t \
+ : align_down_int32_t, int64_t \
+ : align_down_int64_t, \
+ \
+ uint8_t \
+ : align_down_uint8_t, uint16_t \
+ : align_down_uint16_t, uint32_t \
+ : align_down_uint32_t, uint64_t \
+ : align_down_uint64_t)((x), (y))
- return val - (val % a);
-}
+#define DEFINE_ALIGN_DOWN(type) \
+ static inline type align_down_##type(type val, type a) \
+ { \
+ if (!a) \
+ return val; \
+ \
+ return val - (val % a); \
+ }
-static inline bool aligned(uintmax_t val, uintmax_t a)
-{
- if (!a)
- return true;
+DEFINE_ALIGN_DOWN(int8_t);
+DEFINE_ALIGN_DOWN(int16_t);
+DEFINE_ALIGN_DOWN(int32_t);
+DEFINE_ALIGN_DOWN(int64_t);
- return val % a == 0;
-}
+DEFINE_ALIGN_DOWN(uint8_t);
+DEFINE_ALIGN_DOWN(uint16_t);
+DEFINE_ALIGN_DOWN(uint32_t);
+DEFINE_ALIGN_DOWN(uint64_t);
+
+#define is_aligned(x, y) \
+ _Generic((x), int8_t \
+ : is_aligned_int8_t, int16_t \
+ : is_aligned_int16_t, int32_t \
+ : is_aligned_int32_t, int64_t \
+ : is_aligned_int64_t, \
+ \
+ uint8_t \
+ : is_aligned_uint8_t, uint16_t \
+ : is_aligned_uint16_t, uint32_t \
+ : is_aligned_uint32_t, uint64_t \
+ : is_aligned_uint64_t)((x), (y))
+
+#define DEFINE_ALIGNED(type) \
+ static inline bool is_aligned_##type(type val, type a) \
+ { \
+ if (!a) \
+ return true; \
+ \
+ return val % a == 0; \
+ }
+
+DEFINE_ALIGNED(int8_t);
+DEFINE_ALIGNED(int16_t);
+DEFINE_ALIGNED(int32_t);
+DEFINE_ALIGNED(int64_t);
+
+DEFINE_ALIGNED(uint8_t);
+DEFINE_ALIGNED(uint16_t);
+DEFINE_ALIGNED(uint32_t);
+DEFINE_ALIGNED(uint64_t);
static inline int asciinum(char c)
{