Skip to content

Commit

Permalink
Merge pull request #754 from cppalliance/fix_module
Browse files Browse the repository at this point in the history
Add module support to the fast types
  • Loading branch information
mborland authored Oct 7, 2024
2 parents 8274270 + 62b5d3a commit f6675a9
Show file tree
Hide file tree
Showing 10 changed files with 97 additions and 54 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ test/metal/bin/

# Modules
*.gcm
gcm.cache/

# Mac option
*.DS_Store
54 changes: 27 additions & 27 deletions include/boost/decimal/bid_conversion.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,161 +20,161 @@ namespace decimal {
# pragma GCC diagnostic ignored "-Wconversion"
#endif

constexpr auto to_bid_d32(decimal32 val) noexcept -> std::uint32_t
BOOST_DECIMAL_EXPORT constexpr auto to_bid_d32(decimal32 val) noexcept -> std::uint32_t
{
return val.bits_;
}

constexpr auto from_bid_d32(std::uint32_t bits) noexcept -> decimal32
BOOST_DECIMAL_EXPORT constexpr auto from_bid_d32(std::uint32_t bits) noexcept -> decimal32
{
return from_bits(bits);
}

constexpr auto to_bid_d32f(decimal32_fast val) noexcept -> std::uint32_t
BOOST_DECIMAL_EXPORT constexpr auto to_bid_d32f(decimal32_fast val) noexcept -> std::uint32_t
{
const decimal32 compliant_val {val};
return to_bid_d32(compliant_val);
}

constexpr auto from_bid_d32f(std::uint32_t bits) noexcept -> decimal32_fast
BOOST_DECIMAL_EXPORT constexpr auto from_bid_d32f(std::uint32_t bits) noexcept -> decimal32_fast
{
const auto compliant_val {from_bid_d32(bits)};
const decimal32_fast val {compliant_val};
return val;
}

constexpr auto to_bid_d64(decimal64 val) noexcept -> std::uint64_t
BOOST_DECIMAL_EXPORT constexpr auto to_bid_d64(decimal64 val) noexcept -> std::uint64_t
{
return val.bits_;
}

constexpr auto from_bid_d64(std::uint64_t bits) noexcept -> decimal64
BOOST_DECIMAL_EXPORT constexpr auto from_bid_d64(std::uint64_t bits) noexcept -> decimal64
{
return from_bits(bits);
}

constexpr auto to_bid_d64f(decimal64_fast val) noexcept -> std::uint64_t
BOOST_DECIMAL_EXPORT constexpr auto to_bid_d64f(decimal64_fast val) noexcept -> std::uint64_t
{
const decimal64 compliant_val {val};
return to_bid_d64(compliant_val);
}

constexpr auto from_bid_d64f(std::uint64_t bits) noexcept -> decimal64_fast
BOOST_DECIMAL_EXPORT constexpr auto from_bid_d64f(std::uint64_t bits) noexcept -> decimal64_fast
{
const auto compliant_val {from_bid_d64(bits)};
const decimal64_fast val {compliant_val};
return val;
}

constexpr auto to_bid_d128(decimal128 val) noexcept -> detail::uint128
BOOST_DECIMAL_EXPORT constexpr auto to_bid_d128(decimal128 val) noexcept -> detail::uint128
{
return val.bits_;
}

constexpr auto from_bid_d128(detail::uint128 bits) noexcept -> decimal128
BOOST_DECIMAL_EXPORT constexpr auto from_bid_d128(detail::uint128 bits) noexcept -> decimal128
{
return from_bits(bits);
}

#ifdef BOOST_DECIMAL_HAS_INT128
constexpr auto from_bid_d128(detail::uint128_t bits) noexcept -> decimal128
BOOST_DECIMAL_EXPORT constexpr auto from_bid_d128(detail::uint128_t bits) noexcept -> decimal128
{
return from_bits(bits);
}
#endif

constexpr auto to_bid_d128f(decimal128_fast val) noexcept -> detail::uint128
BOOST_DECIMAL_EXPORT constexpr auto to_bid_d128f(decimal128_fast val) noexcept -> detail::uint128
{
const decimal128 compliant_val {val};
return to_bid_d128(compliant_val);
}

constexpr auto from_bid_d128f(detail::uint128 bits) noexcept -> decimal128_fast
BOOST_DECIMAL_EXPORT constexpr auto from_bid_d128f(detail::uint128 bits) noexcept -> decimal128_fast
{
const auto compliant_val {from_bid_d128(bits)};
const decimal128_fast val {compliant_val};
return val;
}

#ifdef BOOST_DECIMAL_HAS_INT128
constexpr auto from_bid_d128f(detail::uint128_t bits) noexcept -> decimal128_fast
BOOST_DECIMAL_EXPORT 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
BOOST_DECIMAL_EXPORT constexpr auto to_bid(decimal32 val) noexcept -> std::uint32_t
{
return to_bid_d32(val);
}

constexpr auto to_bid(decimal32_fast val) noexcept -> std::uint32_t
BOOST_DECIMAL_EXPORT constexpr auto to_bid(decimal32_fast val) noexcept -> std::uint32_t
{
return to_bid_d32f(val);
}

constexpr auto to_bid(decimal64 val) noexcept -> std::uint64_t
BOOST_DECIMAL_EXPORT constexpr auto to_bid(decimal64 val) noexcept -> std::uint64_t
{
return to_bid_d64(val);
}

constexpr auto to_bid(decimal64_fast val) noexcept -> std::uint64_t
BOOST_DECIMAL_EXPORT constexpr auto to_bid(decimal64_fast val) noexcept -> std::uint64_t
{
return to_bid_d64f(val);
}

constexpr auto to_bid(decimal128 val) noexcept -> detail::uint128
BOOST_DECIMAL_EXPORT constexpr auto to_bid(decimal128 val) noexcept -> detail::uint128
{
return to_bid_d128(val);
}

constexpr auto to_bid(decimal128_fast val) noexcept -> detail::uint128
BOOST_DECIMAL_EXPORT constexpr auto to_bid(decimal128_fast val) noexcept -> detail::uint128
{
return to_bid_d128f(val);
}

template <typename T>
BOOST_DECIMAL_EXPORT template <typename T>
constexpr auto to_bid(T val) noexcept
{
return to_bid(val);
}

template <typename T = decimal32_fast>
BOOST_DECIMAL_EXPORT template <typename T = decimal32_fast>
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_EXPORT template <>
constexpr auto from_bid<decimal32>(std::uint32_t bits) noexcept -> decimal32
{
return from_bid_d32(bits);
}

template <typename T = decimal64_fast>
BOOST_DECIMAL_EXPORT template <typename T = decimal64_fast>
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_EXPORT template <>
constexpr auto from_bid<decimal64>(std::uint64_t bits) noexcept -> decimal64
{
return from_bid_d64(bits);
}

template <typename T = decimal128_fast>
BOOST_DECIMAL_EXPORT template <typename T = decimal128_fast>
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_EXPORT template <>
constexpr auto from_bid<decimal128>(detail::uint128 bits) noexcept -> decimal128
{
return from_bid_d128(bits);
Expand Down
7 changes: 6 additions & 1 deletion include/boost/decimal/decimal128_fast.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,14 @@
#include <boost/decimal/detail/div_impl.hpp>
#include <boost/decimal/detail/emulated128.hpp>
#include <boost/decimal/detail/ryu/ryu_generic_128.hpp>

#ifndef BOOST_DECIMAL_BUILD_MODULE

#include <limits>
#include <cstdint>

#endif

#ifndef BOOST_DECIMAL_DECIMAL128_FAST_HPP
#define BOOST_DECIMAL_DECIMAL128_FAST_HPP

Expand Down Expand Up @@ -45,7 +50,7 @@ struct decimal128_fast_components

} // namespace detail

class decimal128_fast final
BOOST_DECIMAL_EXPORT class decimal128_fast final
{
public:
using significand_type = detail::uint128;
Expand Down
5 changes: 4 additions & 1 deletion include/boost/decimal/decimal32_fast.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,11 @@
#include <boost/decimal/detail/div_impl.hpp>
#include <boost/decimal/detail/promote_significand.hpp>
#include <boost/decimal/detail/ryu/ryu_generic_128.hpp>

#ifndef BOOST_DECIMAL_BUILD_MODULE
#include <limits>
#include <cstdint>
#endif

namespace boost {
namespace decimal {
Expand All @@ -40,7 +43,7 @@ struct decimal32_fast_components

}

class decimal32_fast final
BOOST_DECIMAL_EXPORT class decimal32_fast final
{
public:
using significand_type = std::uint_fast32_t;
Expand Down
9 changes: 7 additions & 2 deletions include/boost/decimal/decimal64_fast.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,14 @@
#include <boost/decimal/detail/div_impl.hpp>
#include <boost/decimal/detail/promote_significand.hpp>
#include <boost/decimal/detail/ryu/ryu_generic_128.hpp>

#ifndef BOOST_DECIMAL_BUILD_MODULE

#include <limits>
#include <cstdint>

#endif

namespace boost {
namespace decimal {

Expand All @@ -41,7 +46,7 @@ struct decimal64_fast_components

} // namespace detail

class decimal64_fast final
BOOST_DECIMAL_EXPORT class decimal64_fast final
{
public:
using significand_type = std::uint_fast64_t;
Expand Down Expand Up @@ -1390,7 +1395,7 @@ constexpr auto copysignd64f(decimal64_fast mag, decimal64_fast sgn) noexcept ->

namespace std {

template <>
BOOST_DECIMAL_EXPORT template <>
#ifdef _MSC_VER
class numeric_limits<boost::decimal::decimal64_fast>
#else
Expand Down
4 changes: 2 additions & 2 deletions include/boost/decimal/detail/power_tables.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ static_assert(sizeof(emulated_128_pow10) == sizeof(uint128) * 40, "Should have 1

#ifdef BOOST_DECIMAL_HAS_INT128

static constexpr uint128_t builtin_128_pow10[] = {
BOOST_DECIMAL_CONSTEXPR_VARIABLE uint128_t builtin_128_pow10[] = {
uint128_t(1),
uint128_t(10),
uint128_t(100),
Expand Down Expand Up @@ -124,7 +124,7 @@ static_assert(sizeof(builtin_128_pow10) == sizeof(boost::decimal::detail::uint12

#endif

static constexpr uint256_t emulated_256_pow10[] = {
BOOST_DECIMAL_CONSTEXPR_VARIABLE uint256_t emulated_256_pow10[] = {
uint256_t{uint128{UINT64_C(0), UINT64_C(0)}, uint128{UINT64_C(0), UINT64_C(1)}},
uint256_t{uint128{UINT64_C(0), UINT64_C(0)}, uint128{UINT64_C(0), UINT64_C(10)}},
uint256_t{uint128{UINT64_C(0), UINT64_C(0)}, uint128{UINT64_C(0), UINT64_C(100)}},
Expand Down
Loading

0 comments on commit f6675a9

Please sign in to comment.