Skip to content

Commit 7fab6c1

Browse files
authored
Merge pull request #1296 from cppalliance/remove_bin_ops
Remove bitwise operations and testing
2 parents 1def358 + 40e0570 commit 7fab6c1

File tree

9 files changed

+33
-1832
lines changed

9 files changed

+33
-1832
lines changed

include/boost/decimal/decimal128_t.hpp

Lines changed: 4 additions & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,10 @@ BOOST_DECIMAL_EXPORT class decimal128_t final
220220
friend constexpr auto read_payload(T value) noexcept
221221
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_ieee_type_v, T, typename T::significand_type);
222222

223+
template <typename TargetDecimalType, bool is_snan>
224+
friend constexpr auto detail::write_payload(typename TargetDecimalType::significand_type payload_value)
225+
BOOST_DECIMAL_REQUIRES(detail::is_ieee_type_v, TargetDecimalType);
226+
223227
friend constexpr auto nan_conversion(const decimal128_t value) noexcept -> decimal128_t
224228
{
225229
constexpr auto convert_nan_mask {detail::d128_snan_mask ^ detail::d128_nan_mask};
@@ -555,59 +559,6 @@ BOOST_DECIMAL_EXPORT class decimal128_t final
555559
// 3.6.6 Quantize
556560
friend constexpr auto quantized128(const decimal128_t& lhs, const decimal128_t& rhs) noexcept -> decimal128_t;
557561

558-
// Bit-wise operators
559-
friend constexpr auto operator&(const decimal128_t& lhs, const decimal128_t& rhs) noexcept -> decimal128_t;
560-
561-
template <typename Integer>
562-
friend constexpr auto operator&(decimal128_t lhs, Integer rhs) noexcept
563-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t);
564-
565-
template <typename Integer>
566-
friend constexpr auto operator&(Integer lhs, decimal128_t rhs) noexcept
567-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t);
568-
569-
friend constexpr auto operator|(const decimal128_t& lhs, const decimal128_t& rhs) noexcept -> decimal128_t;
570-
571-
template <typename Integer>
572-
friend constexpr auto operator|(decimal128_t lhs, Integer rhs) noexcept
573-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t);
574-
575-
template <typename Integer>
576-
friend constexpr auto operator|(Integer lhs, decimal128_t rhs) noexcept
577-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t);
578-
579-
friend constexpr auto operator^(const decimal128_t& lhs, const decimal128_t& rhs) noexcept -> decimal128_t;
580-
581-
template <typename Integer>
582-
friend constexpr auto operator^(decimal128_t lhs, Integer rhs) noexcept
583-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t);
584-
585-
template <typename Integer>
586-
friend constexpr auto operator^(Integer lhs, decimal128_t rhs) noexcept
587-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t);
588-
589-
friend constexpr auto operator<<(const decimal128_t& lhs, const decimal128_t& rhs) noexcept -> decimal128_t;
590-
591-
template <typename Integer>
592-
friend constexpr auto operator<<(decimal128_t lhs, Integer rhs) noexcept
593-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t);
594-
595-
template <typename Integer>
596-
friend constexpr auto operator<<(Integer lhs, decimal128_t rhs) noexcept
597-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t);
598-
599-
friend constexpr auto operator>>(const decimal128_t& lhs, const decimal128_t& rhs) noexcept -> decimal128_t;
600-
601-
template <typename Integer>
602-
friend constexpr auto operator>>(decimal128_t lhs, Integer rhs) noexcept
603-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t);
604-
605-
template <typename Integer>
606-
friend constexpr auto operator>>(Integer lhs, decimal128_t rhs) noexcept
607-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t);
608-
609-
friend constexpr auto operator~(decimal128_t rhs) noexcept -> decimal128_t;
610-
611562
// <cmath> functions that need to be friends
612563
template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE T>
613564
friend constexpr auto frexp10(T num, int* expptr) noexcept -> typename T::significand_type;
@@ -2171,106 +2122,6 @@ constexpr auto quantized128(const decimal128_t& lhs, const decimal128_t& rhs) no
21712122
return {lhs.full_significand(), rhs.biased_exponent(), lhs.isneg()};
21722123
}
21732124

