diff --git a/include/stdx/utility.hpp b/include/stdx/utility.hpp index c138b96..8a1a71b 100644 --- a/include/stdx/utility.hpp +++ b/include/stdx/utility.hpp @@ -116,7 +116,7 @@ template if constexpr (sizeof(T) == sizeof(U)) { return sz; } else if constexpr (sizeof(T) > sizeof(U)) { - return sz * (sizeof(T) / sizeof(U)); + return (sz * sizeof(T) / sizeof(U)) + (sizeof(T) % sizeof(U) & 1u); } else { return (sz * sizeof(T) + sizeof(U) - 1) / sizeof(U); } diff --git a/test/utility.cpp b/test/utility.cpp index c13b48c..df96466 100644 --- a/test/utility.cpp +++ b/test/utility.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -130,6 +131,18 @@ TEST_CASE("sized aliases", "[utility]") { static_assert(stdx::sized64{1}.in() == 1); } +TEST_CASE("sized in (downsize not divisible)", "[utility]") { + using T = std::array; + static_assert(sizeof(T) == 3); + static_assert(stdx::sized{2}.in() == 3); +} + +TEST_CASE("sized in (upsize not divisible)", "[utility]") { + using T = std::array; + static_assert(sizeof(T) == 3); + static_assert(stdx::sized{3}.in() == 3); +} + TEST_CASE("CX_VALUE structural value", "[utility]") { auto x = CX_VALUE(42); static_assert(x() == 42);