#pragma once template constexpr T is_aligned(T value, T align_base) { return (value % align_base == 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 align_base) { return value - (value % align_base); } 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 align_base) { if (is_aligned(value, align_base)) return value; return align_down(value, align_base) + align_base; } 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);