constexpr_test_cpp_int.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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)
  5. #include "constexpr_arithmetric_test.hpp"
  6. #include "boost/multiprecision/cpp_int.hpp"
  7. #include "test.hpp"
  8. #if !defined(BOOST_MP_NO_CONSTEXPR_DETECTION) && !defined(DISABLE_TESTS)
  9. template <class F, class V>
  10. decltype(std::declval<F>()(std::declval<V>())) non_constexpr_invoke(F f, V v)
  11. {
  12. return f(v);
  13. }
  14. int main()
  15. {
  16. typedef boost::multiprecision::int256_t int_backend;
  17. typedef boost::multiprecision::uint256_t unsigned_backend;
  18. {
  19. constexpr int_backend a(22);
  20. constexpr unsigned_backend c(22);
  21. constexpr int_backend b = test_constexpr_add_subtract(a);
  22. constexpr unsigned_backend d = test_constexpr_add_subtract(c);
  23. constexpr long long llv = (long long)b;
  24. static_assert(b == -108);
  25. static_assert(d == 554);
  26. BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_add_subtract<int_backend>, a));
  27. BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_add_subtract<unsigned_backend>, c));
  28. }
  29. {
  30. constexpr int_backend a(22);
  31. constexpr unsigned_backend c(22);
  32. constexpr int_backend b = test_constexpr_mul_divide(a);
  33. constexpr unsigned_backend d = test_constexpr_mul_divide(c);
  34. static_assert(b == 22);
  35. static_assert(d == 22);
  36. BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_mul_divide<int_backend>, a));
  37. BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_mul_divide<unsigned_backend>, c));
  38. }
  39. {
  40. constexpr int_backend a(22);
  41. constexpr unsigned_backend c(22);
  42. constexpr int_backend b = test_constexpr_bitwise(a);
  43. constexpr unsigned_backend d = test_constexpr_bitwise(c);
  44. #ifdef BOOST_HAS_INT128
  45. static_assert(b == 230);
  46. static_assert(d == 120);
  47. #else
  48. static_assert(b == 210);
  49. static_assert(d == 106);
  50. #endif
  51. BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_bitwise<int_backend>, a));
  52. BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_bitwise<unsigned_backend>, c));
  53. }
  54. {
  55. constexpr int_backend a(22);
  56. constexpr unsigned_backend c(22);
  57. constexpr int_backend b = test_constexpr_logical(a);
  58. constexpr unsigned_backend d = test_constexpr_logical(c);
  59. #ifdef BOOST_HAS_INT128
  60. //static_assert(b == 95);
  61. //static_assert(d == 95);
  62. #else
  63. static_assert(b == 82);
  64. static_assert(d == 82);
  65. #endif
  66. BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_logical<int_backend>, a));
  67. BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_logical<unsigned_backend>, c));
  68. }
  69. {
  70. constexpr int_backend a(22);
  71. constexpr unsigned_backend c(22);
  72. constexpr int_backend b = test_constexpr_compare(a);
  73. constexpr unsigned_backend d = test_constexpr_compare(c);
  74. #ifdef BOOST_HAS_INT128
  75. static_assert(b == 95);
  76. static_assert(d == 95);
  77. #else
  78. static_assert(b == 95);
  79. static_assert(d == 95);
  80. #endif
  81. BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_compare<int_backend>, a));
  82. BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_compare<unsigned_backend>, c));
  83. }
  84. return boost::report_errors();
  85. }
  86. #else
  87. int main() {}
  88. #endif