diff --git a/mem/include/util/mem_utils.h b/mem/include/util/mem_utils.h new file mode 100644 index 0000000..dcb7133 --- /dev/null +++ b/mem/include/util/mem_utils.h @@ -0,0 +1,8 @@ +#ifndef MEM_UTILS_H +#define MEM_UTILS_H + +#include "aliases.h" + +void *mem_util_align_forward(void *ptr, u64 alignment); + +#endif // !MEM_UTILS_H diff --git a/mem/src/util/mem_utils.c b/mem/src/util/mem_utils.c new file mode 100644 index 0000000..89ae685 --- /dev/null +++ b/mem/src/util/mem_utils.c @@ -0,0 +1,23 @@ +#include "mem_utils.h" +#include "aliases.h" +#include +#include + +internal bool is_power_of_two(u64 num) { return (num & (num - 1)) == 0; } + +void *mem_util_align_forward(void *ptr, u64 alignment) { + assert(is_power_of_two(alignment)); + + uptr p = (uptr)ptr; + uptr align = (uptr)alignment; + + // Similar to p % align, but it's a faster implementation that works fine + // because align is guaranteed to be a power of 2 + uptr modulo = p & (align - 1); + + if (modulo != 0) { + p += align - modulo; + } + + return (void *)p; +}