2174-
constexpr auto operator&(const decimal128_t& lhs, const decimal128_t& rhs) noexcept -> decimal128_t
2175-
{
2176-
return from_bits(lhs.bits_ & rhs.bits_);
2177-
}
2178-
2179-
template <typename Integer>
2180-
constexpr auto operator&(const decimal128_t lhs, const Integer rhs) noexcept
2181-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t)
2182-
{
2183-
return from_bits(lhs.bits_ & static_cast<int128::uint128_t>(rhs));
2184-
}
2185-
2186-
template <typename Integer>
2187-
constexpr auto operator&(const Integer lhs, const decimal128_t rhs) noexcept
2188-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t)
2189-
{
2190-
return from_bits(static_cast<int128::uint128_t>(lhs) & rhs.bits_);
2191-
}
2192-
2193-
constexpr auto operator|(const decimal128_t& lhs, const decimal128_t& rhs) noexcept -> decimal128_t
2194-
{
2195-
return from_bits(lhs.bits_ | rhs.bits_);
2196-
}
2197-
2198-
template <typename Integer>
2199-
constexpr auto operator|(const decimal128_t lhs, const Integer rhs) noexcept
2200-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t)
2201-
{
2202-
return from_bits(lhs.bits_ | static_cast<int128::uint128_t>(rhs));
2203-
}
2204-
2205-
template <typename Integer>
2206-
constexpr auto operator|(const Integer lhs, const decimal128_t rhs) noexcept
2207-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t)
2208-
{
2209-
return from_bits(static_cast<int128::uint128_t>(lhs) | rhs.bits_);
2210-
}
2211-
2212-
constexpr auto operator^(const decimal128_t& lhs, const decimal128_t& rhs) noexcept -> decimal128_t
2213-
{
2214-
return from_bits(lhs.bits_ ^ rhs.bits_);
2215-
}
2216-
2217-
template <typename Integer>
2218-
constexpr auto operator^(const decimal128_t lhs, const Integer rhs) noexcept
2219-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t)
2220-
{
2221-
return from_bits(lhs.bits_ ^ static_cast<int128::uint128_t>(rhs));
2222-
}
2223-
2224-
template <typename Integer>
2225-
constexpr auto operator^(const Integer lhs, const decimal128_t rhs) noexcept
2226-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t)
2227-
{
2228-
return from_bits(static_cast<int128::uint128_t>(lhs) ^ rhs.bits_);
2229-
}
2230-
2231-
constexpr auto operator<<(const decimal128_t& lhs, const decimal128_t& rhs) noexcept -> decimal128_t
2232-
{
2233-
return from_bits(lhs.bits_ << static_cast<std::uint64_t>(rhs.bits_));
2234-
}
2235-
2236-
template <typename Integer>
2237-
constexpr auto operator<<(const decimal128_t lhs, const Integer rhs) noexcept
2238-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t)
2239-
{
2240-
return from_bits(lhs.bits_ << static_cast<std::uint64_t>(rhs));
2241-
}
2242-
2243-
template <typename Integer>
2244-
constexpr auto operator<<(const Integer lhs, const decimal128_t rhs) noexcept
2245-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t)
2246-
{
2247-
return from_bits(static_cast<int128::uint128_t>(lhs) << static_cast<std::uint64_t>(rhs.bits_));
2248-
}
2249-
2250-
constexpr auto operator>>(const decimal128_t& lhs, const decimal128_t& rhs) noexcept -> decimal128_t
2251-
{
2252-
return from_bits(lhs.bits_ >> static_cast<std::uint64_t>(rhs.bits_));
2253-
}
2254-
2255-
template <typename Integer>
2256-
constexpr auto operator>>(const decimal128_t lhs, const Integer rhs) noexcept
2257-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t)
2258-
{
2259-
return from_bits(lhs.bits_ >> static_cast<std::uint64_t>(rhs));
2260-
}
2261-
2262-
template <typename Integer>
2263-
constexpr auto operator>>(const Integer lhs, const decimal128_t rhs) noexcept
2264-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal128_t)
2265-
{
2266-
return from_bits(static_cast<int128::uint128_t>(lhs) >> static_cast<std::uint64_t>(rhs.bits_));
2267-
}
2268-
2269-
constexpr auto operator~(const decimal128_t lhs) noexcept -> decimal128_t
2270-
{
2271-
return from_bits(~lhs.bits_);
2272-
}
2273-
22742125
constexpr auto copysignd128(decimal128_t mag, const decimal128_t sgn) noexcept -> decimal128_t
22752126
{
22762127
mag.edit_sign(sgn.isneg());

include/boost/decimal/decimal32_t.hpp

Lines changed: 4 additions & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,10 @@ BOOST_DECIMAL_EXPORT class decimal32_t final // NOLINT(cppcoreguidelines-special
229229
friend constexpr auto read_payload(T value) noexcept
230230
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_ieee_type_v, T, typename T::significand_type);
231231

