#pragma once template constexpr T is_aligned(T value, T alignment) { return (value % alignment == 0); } static_assert(is_aligned(1024, 512)); static_assert(!is_aligned(235, 32)); static_assert(is_aligned(40960, 4096)); template constexpr T align_down(T value, T alignment) { return value - (value % alignment); } static_assert(align_down(598, 512) == 512); static_assert(align_down(194, 64) == 192); static_assert(align_down(62, 31) == 62); template constexpr T align_up(T value, T alignment) { if (is_aligned(value, alignment)) return value; return align_down(value, alignment) + alignment; } static_assert(align_up(598, 512) == 1024); static_assert(align_up(194, 64) == 256); static_assert(align_up(62, 31) == 62); template constexpr T get_blocks_from_size(T value, T block_size) { return (value + (block_size - 1)) / block_size; } static_assert(get_blocks_from_size(40960, 4096) == 10); static_assert(get_blocks_from_size(194, 64) == 4); static_assert(get_blocks_from_size(2, 32) == 1); static_assert(get_blocks_from_size(0, 256) == 0);