constexpr_test_cpp_int_2.cpp 3.4 KB

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