diff --git a/include/etl/utility.h b/include/etl/utility.h index 0040dd7a..3c7da3a5 100644 --- a/include/etl/utility.h +++ b/include/etl/utility.h @@ -231,6 +231,35 @@ namespace etl struct enable_if_comparable : etl::enable_if::value && is_standard_integer::value, TReturn> { }; + + //*********************************** + /// cmp_less implementation helpers, selected by SFINAE to avoid + /// signed/unsigned comparison warnings in dead code branches. + //*********************************** + + // Both same signedness. + template + ETL_NODISCARD ETL_CONSTEXPR typename etl::enable_if::value == etl::is_signed::value, bool>::type cmp_less_impl(T t, U u) + ETL_NOEXCEPT + { + return t < u; + } + + // T is signed, U is unsigned. + template + ETL_NODISCARD ETL_CONSTEXPR typename etl::enable_if::value && !etl::is_signed::value, bool>::type cmp_less_impl(T t, U u) + ETL_NOEXCEPT + { + return (t < T(0)) || (typename etl::make_unsigned::type(t) < u); + } + + // T is unsigned, U is signed. + template + ETL_NODISCARD ETL_CONSTEXPR typename etl::enable_if::value && etl::is_signed::value, bool>::type cmp_less_impl(T t, U u) + ETL_NOEXCEPT + { + return (u >= U(0)) && (t < typename etl::make_unsigned::type(u)); + } } // namespace private_utility //*************************************************************************** @@ -264,9 +293,7 @@ namespace etl template ETL_NODISCARD ETL_CONSTEXPR typename private_utility::enable_if_comparable::type cmp_less(T t, U u) ETL_NOEXCEPT { - return (etl::is_signed::value == etl::is_signed::value) ? (t < u) - : etl::is_signed::value ? ((t < T(0)) || (typename etl::make_unsigned::type(t) < u)) - : ((u >= U(0)) && (t < typename etl::make_unsigned::type(u))); + return etl::private_utility::cmp_less_impl(t, u); } //***************************************************************************