From 56a2643399bdc4902f4e705384f2e941082279e9 Mon Sep 17 00:00:00 2001 From: Matt Borland Date: Mon, 30 Sep 2024 09:45:22 -0400 Subject: [PATCH 1/7] Simplify d32 bid_conversions --- doc/decimal/conversions.adoc | 4 ++-- include/boost/decimal/bid_conversion.hpp | 10 ++++------ include/boost/decimal/decimal32.hpp | 4 ++++ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/doc/decimal/conversions.adoc b/doc/decimal/conversions.adoc index 73d57454d..89d6c8a52 100644 --- a/doc/decimal/conversions.adoc +++ b/doc/decimal/conversions.adoc @@ -29,7 +29,7 @@ struct uint128 // ----- BID Conversions ----- -BOOST_DECIMAL_CXX20_CONSTEXPR std::uint32_t to_bid_d32(decimal32 val) noexcept; +constexpr std::uint32_t to_bid_d32(decimal32 val) noexcept; BOOST_DECIMAL_CXX20_CONSTEXPR std::uint32_t to_bid_d32f(decimal32_fast val) noexcept; @@ -43,7 +43,7 @@ template BOOST_DECIMAL_CXX20_CONSTEXPR auto to_bid(T val) noexcept; template -BOOST_DECIMAL_CXX20_CONSTEXPR T from_bid(std::uint32_t bits) noexcept; +constexpr T from_bid(std::uint32_t bits) noexcept; template BOOST_DECIMAL_CXX20_CONSTEXPR T from_bid(std::uint64_t bits) noexcept; diff --git a/include/boost/decimal/bid_conversion.hpp b/include/boost/decimal/bid_conversion.hpp index cb84317b1..cd4d75bd2 100644 --- a/include/boost/decimal/bid_conversion.hpp +++ b/include/boost/decimal/bid_conversion.hpp @@ -20,16 +20,14 @@ namespace decimal { # pragma GCC diagnostic ignored "-Wconversion" #endif -BOOST_DECIMAL_CXX20_CONSTEXPR auto to_bid_d32(decimal32 val) noexcept -> std::uint32_t +constexpr auto to_bid_d32(decimal32 val) noexcept -> std::uint32_t { - const auto bits {detail::bit_cast(val)}; - return bits; + return val.bits_; } -BOOST_DECIMAL_CXX20_CONSTEXPR auto from_bid_d32(std::uint32_t bits) noexcept -> decimal32 +constexpr auto from_bid_d32(std::uint32_t bits) noexcept -> decimal32 { - const auto val {detail::bit_cast(bits)}; - return val; + return from_bits(bits); } BOOST_DECIMAL_CXX20_CONSTEXPR auto to_bid_d32f(decimal32_fast val) noexcept -> std::uint32_t diff --git a/include/boost/decimal/decimal32.hpp b/include/boost/decimal/decimal32.hpp index 41be4a351..26370367f 100644 --- a/include/boost/decimal/decimal32.hpp +++ b/include/boost/decimal/decimal32.hpp @@ -218,6 +218,10 @@ BOOST_DECIMAL_EXPORT class decimal32 final // NOLINT(cppcoreguidelines-special-m template friend constexpr auto sequential_less_impl(DecimalType lhs, DecimalType rhs) noexcept -> bool; + friend constexpr auto to_bid_d32(decimal32 val) noexcept -> std::uint32_t; + + friend constexpr auto from_bid_d32(std::uint32_t bits) noexcept -> decimal32; + template friend constexpr auto to_dpd_d32(DecimalType val) noexcept BOOST_DECIMAL_REQUIRES_RETURN(detail::is_decimal_floating_point_v, DecimalType, std::uint32_t); From 8dde585e1be777c616cd2202392e2c6c3c11cc05 Mon Sep 17 00:00:00 2001 From: Matt Borland Date: Mon, 30 Sep 2024 09:49:32 -0400 Subject: [PATCH 2/7] Simplify and document d32_fast bid conversions --- doc/decimal/conversions.adoc | 6 +++++- include/boost/decimal/bid_conversion.hpp | 9 ++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/doc/decimal/conversions.adoc b/doc/decimal/conversions.adoc index 89d6c8a52..726d4e1af 100644 --- a/doc/decimal/conversions.adoc +++ b/doc/decimal/conversions.adoc @@ -31,7 +31,11 @@ struct uint128 constexpr std::uint32_t to_bid_d32(decimal32 val) noexcept; -BOOST_DECIMAL_CXX20_CONSTEXPR std::uint32_t to_bid_d32f(decimal32_fast val) noexcept; +constexpr decimal32 from_bid_d32(std::uint32_t bits) noexcept; + +constexpr std::uint32_t to_bid_d32f(decimal32_fast val) noexcept; + +constexpr decimal32_fast from_bid_d32f(std::uint32_t bits) noexcept; BOOST_DECIMAL_CXX20_CONSTEXPR std::uint64_t to_bid_d64(decimal64 val) noexcept; diff --git a/include/boost/decimal/bid_conversion.hpp b/include/boost/decimal/bid_conversion.hpp index cd4d75bd2..0123d69f8 100644 --- a/include/boost/decimal/bid_conversion.hpp +++ b/include/boost/decimal/bid_conversion.hpp @@ -30,16 +30,15 @@ constexpr auto from_bid_d32(std::uint32_t bits) noexcept -> decimal32 return from_bits(bits); } -BOOST_DECIMAL_CXX20_CONSTEXPR auto to_bid_d32f(decimal32_fast val) noexcept -> std::uint32_t +constexpr auto to_bid_d32f(decimal32_fast val) noexcept -> std::uint32_t { const decimal32 compliant_val {val}; - const auto bits {detail::bit_cast(compliant_val)}; - return bits; + return to_bid_d32(compliant_val); } -BOOST_DECIMAL_CXX20_CONSTEXPR auto from_bid_d32f(std::uint32_t bits) noexcept -> decimal32_fast +constexpr auto from_bid_d32f(std::uint32_t bits) noexcept -> decimal32_fast { - const auto compliant_val {detail::bit_cast(bits)}; + const auto compliant_val {from_bid_d32(bits)}; const decimal32_fast val {compliant_val}; return val; } From 917c21a154e7d7d36d1ef8a8eb71051f7d44b4a4 Mon Sep 17 00:00:00 2001 From: Matt Borland Date: Mon, 30 Sep 2024 10:05:12 -0400 Subject: [PATCH 3/7] Simplify and document d64 bid conversions --- doc/decimal/conversions.adoc | 4 +++- include/boost/decimal/bid_conversion.hpp | 10 ++++------ include/boost/decimal/decimal64.hpp | 4 ++++ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/doc/decimal/conversions.adoc b/doc/decimal/conversions.adoc index 726d4e1af..531fc08f2 100644 --- a/doc/decimal/conversions.adoc +++ b/doc/decimal/conversions.adoc @@ -37,7 +37,9 @@ constexpr std::uint32_t to_bid_d32f(decimal32_fast val) noexcept; constexpr decimal32_fast from_bid_d32f(std::uint32_t bits) noexcept; -BOOST_DECIMAL_CXX20_CONSTEXPR std::uint64_t to_bid_d64(decimal64 val) noexcept; +constexpr std::uint64_t to_bid_d64(decimal64 val) noexcept; + +constexpr decimal64 from_bid_d64(std::uint64_t bits) noexcept; BOOST_DECIMAL_CXX20_CONSTEXPR std::uint64_t to_bid_d64f(decimal64_fast val) noexcept; diff --git a/include/boost/decimal/bid_conversion.hpp b/include/boost/decimal/bid_conversion.hpp index 0123d69f8..0fbbd7ceb 100644 --- a/include/boost/decimal/bid_conversion.hpp +++ b/include/boost/decimal/bid_conversion.hpp @@ -43,16 +43,14 @@ constexpr auto from_bid_d32f(std::uint32_t bits) noexcept -> decimal32_fast return val; } -BOOST_DECIMAL_CXX20_CONSTEXPR auto to_bid_d64(decimal64 val) noexcept -> std::uint64_t +constexpr auto to_bid_d64(decimal64 val) noexcept -> std::uint64_t { - const auto bits {detail::bit_cast(val)}; - return bits; + return val.bits_; } -BOOST_DECIMAL_CXX20_CONSTEXPR auto from_bid_d64(std::uint64_t bits) noexcept -> decimal64 +constexpr auto from_bid_d64(std::uint64_t bits) noexcept -> decimal64 { - const auto val {detail::bit_cast(bits)}; - return val; + return from_bits(bits); } BOOST_DECIMAL_CXX20_CONSTEXPR auto to_bid_d64f(decimal64_fast val) noexcept -> std::uint64_t diff --git a/include/boost/decimal/decimal64.hpp b/include/boost/decimal/decimal64.hpp index b693ac1dd..14cc489b9 100644 --- a/include/boost/decimal/decimal64.hpp +++ b/include/boost/decimal/decimal64.hpp @@ -225,6 +225,10 @@ BOOST_DECIMAL_EXPORT class decimal64 final template friend constexpr auto sequential_less_impl(DecimalType lhs, DecimalType rhs) noexcept -> bool; + friend constexpr auto to_bid_d64(decimal64 val) noexcept -> std::uint64_t; + + friend constexpr auto from_bid_d64(std::uint64_t bits) noexcept -> decimal64; + public: // 3.2.3.1 construct/copy/destroy constexpr decimal64() noexcept = default; From e14ca7c38a17fcc22b542bfc698e1b965c82beec Mon Sep 17 00:00:00 2001 From: Matt Borland Date: Mon, 30 Sep 2024 10:11:00 -0400 Subject: [PATCH 4/7] Simplify and document d64_fast bid conversions --- doc/decimal/conversions.adoc | 4 +++- include/boost/decimal/bid_conversion.hpp | 9 ++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/doc/decimal/conversions.adoc b/doc/decimal/conversions.adoc index 531fc08f2..5d386dce6 100644 --- a/doc/decimal/conversions.adoc +++ b/doc/decimal/conversions.adoc @@ -41,7 +41,9 @@ constexpr std::uint64_t to_bid_d64(decimal64 val) noexcept; constexpr decimal64 from_bid_d64(std::uint64_t bits) noexcept; -BOOST_DECIMAL_CXX20_CONSTEXPR std::uint64_t to_bid_d64f(decimal64_fast val) noexcept; +constexpr std::uint64_t to_bid_d64f(decimal64_fast val) noexcept; + +constexpr decimal64_fast from_bid_d64f(std::uint64_t bits) noexcept; BOOST_DECIMAL_CXX20_CONSTEXPR detail::uint128 to_bid_d128(decimal128 val) noexcept; diff --git a/include/boost/decimal/bid_conversion.hpp b/include/boost/decimal/bid_conversion.hpp index 0fbbd7ceb..372dd7bf8 100644 --- a/include/boost/decimal/bid_conversion.hpp +++ b/include/boost/decimal/bid_conversion.hpp @@ -53,16 +53,15 @@ constexpr auto from_bid_d64(std::uint64_t bits) noexcept -> decimal64 return from_bits(bits); } -BOOST_DECIMAL_CXX20_CONSTEXPR auto to_bid_d64f(decimal64_fast val) noexcept -> std::uint64_t +constexpr auto to_bid_d64f(decimal64_fast val) noexcept -> std::uint64_t { const decimal64 compliant_val {val}; - const auto bits {detail::bit_cast(compliant_val)}; - return bits; + return to_bid_d64(compliant_val); } -BOOST_DECIMAL_CXX20_CONSTEXPR auto from_bid_d64f(std::uint64_t bits) noexcept -> decimal64_fast +constexpr auto from_bid_d64f(std::uint64_t bits) noexcept -> decimal64_fast { - const auto compliant_val {detail::bit_cast(bits)}; + const auto compliant_val {from_bid_d64(bits)}; const decimal64_fast val {compliant_val}; return val; } From ec1059a46e6ecc92494bdeb1ae367182723eeeba Mon Sep 17 00:00:00 2001 From: Matt Borland Date: Mon, 30 Sep 2024 10:20:26 -0400 Subject: [PATCH 5/7] Simplify and document d128 bid conversions --- doc/decimal/conversions.adoc | 17 +++++++++++++---- include/boost/decimal/bid_conversion.hpp | 17 +++++++++++------ include/boost/decimal/decimal128.hpp | 8 ++++++++ 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/doc/decimal/conversions.adoc b/doc/decimal/conversions.adoc index 5d386dce6..7efdf32c5 100644 --- a/doc/decimal/conversions.adoc +++ b/doc/decimal/conversions.adoc @@ -45,19 +45,28 @@ constexpr std::uint64_t to_bid_d64f(decimal64_fast val) noexcept; constexpr decimal64_fast from_bid_d64f(std::uint64_t bits) noexcept; -BOOST_DECIMAL_CXX20_CONSTEXPR detail::uint128 to_bid_d128(decimal128 val) noexcept; +constexpr detail::uint128 to_bid_d128(decimal128 val) noexcept; + +constexpr decimal128 from_bid_d128(detail::uint128 bits) noexcept; + +// Automatic detection if your platform has built-in unsigned __int128 or not to enable/disable the overload +#ifdef BOOST_DECIMAL_HAS_INT128 + +constexpr decimal128 from_bid_d128(unsigned __int128 bits) noexcept; + +#endif // BOOST_DECIMAL_HAS_INT128 template -BOOST_DECIMAL_CXX20_CONSTEXPR auto to_bid(T val) noexcept; +constexpr auto to_bid(T val) noexcept; template constexpr T from_bid(std::uint32_t bits) noexcept; template -BOOST_DECIMAL_CXX20_CONSTEXPR T from_bid(std::uint64_t bits) noexcept; +constexpr T from_bid(std::uint64_t bits) noexcept; template -BOOST_DECIMAL_CXX20_CONSTEXPR T from_bid(detail::uint128 bits) noexcept; +constexpr T from_bid(detail::uint128 bits) noexcept; // ----- DPD Conversions ----- diff --git a/include/boost/decimal/bid_conversion.hpp b/include/boost/decimal/bid_conversion.hpp index 372dd7bf8..02f9229f3 100644 --- a/include/boost/decimal/bid_conversion.hpp +++ b/include/boost/decimal/bid_conversion.hpp @@ -66,18 +66,23 @@ constexpr auto from_bid_d64f(std::uint64_t bits) noexcept -> decimal64_fast return val; } -BOOST_DECIMAL_CXX20_CONSTEXPR auto to_bid_d128(decimal128 val) noexcept -> detail::uint128 +constexpr auto to_bid_d128(decimal128 val) noexcept -> detail::uint128 { - const auto bits {detail::bit_cast(val)}; - return bits; + return val.bits_; } -BOOST_DECIMAL_CXX20_CONSTEXPR auto from_bid_d128(detail::uint128 bits) noexcept -> decimal128 +constexpr auto from_bid_d128(detail::uint128 bits) noexcept -> decimal128 { - const auto val {detail::bit_cast(bits)}; - return val; + return from_bits(bits); } +#ifdef BOOST_DECIMAL_HAS_INT128 +constexpr auto from_bits_d128(detail::uint128_t bits) noexcept -> decimal128 +{ + return from_bits(bits); +} +#endif + BOOST_DECIMAL_CXX20_CONSTEXPR auto to_bid_d128f(decimal128_fast val) noexcept -> detail::uint128 { const decimal128 compliant_val {val}; diff --git a/include/boost/decimal/decimal128.hpp b/include/boost/decimal/decimal128.hpp index 290ae153b..36bbf324b 100644 --- a/include/boost/decimal/decimal128.hpp +++ b/include/boost/decimal/decimal128.hpp @@ -228,6 +228,14 @@ BOOST_DECIMAL_EXPORT class decimal128 final friend constexpr auto not_finite(decimal128 rhs) noexcept -> bool; + friend constexpr auto to_bid_d128(decimal128 val) noexcept -> detail::uint128; + + friend constexpr auto from_bid_d128(detail::uint128 bits) noexcept -> decimal128; + + #ifdef BOOST_DECIMAL_HAS_INT128 + friend constexpr auto from_bid_d128(detail::uint128_t bits) noexcept -> decimal128; + #endif + public: // 3.2.4.1 construct/copy/destroy constexpr decimal128() noexcept = default; From 63c121f22df3a82bd7cc78d05928e1b7e2284071 Mon Sep 17 00:00:00 2001 From: Matt Borland Date: Mon, 30 Sep 2024 10:28:07 -0400 Subject: [PATCH 6/7] Simplify and document d128f bid conversions --- doc/decimal/conversions.adoc | 10 ++++++ include/boost/decimal/bid_conversion.hpp | 42 ++++++++++++++---------- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/doc/decimal/conversions.adoc b/doc/decimal/conversions.adoc index 7efdf32c5..4a97f4156 100644 --- a/doc/decimal/conversions.adoc +++ b/doc/decimal/conversions.adoc @@ -56,6 +56,16 @@ constexpr decimal128 from_bid_d128(unsigned __int128 bits) noexcept; #endif // BOOST_DECIMAL_HAS_INT128 +constexpr detail::uint128 to_bid_d128f(decimal128_fast val) noexcept; + +constexpr decimal128 from_bid_d128f(detail::uint128 bits) noexcept; + +#ifdef BOOST_DECIMAL_HAS_INT128 + +constexpr decimal128 from_bid_d128f(unsigned __int128 bits) noexcept; + +#endif // BOOST_DECIMAL_HAS_INT128 + template constexpr auto to_bid(T val) noexcept; diff --git a/include/boost/decimal/bid_conversion.hpp b/include/boost/decimal/bid_conversion.hpp index 02f9229f3..7659f2fc5 100644 --- a/include/boost/decimal/bid_conversion.hpp +++ b/include/boost/decimal/bid_conversion.hpp @@ -83,85 +83,93 @@ constexpr auto from_bits_d128(detail::uint128_t bits) noexcept -> decimal128 } #endif -BOOST_DECIMAL_CXX20_CONSTEXPR auto to_bid_d128f(decimal128_fast val) noexcept -> detail::uint128 +constexpr auto to_bid_d128f(decimal128_fast val) noexcept -> detail::uint128 { const decimal128 compliant_val {val}; - const auto bits {detail::bit_cast(compliant_val)}; - return bits; + return to_bid_d128(compliant_val); } -BOOST_DECIMAL_CXX20_CONSTEXPR auto from_bid_d128f(detail::uint128 bits) noexcept -> decimal128_fast +constexpr auto from_bid_d128f(detail::uint128 bits) noexcept -> decimal128_fast { - const auto compliant_val {detail::bit_cast(bits)}; + const auto compliant_val {from_bid_d128(bits)}; const decimal128_fast val {compliant_val}; return val; } -BOOST_DECIMAL_CXX20_CONSTEXPR auto to_bid(decimal32 val) noexcept -> std::uint32_t +#ifdef BOOST_DECIMAL_HAS_INT128 +constexpr auto from_bid_d128f(detail::uint128_t bits) noexcept -> decimal128_fast +{ + const auto compliant_val {from_bid_d128(bits)}; + const decimal128_fast val {compliant_val}; + return val; +} +#endif + +constexpr auto to_bid(decimal32 val) noexcept -> std::uint32_t { return to_bid_d32(val); } -BOOST_DECIMAL_CXX20_CONSTEXPR auto to_bid(decimal32_fast val) noexcept -> std::uint32_t +constexpr auto to_bid(decimal32_fast val) noexcept -> std::uint32_t { return to_bid_d32f(val); } -BOOST_DECIMAL_CXX20_CONSTEXPR auto to_bid(decimal64 val) noexcept -> std::uint64_t +constexpr auto to_bid(decimal64 val) noexcept -> std::uint64_t { return to_bid_d64(val); } -BOOST_DECIMAL_CXX20_CONSTEXPR auto to_bid(decimal64_fast val) noexcept -> std::uint64_t +constexpr auto to_bid(decimal64_fast val) noexcept -> std::uint64_t { return to_bid_d64f(val); } -BOOST_DECIMAL_CXX20_CONSTEXPR auto to_bid(decimal128 val) noexcept -> detail::uint128 +constexpr auto to_bid(decimal128 val) noexcept -> detail::uint128 { return to_bid_d128(val); } -BOOST_DECIMAL_CXX20_CONSTEXPR auto to_bid(decimal128_fast val) noexcept -> detail::uint128 +constexpr auto to_bid(decimal128_fast val) noexcept -> detail::uint128 { return to_bid_d128f(val); } template -BOOST_DECIMAL_CXX20_CONSTEXPR auto from_bid(std::uint32_t bits) noexcept +constexpr auto from_bid(std::uint32_t bits) noexcept BOOST_DECIMAL_REQUIRES(detail::is_decimal_floating_point_v, T) { return from_bid_d32f(bits); } template <> -BOOST_DECIMAL_CXX20_CONSTEXPR auto from_bid(std::uint32_t bits) noexcept -> decimal32 +constexpr auto from_bid(std::uint32_t bits) noexcept -> decimal32 { return from_bid_d32(bits); } template -BOOST_DECIMAL_CXX20_CONSTEXPR auto from_bid(std::uint64_t bits) noexcept +constexpr auto from_bid(std::uint64_t bits) noexcept BOOST_DECIMAL_REQUIRES(detail::is_decimal_floating_point_v, T) { return from_bid_d64f(bits); } template <> -BOOST_DECIMAL_CXX20_CONSTEXPR auto from_bid(std::uint64_t bits) noexcept -> decimal64 +constexpr auto from_bid(std::uint64_t bits) noexcept -> decimal64 { return from_bid_d64(bits); } template -BOOST_DECIMAL_CXX20_CONSTEXPR auto from_bid(detail::uint128 bits) noexcept +constexpr auto from_bid(detail::uint128 bits) noexcept BOOST_DECIMAL_REQUIRES(detail::is_decimal_floating_point_v, T) { return from_bid_d128f(bits); } template <> -BOOST_DECIMAL_CXX20_CONSTEXPR auto from_bid(detail::uint128 bits) noexcept -> decimal128 +constexpr auto from_bid(detail::uint128 bits) noexcept -> decimal128 { return from_bid_d128(bits); } From 71fe57212fbb44fa48e344bda73ed51ca9bf93d3 Mon Sep 17 00:00:00 2001 From: Matt Borland Date: Mon, 30 Sep 2024 10:28:17 -0400 Subject: [PATCH 7/7] Add template overload to match from_bid --- include/boost/decimal/bid_conversion.hpp | 6 ++++++ test/test_bid_conversions.cpp | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/include/boost/decimal/bid_conversion.hpp b/include/boost/decimal/bid_conversion.hpp index 7659f2fc5..cdb05cc4b 100644 --- a/include/boost/decimal/bid_conversion.hpp +++ b/include/boost/decimal/bid_conversion.hpp @@ -135,6 +135,12 @@ constexpr auto to_bid(decimal128_fast val) noexcept -> detail::uint128 return to_bid_d128f(val); } +template +constexpr auto to_bid(T val) noexcept +{ + return to_bid(val); +} + template constexpr auto from_bid(std::uint32_t bits) noexcept BOOST_DECIMAL_REQUIRES(detail::is_decimal_floating_point_v, T) diff --git a/test/test_bid_conversions.cpp b/test/test_bid_conversions.cpp index 712366047..bf20e095b 100644 --- a/test/test_bid_conversions.cpp +++ b/test/test_bid_conversions.cpp @@ -18,7 +18,7 @@ void test() for (std::size_t i {}; i < 1024; ++i) { const T val {dist(rng)}; - const auto bits {to_bid(val)}; + const auto bits {to_bid(val)}; const T return_val {from_bid(bits)}; BOOST_TEST_EQ(val, return_val); }