88#include < boost/decimal/fwd.hpp>
99#include < boost/decimal/detail/type_traits.hpp>
1010#include < boost/decimal/detail/config.hpp>
11+ #include < boost/decimal/detail/concepts.hpp>
12+ #include < boost/decimal/detail/promotion.hpp>
1113
1214#ifndef BOOST_DECIMAL_BUILD_MODULE
1315#include < type_traits>
@@ -19,102 +21,119 @@ namespace decimal {
1921namespace detail {
2022
2123// Values from IEEE 754-2019 table 3.6
24+ namespace impl {
25+
26+ template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE DecimalType>
27+ constexpr auto storage_width_v () noexcept -> int
28+ {
29+ return decimal_val_v<DecimalType> < 64 ? 32 :
30+ decimal_val_v<DecimalType> < 128 ? 64 : 128 ;
31+ }
32+
33+ template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE DecimalType>
34+ constexpr auto precision_v () noexcept -> int
35+ {
36+ return decimal_val_v<DecimalType> < 64 ? 7 :
37+ decimal_val_v<DecimalType> < 128 ? 16 : 34 ;
38+ }
39+
40+ template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE DecimalType>
41+ constexpr auto bias_v () noexcept -> int
42+ {
43+ return decimal_val_v<DecimalType> < 64 ? 101 :
44+ decimal_val_v<DecimalType> < 128 ? 398 : 6176 ;
45+ }
46+
47+ template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE DecimalType>
48+ constexpr auto max_biased_exp_v () noexcept -> int
49+ {
50+ return decimal_val_v<DecimalType> < 64 ? 191 :
51+ decimal_val_v<DecimalType> < 128 ? 767 : 12287 ;
52+ }
53+
54+ template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE DecimalType>
55+ constexpr auto emax_v () noexcept -> int
56+ {
57+ return decimal_val_v<DecimalType> < 64 ? 96 :
58+ decimal_val_v<DecimalType> < 128 ? 384 : 6144 ;
59+ }
60+
61+ template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE DecimalType>
62+ constexpr auto emin_v () noexcept -> int
63+ {
64+ return decimal_val_v<DecimalType> < 64 ? -95 :
65+ decimal_val_v<DecimalType> < 128 ? -383 : -6143 ;
66+ }
67+
68+ template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE DecimalType>
69+ constexpr auto combination_field_width_v () noexcept -> int
70+ {
71+ return decimal_val_v<DecimalType> < 64 ? 11 :
72+ decimal_val_v<DecimalType> < 128 ? 13 : 17 ;
73+ }
74+
75+ template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE DecimalType>
76+ constexpr auto trailing_significand_field_width_v () noexcept -> int
77+ {
78+ return decimal_val_v<DecimalType> < 64 ? 20 :
79+ decimal_val_v<DecimalType> < 128 ? 50 : 110 ;
80+ }
81+
82+ template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE DecimalType, std::enable_if_t <decimal_val_v<DecimalType> < 128 , bool > = true >
83+ constexpr auto max_significand_v () noexcept
84+ {
85+ return decimal_val_v<DecimalType> < 64 ? 9'999'999 : 9'999'999'999'999'999 ;
86+ }
87+
88+ template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE DecimalType, std::enable_if_t <decimal_val_v<DecimalType> >= 128 , bool > = true >
89+ constexpr auto max_significand_v () noexcept
90+ {
91+ return std::is_same<DecimalType, decimal128>::value ? uint128{UINT64_C (0b1111111111'1111111111'1111111111'1111111111'111111 ), UINT64_MAX} :
92+ uint128{UINT64_C (542101086242752 ), UINT64_C (4003012203950112767 )};
93+ }
94+
95+ template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE DecimalType>
96+ constexpr auto max_string_length_v () noexcept -> int
97+ {
98+ return decimal_val_v<DecimalType> < 64 ? 15 :
99+ decimal_val_v<DecimalType> < 128 ? 25 : 41 ;
100+ }
101+
102+ } // namespace impl
22103
23104template <typename Dec, std::enable_if_t <detail::is_decimal_floating_point_v<Dec>, bool > = true >
24- BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto storage_width_v = std::is_same<Dec, decimal32>::value || std::is_same<Dec, decimal32_fast>::value ? 32 : 64 ;
25-
26- template <>
27- BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto storage_width_v<decimal128> = 128 ;
28-
29- template <>
30- BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto storage_width_v<decimal128_fast> = 128 ;
105+ BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto storage_width_v = impl::storage_width_v<Dec>();
31106
32107template <typename Dec, std::enable_if_t <detail::is_decimal_floating_point_v<Dec>, bool > = true >
33- BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto precision_v = std::is_same<Dec, decimal32>::value || std::is_same<Dec, decimal32_fast>::value ? 7 : 16 ;
34-
35- template <>
36- BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto precision_v<decimal128> = 34 ;
37-
38- template <>
39- BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto precision_v<decimal128_fast> = 34 ;
108+ BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto precision_v = impl::precision_v<Dec>();
40109
41110template <typename Dec, std::enable_if_t <detail::is_decimal_floating_point_v<Dec>, bool > = true >
42- BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto bias_v = std::is_same<Dec, decimal32>::value || std::is_same<Dec, decimal32_fast>::value ? 101 : 398 ;
43-
44- template <>
45- BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto bias_v<decimal128> = 6176 ;
46-
47- template <>
48- BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto bias_v<decimal128_fast> = 6176 ;
111+ BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto bias_v = impl::bias_v<Dec>();
49112
50113template <typename Dec, std::enable_if_t <detail::is_decimal_floating_point_v<Dec>, bool > = true >
51- BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto max_biased_exp_v = std::is_same<Dec, decimal32>::value || std::is_same<Dec, decimal32_fast>::value ? 191 : 767 ;
52-
53- template <>
54- BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto max_biased_exp_v<decimal128> = 12287 ;
55-
56- template <>
57- BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto max_biased_exp_v<decimal128_fast> = 12287 ;
114+ BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto max_biased_exp_v = impl::max_biased_exp_v<Dec>();
58115
59116template <typename Dec, std::enable_if_t <detail::is_decimal_floating_point_v<Dec>, bool > = true >
60- BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto emax_v = std::is_same<Dec, decimal32>::value || std::is_same<Dec, decimal32_fast>::value ? 96 : 384 ;
61-
62- template <>
63- BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto emax_v<decimal128> = 6144 ;
64-
65- template <>
66- BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto emax_v<decimal128_fast> = 6144 ;
117+ BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto emax_v = impl::emax_v<Dec>();
67118
68119template <typename Dec, std::enable_if_t <detail::is_decimal_floating_point_v<Dec>, bool > = true >
69- BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto emin_v = std::is_same<Dec, decimal32>::value || std::is_same<Dec, decimal32_fast>::value ? -95 : -383 ;
70-
71- template <>
72- BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto emin_v<decimal128> = -6143 ;
73-
74- template <>
75- BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto emin_v<decimal128_fast> = -6143 ;
120+ BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto emin_v = impl::emin_v<Dec>();
76121
77122template <typename Dec, std::enable_if_t <detail::is_decimal_floating_point_v<Dec>, bool > = true >
78- BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto etiny_v = -bias_v<Dec>;
123+ BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto etiny_v = -impl:: bias_v<Dec>() ;
79124
80125template <typename Dec, std::enable_if_t <detail::is_decimal_floating_point_v<Dec>, bool > = true >
81- BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto combination_field_width_v = std::is_same<Dec, decimal32>::value || std::is_same<Dec, decimal32_fast>::value ? 11 : 13 ;
82-
83- template <>
84- BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto combination_field_width_v<decimal128> = 17 ;
85-
86- template <>
87- BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto combination_field_width_v<decimal128_fast> = 17 ;
126+ BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto combination_field_width_v = impl::combination_field_width_v<Dec>();
88127
89128template <typename Dec, std::enable_if_t <detail::is_decimal_floating_point_v<Dec>, bool > = true >
90- BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto trailing_significand_field_width_v = std::is_same<Dec, decimal32>::value || std::is_same<Dec, decimal32_fast>::value ? 20 : 50 ;
91-
92- template <>
93- BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto trailing_significand_field_width_v<decimal128> = 110 ;
94-
95- template <>
96- BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto trailing_significand_field_width_v<decimal128_fast> = 110 ;
129+ BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto trailing_significand_field_width_v = impl::trailing_significand_field_width_v<Dec>();
97130
98131template <typename Dec, std::enable_if_t <detail::is_decimal_floating_point_v<Dec>, bool > = true >
99- BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto max_significand_v = std::is_same<Dec, decimal32>::value || std::is_same<Dec, decimal32_fast>::value ? 9'999'999 : 9'999'999'999'999'999 ;
100-
101- template <>
102- BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto max_significand_v<decimal128> =
103- uint128{UINT64_C (0b1111111111'1111111111'1111111111'1111111111'111111 ), UINT64_MAX};
104-
105- template <>
106- BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto max_significand_v<decimal128_fast> =
107- uint128{UINT64_C (542101086242752 ), UINT64_C (4003012203950112767 )};
132+ BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto max_significand_v = impl::max_significand_v<Dec>();
108133
109134// sign + decimal digits + '.' + 'e' + '+/-' + max digits of exponent + null term
110135template <typename Dec, std::enable_if_t <detail::is_decimal_floating_point_v<Dec>, bool > = true >
111- BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto max_string_length_v = std::is_same<Dec, decimal32>::value || std::is_same<Dec, decimal32_fast>::value ? 15 : 25 ;
112-
113- template <>
114- BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto max_string_length_v<decimal128> = 41 ;
115-
116- template <>
117- BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto max_string_length_v<decimal128_fast> = 41 ;
136+ BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto max_string_length_v = impl::max_string_length_v<Dec>();
118137
119138BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto storage_width {storage_width_v<decimal32>};
120139BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto precision {precision_v<decimal32>};
0 commit comments