diff --git a/include/boost/charconv/detail/emulated128.hpp b/include/boost/charconv/detail/emulated128.hpp index 4df58d6..8463953 100644 --- a/include/boost/charconv/detail/emulated128.hpp +++ b/include/boost/charconv/detail/emulated128.hpp @@ -54,6 +54,9 @@ struct uint128 UNSIGNED_CONSTRUCTOR(unsigned long) UNSIGNED_CONSTRUCTOR(unsigned long long) + #undef SIGNED_CONSTRUCTOR + #undef UNSIGNED_CONSTRUCTOR + // Assignment Operators #define SIGNED_ASSIGNMENT_OPERATOR(expr) BOOST_CHARCONV_CXX14_CONSTEXPR uint128 &operator=(expr v) noexcept { high = v < 0 ? UINT64_MAX : UINT64_C(0); low = static_cast(v); return *this; } #define UNSIGNED_ASSIGNMENT_OPERATOR(expr) BOOST_CHARCONV_CXX14_CONSTEXPR uint128 &operator=(expr v) noexcept { high = 0U; low = static_cast(v); return *this; } @@ -73,8 +76,11 @@ struct uint128 BOOST_CHARCONV_CXX14_CONSTEXPR uint128 &operator=(uint128 v) noexcept; + #undef SIGNED_ASSIGNMENT_OPERATOR + #undef UNSIGNED_ASSIGNMENT_OPERATOR + // Conversion Operators - #define INTEGER_CONVERSION_OPERATOR(expr) BOOST_CHARCONV_CXX14_CONSTEXPR explicit operator expr() const noexcept { return static_cast(low); } + #define INTEGER_CONVERSION_OPERATOR(expr) constexpr explicit operator expr() const noexcept { return static_cast(low); } #define FLOAT_CONVERSION_OPERATOR(expr) explicit operator expr() const noexcept { return std::ldexp(static_cast(high), 64) + static_cast(low); } INTEGER_CONVERSION_OPERATOR(char) @@ -93,6 +99,9 @@ struct uint128 FLOAT_CONVERSION_OPERATOR(double) FLOAT_CONVERSION_OPERATOR(long double) + #undef INTEGER_CONVERSION_OPERATOR + #undef FLOAT_CONVERSION_OPERATOR + // Comparison Operators // Equality @@ -205,6 +214,10 @@ struct uint128 INTEGER_OPERATOR_GREATER_THAN_OR_EQUAL_TO(unsigned long) INTEGER_OPERATOR_GREATER_THAN_OR_EQUAL_TO(unsigned long long) + BOOST_CHARCONV_CXX14_CONSTEXPR friend bool operator>=(uint128 lhs, uint128 rhs) noexcept; + + #undef INTEGER_OPERATOR_GREATER_THAN_OR_EQUAL_TO + BOOST_CHARCONV_CXX14_CONSTEXPR uint128 &uint128::operator=(uint128 v) noexcept { low = v.low;