Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
157 changes: 4 additions & 153 deletions include/boost/decimal/decimal128_t.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,10 @@ BOOST_DECIMAL_EXPORT class decimal128_t final
friend constexpr auto read_payload(T value) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_ieee_type_v, T, typename T::significand_type);

template <typename TargetDecimalType, bool is_snan>
friend constexpr auto detail::write_payload(typename TargetDecimalType::significand_type payload_value)
BOOST_DECIMAL_REQUIRES(detail::is_ieee_type_v, TargetDecimalType);

friend constexpr auto nan_conversion(const decimal128_t value) noexcept -> decimal128_t
{
constexpr auto convert_nan_mask {detail::d128_snan_mask ^ detail::d128_nan_mask};
Expand Down Expand Up @@ -555,59 +559,6 @@ BOOST_DECIMAL_EXPORT class decimal128_t final
// 3.6.6 Quantize
friend constexpr auto quantized128(const decimal128_t& lhs, const decimal128_t& rhs) noexcept -> decimal128_t;

// Bit-wise operators
friend constexpr auto operator&(const decimal128_t& lhs, const decimal128_t& rhs) noexcept -> decimal128_t;

template <typename Integer>
friend constexpr auto operator&(decimal128_t lhs, Integer rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t);

template <typename Integer>
friend constexpr auto operator&(Integer lhs, decimal128_t rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t);

friend constexpr auto operator|(const decimal128_t& lhs, const decimal128_t& rhs) noexcept -> decimal128_t;

template <typename Integer>
friend constexpr auto operator|(decimal128_t lhs, Integer rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t);

template <typename Integer>
friend constexpr auto operator|(Integer lhs, decimal128_t rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t);

friend constexpr auto operator^(const decimal128_t& lhs, const decimal128_t& rhs) noexcept -> decimal128_t;

template <typename Integer>
friend constexpr auto operator^(decimal128_t lhs, Integer rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t);

template <typename Integer>
friend constexpr auto operator^(Integer lhs, decimal128_t rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t);

friend constexpr auto operator<<(const decimal128_t& lhs, const decimal128_t& rhs) noexcept -> decimal128_t;

template <typename Integer>
friend constexpr auto operator<<(decimal128_t lhs, Integer rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t);

template <typename Integer>
friend constexpr auto operator<<(Integer lhs, decimal128_t rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t);

friend constexpr auto operator>>(const decimal128_t& lhs, const decimal128_t& rhs) noexcept -> decimal128_t;

template <typename Integer>
friend constexpr auto operator>>(decimal128_t lhs, Integer rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t);

template <typename Integer>
friend constexpr auto operator>>(Integer lhs, decimal128_t rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t);

friend constexpr auto operator~(decimal128_t rhs) noexcept -> decimal128_t;

// <cmath> functions that need to be friends
template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE T>
friend constexpr auto frexp10(T num, int* expptr) noexcept -> typename T::significand_type;
Expand Down Expand Up @@ -2171,106 +2122,6 @@ constexpr auto quantized128(const decimal128_t& lhs, const decimal128_t& rhs) no
return {lhs.full_significand(), rhs.biased_exponent(), lhs.isneg()};
}

constexpr auto operator&(const decimal128_t& lhs, const decimal128_t& rhs) noexcept -> decimal128_t
{
return from_bits(lhs.bits_ & rhs.bits_);
}

template <typename Integer>
constexpr auto operator&(const decimal128_t lhs, const Integer rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t)
{
return from_bits(lhs.bits_ & static_cast<int128::uint128_t>(rhs));
}

template <typename Integer>
constexpr auto operator&(const Integer lhs, const decimal128_t rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t)
{
return from_bits(static_cast<int128::uint128_t>(lhs) & rhs.bits_);
}

constexpr auto operator|(const decimal128_t& lhs, const decimal128_t& rhs) noexcept -> decimal128_t
{
return from_bits(lhs.bits_ | rhs.bits_);
}

template <typename Integer>
constexpr auto operator|(const decimal128_t lhs, const Integer rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t)
{
return from_bits(lhs.bits_ | static_cast<int128::uint128_t>(rhs));
}

template <typename Integer>
constexpr auto operator|(const Integer lhs, const decimal128_t rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t)
{
return from_bits(static_cast<int128::uint128_t>(lhs) | rhs.bits_);
}