232+
template <typename TargetDecimalType, bool is_snan>
233+
friend constexpr auto detail::write_payload(typename TargetDecimalType::significand_type payload_value)
234+
BOOST_DECIMAL_REQUIRES(detail::is_ieee_type_v, TargetDecimalType);
235+
232236
friend constexpr auto nan_conversion(const decimal32_t value) noexcept -> decimal32_t
233237
{
234238
constexpr auto convert_nan_mask {detail::d32_snan_mask ^ detail::d32_nan_mask};
@@ -552,59 +556,6 @@ BOOST_DECIMAL_EXPORT class decimal32_t final // NOLINT(cppcoreguidelines-special
552556
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, std::partial_ordering);
553557
#endif
554558

555-
// Bitwise operators
556-
friend constexpr auto operator&(decimal32_t lhs, decimal32_t rhs) noexcept -> decimal32_t;
557-
558-
template <typename Integer>
559-
friend constexpr auto operator&(decimal32_t lhs, Integer rhs) noexcept
560-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t);
561-
562-
template <typename Integer>
563-
friend constexpr auto operator&(Integer lhs, decimal32_t rhs) noexcept
564-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t);
565-
566-
friend constexpr auto operator|(decimal32_t lhs, decimal32_t rhs) noexcept -> decimal32_t;
567-
568-
template <typename Integer>
569-
friend constexpr auto operator|(decimal32_t lhs, Integer rhs) noexcept
570-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t);
571-
572-
template <typename Integer>
573-
friend constexpr auto operator|(Integer lhs, decimal32_t rhs) noexcept
574-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t);
575-
576-
friend constexpr auto operator^(decimal32_t lhs, decimal32_t rhs) noexcept -> decimal32_t;
577-
578-
template <typename Integer>
579-
friend constexpr auto operator^(decimal32_t lhs, Integer rhs) noexcept
580-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t);
581-
582-
template <typename Integer>
583-
friend constexpr auto operator^(Integer lhs, decimal32_t rhs) noexcept
584-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t);
585-
586-
friend constexpr auto operator<<(decimal32_t lhs, decimal32_t rhs) noexcept -> decimal32_t;
587-
588-
template <typename Integer>
589-
friend constexpr auto operator<<(decimal32_t lhs, Integer rhs) noexcept
590-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t);
591-
592-
template <typename Integer>
593-
friend constexpr auto operator<<(Integer lhs, decimal32_t rhs) noexcept
594-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t);
595-
596-
friend constexpr auto operator>>(decimal32_t lhs, decimal32_t rhs) noexcept -> decimal32_t;
597-
598-
template <typename Integer>
599-
friend constexpr auto operator>>(decimal32_t lhs, Integer rhs) noexcept
600-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t);
601-
602-
template <typename Integer>
603-
friend constexpr auto operator>>(Integer lhs, decimal32_t rhs) noexcept
604-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t);
605-
606-
friend constexpr auto operator~(decimal32_t lhs) noexcept -> decimal32_t;
607-
608559
// <cmath> extensions
609560
// 3.6.4 Same Quantum
610561
friend constexpr auto samequantumd32(decimal32_t lhs, decimal32_t rhs) noexcept -> bool;
@@ -2195,106 +2146,6 @@ constexpr decimal32_t::operator std::bfloat16_t() const noexcept
21952146
}
21962147
#endif
21972148

