diff options
Diffstat (limited to 'asl/memory/layout.hpp')
-rw-r--r-- | asl/memory/layout.hpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/asl/memory/layout.hpp b/asl/memory/layout.hpp new file mode 100644 index 0000000..af867d8 --- /dev/null +++ b/asl/memory/layout.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include "asl/base/integers.hpp" +#include "asl/base/meta.hpp" + +namespace asl +{ + +template<typename T> +inline constexpr isize_t size_of = static_cast<isize_t>(sizeof(T)); + +template<typename T> +inline constexpr isize_t align_of = static_cast<isize_t>(alignof(T)); + +struct layout +{ + isize_t size; + isize_t align; + + constexpr bool operator==(const layout&) const = default; + + template<is_object T> + static constexpr layout of() + { + return layout{ size_of<T>, align_of<T> }; + } + + template<is_object T> + static constexpr layout array(isize_t size) + { + return layout{ size_of<T> * size, align_of<T> }; + } +}; + +} // namespace asl + +#define AslOffsetOf(S, M) (static_cast<isize_t>(__builtin_offsetof(S, M))) |