constexpr auto operator^(const decimal128_t& lhs, const decimal128_t& rhs) noexcept -> decimal128_t
{
return from_bits(lhs.bits_ ^ rhs.bits_);
}

template <typename Integer>
constexpr auto operator^(const decimal128_t lhs, const Integer rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t)
{
return from_bits(lhs.bits_ ^ static_cast<int128::uint128_t>(rhs));
}

template <typename Integer>
constexpr auto operator^(const Integer lhs, const decimal128_t rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t)
{
return from_bits(static_cast<int128::uint128_t>(lhs) ^ rhs.bits_);
}

constexpr auto operator<<(const decimal128_t& lhs, const decimal128_t& rhs) noexcept -> decimal128_t
{
return from_bits(lhs.bits_ << static_cast<std::uint64_t>(rhs.bits_));
}

template <typename Integer>
constexpr auto operator<<(const decimal128_t lhs, const Integer rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t)
{
return from_bits(lhs.bits_ << static_cast<std::uint64_t>(rhs));
}

template <typename Integer>
constexpr auto operator<<(const Integer lhs, const decimal128_t rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t)
{
return from_bits(static_cast<int128::uint128_t>(lhs) << static_cast<std::uint64_t>(rhs.bits_));
}

constexpr auto operator>>(const decimal128_t& lhs, const decimal128_t& rhs) noexcept -> decimal128_t
{
return from_bits(lhs.bits_ >> static_cast<std::uint64_t>(rhs.bits_));
}

template <typename Integer>
constexpr auto operator>>(const decimal128_t lhs, const Integer rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t)
{
return from_bits(lhs.bits_ >> static_cast<std::uint64_t>(rhs));
}

template <typename Integer>
constexpr auto operator>>(const Integer lhs, const decimal128_t rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t)
{
return from_bits(static_cast<int128::uint128_t>(lhs) >> static_cast<std::uint64_t>(rhs.bits_));
}

constexpr auto operator~(const decimal128_t lhs) noexcept -> decimal128_t
{
return from_bits(~lhs.bits_);
}

constexpr auto copysignd128(decimal128_t mag, const decimal128_t sgn) noexcept -> decimal128_t
{
mag.edit_sign(sgn.isneg());
Expand Down
157 changes: 4 additions & 153 deletions include/boost/decimal/decimal32_t.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,10 @@ BOOST_DECIMAL_EXPORT class decimal32_t final // NOLINT(cppcoreguidelines-special
friend constexpr auto read_payload(T value) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_ieee_type_v, T, typename T::significand_type);

template <typename TargetDecimalType, bool is_snan>
friend constexpr auto detail::write_payload(typename TargetDecimalType::significand_type payload_value)
BOOST_DECIMAL_REQUIRES(detail::is_ieee_type_v, TargetDecimalType);

friend constexpr auto nan_conversion(const decimal32_t value) noexcept -> decimal32_t
{
constexpr auto convert_nan_mask {detail::d32_snan_mask ^ detail::d32_nan_mask};
Expand Down Expand Up @@ -552,59 +556,6 @@ BOOST_DECIMAL_EXPORT class decimal32_t final // NOLINT(cppcoreguidelines-special
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, std::partial_ordering);
#endif

// Bitwise operators
friend constexpr auto operator&(decimal32_t lhs, decimal32_t rhs) noexcept -> decimal32_t;

template <typename Integer>
friend constexpr auto operator&(decimal32_t lhs, Integer rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t);

template <typename Integer>
friend constexpr auto operator&(Integer lhs, decimal32_t rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t);

friend constexpr auto operator|(decimal32_t lhs, decimal32_t rhs) noexcept -> decimal32_t;

template <typename Integer>
friend constexpr auto operator|(decimal32_t lhs, Integer rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t);

template <typename Integer>
friend constexpr auto operator|(Integer lhs, decimal32_t rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t);

friend constexpr auto operator^(decimal32_t lhs, decimal32_t rhs) noexcept -> decimal32_t;

template <typename Integer>
friend constexpr auto operator^(decimal32_t lhs, Integer rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t);

template <typename Integer>
friend constexpr auto operator^(Integer lhs, decimal32_t rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t);

