#include "catch.hpp" #include #define CAST_ASSERT(numeric_type) \ using limit = std::numeric_limits; \ auto min_value = static_cast(limit::min()) - 1; \ auto max_value = static_cast(limit::max()) + 1; \ CHECK(limit::min() == mapnik::safe_cast(min_value)); \ CHECK(limit::max() == mapnik::safe_cast(max_value)); #define CAST_ASSERT2(numeric_type) \ using limit = std::numeric_limits; \ auto min_value = static_cast(limit::min()); \ auto max_value = static_cast(limit::max()); \ CHECK(limit::min() == mapnik::safe_cast(min_value)); \ CHECK(limit::max() == mapnik::safe_cast(max_value)); #define CAST_ASSERT3(numeric_type) \ using limit = std::numeric_limits; \ auto min_value = static_cast(limit::min()) - 1; \ auto max_value = static_cast(limit::max()); \ CHECK(limit::min() == mapnik::safe_cast(min_value)); \ CHECK(limit::max() == mapnik::safe_cast(max_value)); #define CAST_ASSERT4(numeric_type) \ using limit = std::numeric_limits; \ auto min_value = static_cast(-limit::max()) - 1; \ auto max_value = static_cast(limit::max()); \ CHECK(-limit::max() == mapnik::safe_cast(min_value)); \ CHECK(limit::max() == mapnik::safe_cast(max_value)); TEST_CASE("saturated cast") { SECTION("int8") { CAST_ASSERT(std::int8_t); } SECTION("int16") { CAST_ASSERT(std::int16_t); } SECTION("int32") { CAST_ASSERT(std::int32_t); } SECTION("int64") { CAST_ASSERT2(std::int64_t); } SECTION("intmax") { CAST_ASSERT2(std::intmax_t); } SECTION("intptr") { CAST_ASSERT2(std::intptr_t); } SECTION("uint8") { CAST_ASSERT(std::uint8_t); } SECTION("uint16") { CAST_ASSERT(std::uint16_t); } SECTION("uint32") { CAST_ASSERT(std::uint32_t); } SECTION("uint64") { CAST_ASSERT3(std::uint64_t); } SECTION("uintmax") { CAST_ASSERT3(std::uintmax_t); } SECTION("uintptr") { CAST_ASSERT3(std::uintptr_t); } SECTION("float") { CAST_ASSERT4(float); } SECTION("freeform") { CHECK(static_cast(0) == mapnik::safe_cast(-1)); CHECK(static_cast(0) == mapnik::safe_cast(-1)); CHECK(static_cast(0) == mapnik::safe_cast(-1)); } }