constexpr_test_cpp_int_4.cpp 3.2 KB

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