friend constexpr auto operator<<(decimal32_t lhs, decimal32_t rhs) noexcept -> decimal32_t;

template <typename Integer>
friend constexpr auto operator<<(decimal32_t lhs, Integer rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t);

template <typename Integer>
friend constexpr auto operator<<(Integer lhs, decimal32_t rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t);

friend constexpr auto operator>>(decimal32_t lhs, decimal32_t rhs) noexcept -> decimal32_t;

template <typename Integer>
friend constexpr auto operator>>(decimal32_t lhs, Integer rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t);

template <typename Integer>
friend constexpr auto operator>>(Integer lhs, decimal32_t rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t);

friend constexpr auto operator~(decimal32_t lhs) noexcept -> decimal32_t;

// <cmath> extensions
// 3.6.4 Same Quantum
friend constexpr auto samequantumd32(decimal32_t lhs, decimal32_t rhs) noexcept -> bool;
Expand Down Expand Up @@ -2195,106 +2146,6 @@ constexpr decimal32_t::operator std::bfloat16_t() const noexcept
}
#endif

constexpr auto operator&(const decimal32_t lhs, const decimal32_t rhs) noexcept -> decimal32_t
{
return from_bits(lhs.bits_ & rhs.bits_);
}

template <typename Integer>
constexpr auto operator&(const decimal32_t lhs, const Integer rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t)
{
return from_bits(lhs.bits_ & static_cast<std::uint32_t>(rhs));
}

template <typename Integer>
constexpr auto operator&(const Integer lhs, const decimal32_t rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t)
{
return from_bits(static_cast<std::uint32_t>(lhs) & rhs.bits_);
}

constexpr auto operator|(const decimal32_t lhs, const decimal32_t rhs) noexcept -> decimal32_t
{
return from_bits(lhs.bits_ | rhs.bits_);
}

template <typename Integer>
constexpr auto operator|(const decimal32_t lhs, const Integer rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t)
{
return from_bits(lhs.bits_ | static_cast<std::uint32_t>(rhs));
}

template <typename Integer>
constexpr auto operator|(const Integer lhs, const decimal32_t rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t)
{
return from_bits(static_cast<std::uint32_t>(lhs) | rhs.bits_);
}

constexpr auto operator^(const decimal32_t lhs, const decimal32_t rhs) noexcept -> decimal32_t
{
return from_bits(lhs.bits_ ^ rhs.bits_);
}

template <typename Integer>
constexpr auto operator^(const decimal32_t lhs, const Integer rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t)
{
return from_bits(lhs.bits_ ^ static_cast<std::uint32_t>(rhs));
}

template <typename Integer>
constexpr auto operator^(const Integer lhs, const decimal32_t rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t)
{
return from_bits(static_cast<std::uint32_t>(lhs) ^ rhs.bits_);
}

constexpr auto operator<<(const decimal32_t lhs, const decimal32_t rhs) noexcept -> decimal32_t
{
return from_bits(lhs.bits_ << rhs.bits_);
}

template <typename Integer>
constexpr auto operator<<(const decimal32_t lhs, const Integer rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t)
{
return from_bits(lhs.bits_ << static_cast<std::uint32_t>(rhs));
}

template <typename Integer>
constexpr auto operator<<(const Integer lhs, const decimal32_t rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t)
{
return from_bits(static_cast<std::uint32_t>(lhs) << rhs.bits_);
}

constexpr auto operator>>(const decimal32_t lhs, const decimal32_t rhs) noexcept -> decimal32_t
{
return from_bits(lhs.bits_ >> rhs.bits_);
}

template <typename Integer>
constexpr auto operator>>(const decimal32_t lhs, const Integer rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t)
{
return from_bits(lhs.bits_ >> static_cast<std::uint32_t>(rhs));
}

template <typename Integer>
constexpr auto operator>>(const Integer lhs, const decimal32_t rhs) noexcept
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t)
{
return from_bits(static_cast<std::uint32_t>(lhs) >> rhs.bits_);
}

constexpr auto operator~(const decimal32_t lhs) noexcept -> decimal32_t
{
return from_bits(~lhs.bits_);
}

// 3.6.4
// Effects: determines if the quantum exponents of x and y are the same.
// If both x and y are NaN, or infinity, they have the same quantum exponents;
Expand Down
Loading