From f307dd89e324f16b1f1c3c6559099b9c215a12e9 Mon Sep 17 00:00:00 2001 From: Kim Walisch Date: Tue, 18 Jun 2024 10:10:55 +0200 Subject: [PATCH] Add more assertions --- include/min.hpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/include/min.hpp b/include/min.hpp index 6ea9a110..14084f4f 100644 --- a/include/min.hpp +++ b/include/min.hpp @@ -14,6 +14,8 @@ #define MIN_HPP #include +#include + #include namespace { @@ -47,6 +49,11 @@ inline B min(A a, B b) static_assert(is_comparable::value, "min(A, B): Cannot compare types A and B"); +#if defined(ENABLE_ASSERT) + if (pstd::is_unsigned::value && pstd::is_signed::value) ASSERT(b >= 0); + if (pstd::is_unsigned::value && pstd::is_signed::value) ASSERT(b <= pstd::numeric_limits::max()); +#endif + return (B) std::min(a, (A) b); } @@ -56,6 +63,12 @@ inline C min3(A a, B b, C c) static_assert(is_comparable_3::value, "min3(A, B, C): Cannot compare types A, B and C"); +#if defined(ENABLE_ASSERT) + if (pstd::is_unsigned::value && pstd::is_signed::value) ASSERT(c >= 0); + if (pstd::is_unsigned::value && pstd::is_signed::value) ASSERT(c <= pstd::numeric_limits::max()); + if (pstd::is_unsigned::value && pstd::is_signed::value && pstd::is_signed::value) ASSERT(b >= 0 && c >= 0); +#endif + return (C) std::min(a, (A) std::min(b, (B) c)); } @@ -65,6 +78,11 @@ inline A max(A a, B b) static_assert(is_comparable::value, "max(A, B): Cannot compare types A and B"); +#if defined(ENABLE_ASSERT) + if (pstd::is_unsigned::value && pstd::is_signed::value) ASSERT(b >= 0); + if (pstd::is_unsigned::value && pstd::is_signed::value) ASSERT(b <= pstd::numeric_limits::max()); +#endif + return std::max(a, (A) b); } @@ -74,6 +92,12 @@ inline A max3(A a, B b, C c) static_assert(is_comparable_3::value, "max3(A, B, C): Cannot compare types A, B and C"); +#if defined(ENABLE_ASSERT) + if (pstd::is_unsigned::value && pstd::is_signed::value) ASSERT(c >= 0); + if (pstd::is_unsigned::value && pstd::is_signed::value) ASSERT(c <= pstd::numeric_limits::max()); + if (pstd::is_unsigned::value && pstd::is_signed::value && pstd::is_signed::value) ASSERT(b >= 0 || c >= 0); +#endif + return std::max(a, (A) std::max(b, (B) c)); }