1 // (C) Copyright John Maddock 2019.
2 // Use, modification and distribution are subject to the
3 // Boost Software License, Version 1.0. (See accompanying file
4 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 #include <boost/config.hpp>
7 #include <boost/multiprecision/number.hpp>
12 template <class T, class U>
13 BOOST_CXX14_CONSTEXPR T do_test_constexpr_add_subtract(T a, U b)
16 if constexpr(std::numeric_limits<U>::is_signed && std::numeric_limits<T>::is_signed)
29 if constexpr(std::numeric_limits<U>::is_signed && std::numeric_limits<T>::is_signed)
32 if constexpr(std::numeric_limits<T>::is_signed)
35 if constexpr(std::numeric_limits<U>::is_signed)
42 BOOST_CXX14_CONSTEXPR T test_constexpr_add_subtract(T a)
44 a += do_test_constexpr_add_subtract(a, a);
45 a += do_test_constexpr_add_subtract(a, static_cast<unsigned char>(2));
46 a += do_test_constexpr_add_subtract(a, static_cast<signed char>(2));
47 a += do_test_constexpr_add_subtract(a, static_cast<char>(2));
48 a += do_test_constexpr_add_subtract(a, static_cast<short>(2));
49 a += do_test_constexpr_add_subtract(a, static_cast<unsigned short>(2));
50 a += do_test_constexpr_add_subtract(a, static_cast<int>(2));
51 a += do_test_constexpr_add_subtract(a, static_cast<unsigned int>(2));
52 a += do_test_constexpr_add_subtract(a, static_cast<long>(2));
53 a += do_test_constexpr_add_subtract(a, static_cast<unsigned long>(2));
54 a += do_test_constexpr_add_subtract(a, static_cast<long long>(2));
55 a += do_test_constexpr_add_subtract(a, static_cast<unsigned long long>(2));
56 #ifdef BOOST_HAS_INT128
57 a += do_test_constexpr_add_subtract(a, static_cast<__int128>(2));
58 a += do_test_constexpr_add_subtract(a, static_cast<unsigned __int128>(2));
59 a -= do_test_constexpr_add_subtract(a, static_cast<__int128>(2));
60 a -= do_test_constexpr_add_subtract(a, static_cast<unsigned __int128>(2));
63 if constexpr (boost::multiprecision::number_category<T>::value == boost::multiprecision::number_kind_floating_point)
65 a += do_test_constexpr_add_subtract(a, static_cast<float>(2));
66 a += do_test_constexpr_add_subtract(a, static_cast<double>(2));
67 a += do_test_constexpr_add_subtract(a, static_cast<long double>(2));
68 #ifdef BOOST_HAS_FLOAT128
69 a += do_test_constexpr_add_subtract(a, static_cast<__float128>(2));
76 template <class T, class U>
77 BOOST_CXX14_CONSTEXPR T do_test_constexpr_mul_divide(T a, U b)
81 if constexpr(std::numeric_limits<T>::is_signed && std::numeric_limits<U>::is_signed)
88 if constexpr(std::numeric_limits<T>::is_signed && std::numeric_limits<U>::is_signed)
93 if constexpr (boost::multiprecision::number_category<T>::value == boost::multiprecision::number_kind_integer && boost::multiprecision::number_category<U>::value == boost::multiprecision::number_kind_integer)
102 BOOST_CXX14_CONSTEXPR T test_constexpr_mul_divide(T a)
104 a += do_test_constexpr_mul_divide(a, a);
105 a += do_test_constexpr_mul_divide(a, static_cast<unsigned char>(2));
106 a += do_test_constexpr_mul_divide(a, static_cast<signed char>(2));
107 a += do_test_constexpr_mul_divide(a, static_cast<char>(2));
108 a += do_test_constexpr_mul_divide(a, static_cast<short>(2));
109 a += do_test_constexpr_mul_divide(a, static_cast<unsigned short>(2));
110 a += do_test_constexpr_mul_divide(a, static_cast<int>(2));
111 a += do_test_constexpr_mul_divide(a, static_cast<unsigned int>(2));
112 a += do_test_constexpr_mul_divide(a, static_cast<long>(2));
113 a += do_test_constexpr_mul_divide(a, static_cast<unsigned long>(2));
114 a += do_test_constexpr_mul_divide(a, static_cast<long long>(2));
115 a += do_test_constexpr_mul_divide(a, static_cast<unsigned long long>(2));
116 #ifdef BOOST_HAS_INT128
117 a += do_test_constexpr_mul_divide(a, static_cast<__int128>(2));
118 a += do_test_constexpr_mul_divide(a, static_cast<unsigned __int128>(2));
119 a -= do_test_constexpr_mul_divide(a, static_cast<__int128>(2));
120 a -= do_test_constexpr_mul_divide(a, static_cast<unsigned __int128>(2));
123 if constexpr (boost::multiprecision::number_category<T>::value == boost::multiprecision::number_kind_floating_point)
125 a += do_test_constexpr_mul_divide(a, static_cast<float>(2));
126 a += do_test_constexpr_mul_divide(a, static_cast<double>(2));
127 a += do_test_constexpr_mul_divide(a, static_cast<long double>(2));
128 #ifdef BOOST_HAS_FLOAT128
129 a += do_test_constexpr_mul_divide(a, static_cast<__float128>(2));
135 template <class T, class U>
136 BOOST_CXX14_CONSTEXPR T do_test_constexpr_bitwise(T a, U b)
146 if constexpr (std::numeric_limits<T>::is_signed == false)
149 a >>= std::numeric_limits<T>::digits - 3;
161 BOOST_CXX14_CONSTEXPR T test_constexpr_bitwise(T a)
163 a += do_test_constexpr_bitwise(a, a);
164 a += do_test_constexpr_bitwise(a, static_cast<unsigned char>(2));
165 a += do_test_constexpr_bitwise(a, static_cast<signed char>(2));
166 a += do_test_constexpr_bitwise(a, static_cast<char>(2));
167 a += do_test_constexpr_bitwise(a, static_cast<short>(2));
168 a += do_test_constexpr_bitwise(a, static_cast<unsigned short>(2));
169 a += do_test_constexpr_bitwise(a, static_cast<int>(2));
170 a += do_test_constexpr_bitwise(a, static_cast<unsigned int>(2));
171 a += do_test_constexpr_bitwise(a, static_cast<long>(2));
172 a += do_test_constexpr_bitwise(a, static_cast<unsigned long>(2));
173 a += do_test_constexpr_bitwise(a, static_cast<long long>(2));
174 a += do_test_constexpr_bitwise(a, static_cast<unsigned long long>(2));
175 #ifdef BOOST_HAS_INT128
176 a += do_test_constexpr_bitwise(a, static_cast<__int128>(2));
177 a += do_test_constexpr_bitwise(a, static_cast<unsigned __int128>(2));
183 template <class T, class U>
184 BOOST_CXX14_CONSTEXPR T do_test_constexpr_logical(T a, U b)
203 BOOST_CXX14_CONSTEXPR T test_constexpr_logical(T a)
205 a += do_test_constexpr_logical(a, a);
206 a += do_test_constexpr_logical(a, static_cast<unsigned char>(2));
207 a += do_test_constexpr_logical(a, static_cast<signed char>(2));
208 a += do_test_constexpr_logical(a, static_cast<char>(2));
209 a += do_test_constexpr_logical(a, static_cast<short>(2));
210 a += do_test_constexpr_logical(a, static_cast<unsigned short>(2));
211 a += do_test_constexpr_logical(a, static_cast<int>(2));
212 a += do_test_constexpr_logical(a, static_cast<unsigned int>(2));
213 a += do_test_constexpr_logical(a, static_cast<long>(2));
214 a += do_test_constexpr_logical(a, static_cast<unsigned long>(2));
215 a += do_test_constexpr_logical(a, static_cast<long long>(2));
216 a += do_test_constexpr_logical(a, static_cast<unsigned long long>(2));
217 #ifdef BOOST_HAS_INT128
218 a += do_test_constexpr_logical(a, static_cast<__int128>(2));
219 a += do_test_constexpr_logical(a, static_cast<unsigned __int128>(2));
220 a -= do_test_constexpr_logical(a, static_cast<__int128>(2));
221 a -= do_test_constexpr_logical(a, static_cast<unsigned __int128>(2));
227 template <class T, class U>
228 BOOST_CXX14_CONSTEXPR T do_test_constexpr_compare(T a, U b)
264 BOOST_CXX14_CONSTEXPR T test_constexpr_compare(T a)
266 a += do_test_constexpr_compare(a, a);
267 a += do_test_constexpr_compare(a, static_cast<unsigned char>(2));
268 a += do_test_constexpr_compare(a, static_cast<signed char>(2));
269 a += do_test_constexpr_compare(a, static_cast<char>(2));
270 a += do_test_constexpr_compare(a, static_cast<short>(2));
271 a += do_test_constexpr_compare(a, static_cast<unsigned short>(2));
272 a += do_test_constexpr_compare(a, static_cast<int>(2));
273 a += do_test_constexpr_compare(a, static_cast<unsigned int>(2));
274 a += do_test_constexpr_compare(a, static_cast<long>(2));
275 a += do_test_constexpr_compare(a, static_cast<unsigned long>(2));
276 a += do_test_constexpr_compare(a, static_cast<long long>(2));
277 a += do_test_constexpr_compare(a, static_cast<unsigned long long>(2));
278 #ifdef BOOST_HAS_INT128
279 a += do_test_constexpr_compare(a, static_cast<__int128>(2));
280 a += do_test_constexpr_compare(a, static_cast<unsigned __int128>(2));
281 a -= do_test_constexpr_compare(a, static_cast<__int128>(2));
282 a -= do_test_constexpr_compare(a, static_cast<unsigned __int128>(2));
285 if constexpr (boost::multiprecision::number_category<T>::value == boost::multiprecision::number_kind_floating_point)
287 a += do_test_constexpr_compare(a, static_cast<float>(2));
288 a += do_test_constexpr_compare(a, static_cast<double>(2));
289 a += do_test_constexpr_compare(a, static_cast<long double>(2));
290 #ifdef BOOST_HAS_FLOAT128
291 a += do_test_constexpr_compare(a, static_cast<__float128>(2));