2198-
constexpr auto operator&(const decimal32_t lhs, const decimal32_t rhs) noexcept -> decimal32_t
2199-
{
2200-
return from_bits(lhs.bits_ & rhs.bits_);
2201-
}
2202-
2203-
template <typename Integer>
2204-
constexpr auto operator&(const decimal32_t lhs, const Integer rhs) noexcept
2205-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t)
2206-
{
2207-
return from_bits(lhs.bits_ & static_cast<std::uint32_t>(rhs));
2208-
}
2209-
2210-
template <typename Integer>
2211-
constexpr auto operator&(const Integer lhs, const decimal32_t rhs) noexcept
2212-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t)
2213-
{
2214-
return from_bits(static_cast<std::uint32_t>(lhs) & rhs.bits_);
2215-
}
2216-
2217-
constexpr auto operator|(const decimal32_t lhs, const decimal32_t rhs) noexcept -> decimal32_t
2218-
{
2219-
return from_bits(lhs.bits_ | rhs.bits_);
2220-
}
2221-
2222-
template <typename Integer>
2223-
constexpr auto operator|(const decimal32_t lhs, const Integer rhs) noexcept
2224-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t)
2225-
{
2226-
return from_bits(lhs.bits_ | static_cast<std::uint32_t>(rhs));
2227-
}
2228-
2229-
template <typename Integer>
2230-
constexpr auto operator|(const Integer lhs, const decimal32_t rhs) noexcept
2231-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t)
2232-
{
2233-
return from_bits(static_cast<std::uint32_t>(lhs) | rhs.bits_);
2234-
}
2235-
2236-
constexpr auto operator^(const decimal32_t lhs, const decimal32_t rhs) noexcept -> decimal32_t
2237-
{
2238-
return from_bits(lhs.bits_ ^ rhs.bits_);
2239-
}
2240-
2241-
template <typename Integer>
2242-
constexpr auto operator^(const decimal32_t lhs, const Integer rhs) noexcept
2243-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t)
2244-
{
2245-
return from_bits(lhs.bits_ ^ static_cast<std::uint32_t>(rhs));
2246-
}
2247-
2248-
template <typename Integer>
2249-
constexpr auto operator^(const Integer lhs, const decimal32_t rhs) noexcept
2250-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t)
2251-
{
2252-
return from_bits(static_cast<std::uint32_t>(lhs) ^ rhs.bits_);
2253-
}
2254-
2255-
constexpr auto operator<<(const decimal32_t lhs, const decimal32_t rhs) noexcept -> decimal32_t
2256-
{
2257-
return from_bits(lhs.bits_ << rhs.bits_);
2258-
}
2259-
2260-
template <typename Integer>
2261-
constexpr auto operator<<(const decimal32_t lhs, const Integer rhs) noexcept
2262-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t)
2263-
{
2264-
return from_bits(lhs.bits_ << static_cast<std::uint32_t>(rhs));
2265-
}
2266-
2267-
template <typename Integer>
2268-
constexpr auto operator<<(const Integer lhs, const decimal32_t rhs) noexcept
2269-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t)
2270-
{
2271-
return from_bits(static_cast<std::uint32_t>(lhs) << rhs.bits_);
2272-
}
2273-
2274-
constexpr auto operator>>(const decimal32_t lhs, const decimal32_t rhs) noexcept -> decimal32_t
2275-
{
2276-
return from_bits(lhs.bits_ >> rhs.bits_);
2277-
}
2278-
2279-
template <typename Integer>
2280-
constexpr auto operator>>(const decimal32_t lhs, const Integer rhs) noexcept
2281-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t)
2282-
{
2283-
return from_bits(lhs.bits_ >> static_cast<std::uint32_t>(rhs));
2284-
}
2285-
2286-
template <typename Integer>
2287-
constexpr auto operator>>(const Integer lhs, const decimal32_t rhs) noexcept
2288-
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_integral_v, Integer, decimal32_t)
2289-
{
2290-
return from_bits(static_cast<std::uint32_t>(lhs) >> rhs.bits_);
2291-
}
2292-
2293-
constexpr auto operator~(const decimal32_t lhs) noexcept -> decimal32_t
2294-
{
2295-
return from_bits(~lhs.bits_);
2296-
}
2297-
22982149
// 3.6.4
22992150
// Effects: determines if the quantum exponents of x and y are the same.
23002151
// If both x and y are NaN, or infinity, they have the same quantum exponents;

0 commit comments

Comments
 (0)