1#pragma once
 2
 3#include <stddef.h>
 4#include <unistd.h>
 5
 6#ifdef __cplusplus
 7extern "C" {
 8#endif
 9
10/*
11 * Align to `alignment` boundary which must be a power of two or zero.
12 */
13
14static inline unsigned align_unsigned(unsigned n, unsigned alignment)
15{
16    if (alignment > 1) {
17        alignment--;
18        return (n + alignment) & ~alignment;
19    } else {
20        return n;
21    }
22}
23
24static inline void* align_pointer(void* ptr, unsigned alignment)
25{
26    if (alignment > 1) {
27        ptrdiff_t n = (ptrdiff_t) ptr;
28        alignment--;
29        return (void*) ((n + alignment) & ~(ptrdiff_t) alignment);
30    } else {
31        return ptr;
32    }
33}
34
35/*
36 * Align to page size.
37 */
38
39static unsigned sys_page_size()
40{
41    static unsigned page_size = 0;
42    if (page_size == 0) {
43        page_size = sysconf(_SC_PAGE_SIZE);
44    }
45    return page_size;
46}
47
48static inline unsigned align_unsigned_to_page(unsigned n)
49{
50    return align_unsigned(n, sys_page_size());
51}
52
53static inline void* align_pointer_to_page(void* ptr)
54{
55    return align_pointer(ptr, sys_page_size());
56}
57
58#ifdef __cplusplus
59}
60#endif