test_checked_mixed_cpp_int.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. ///////////////////////////////////////////////////////////////
  2. // Copyright 2012 John Maddock. Distributed under the Boost
  3. // Software License, Version 1.0. (See accompanying file
  4. // LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt
  5. #ifdef _MSC_VER
  6. #define _SCL_SECURE_NO_WARNINGS
  7. #endif
  8. #include <boost/multiprecision/cpp_int.hpp>
  9. #include "test.hpp"
  10. template <class T, class U>
  11. void check_result_type(const T&, const U&)
  12. {
  13. BOOST_CHECK(0);
  14. }
  15. void check_result_type(const boost::multiprecision::checked_int1024_t&, const boost::multiprecision::checked_int1024_t&) {}
  16. int main()
  17. {
  18. #ifndef BOOST_NO_EXCEPTIONS
  19. try
  20. {
  21. #endif
  22. typedef boost::multiprecision::checked_int1024_t big_type;
  23. typedef boost::multiprecision::checked_int512_t small_type;
  24. typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<32, 32, boost::multiprecision::signed_magnitude, boost::multiprecision::checked, void>, boost::multiprecision::et_off> little_type;
  25. big_type big_val = (big_type(1) << 1000) + 1;
  26. small_type small_val = 1;
  27. little_type little_val = 1;
  28. check_result_type(big_val, big_val + small_val);
  29. check_result_type(big_val, big_val - small_val);
  30. check_result_type(big_val, big_val * small_val);
  31. check_result_type(big_val, big_val / small_val);
  32. check_result_type(big_val, big_val | small_val);
  33. check_result_type(big_val, big_val & small_val);
  34. check_result_type(big_val, big_val ^ small_val);
  35. check_result_type(big_val, small_val + big_val);
  36. check_result_type(big_val, small_val - big_val);
  37. check_result_type(big_val, small_val * big_val);
  38. check_result_type(big_val, small_val / big_val);
  39. check_result_type(big_val, small_val | big_val);
  40. check_result_type(big_val, small_val & big_val);
  41. check_result_type(big_val, small_val ^ big_val);
  42. check_result_type(big_val, big_val + little_val);
  43. check_result_type(big_val, big_val - little_val);
  44. check_result_type(big_val, big_val * little_val);
  45. check_result_type(big_val, big_val / little_val);
  46. check_result_type(big_val, big_val | little_val);
  47. check_result_type(big_val, big_val & little_val);
  48. check_result_type(big_val, big_val ^ little_val);
  49. check_result_type(big_val, little_val + big_val);
  50. check_result_type(big_val, little_val - big_val);
  51. check_result_type(big_val, little_val * big_val);
  52. check_result_type(big_val, little_val / big_val);
  53. check_result_type(big_val, little_val | big_val);
  54. check_result_type(big_val, little_val & big_val);
  55. check_result_type(big_val, little_val ^ big_val);
  56. BOOST_CHECK_EQUAL(big_val == small_val, false);
  57. BOOST_CHECK_EQUAL(big_val <= small_val, false);
  58. BOOST_CHECK_EQUAL(big_val >= small_val, true);
  59. BOOST_CHECK_EQUAL(big_val < small_val, false);
  60. BOOST_CHECK_EQUAL(big_val > small_val, true);
  61. BOOST_CHECK_EQUAL(big_val != small_val, true);
  62. BOOST_CHECK_EQUAL(small_val == big_val, false);
  63. BOOST_CHECK_EQUAL(small_val <= big_val, true);
  64. BOOST_CHECK_EQUAL(small_val >= big_val, false);
  65. BOOST_CHECK_EQUAL(small_val < big_val, true);
  66. BOOST_CHECK_EQUAL(small_val > big_val, false);
  67. BOOST_CHECK_EQUAL(small_val != big_val, true);
  68. BOOST_CHECK_EQUAL(big_val == little_val, false);
  69. BOOST_CHECK_EQUAL(big_val <= little_val, false);
  70. BOOST_CHECK_EQUAL(big_val >= little_val, true);
  71. BOOST_CHECK_EQUAL(big_val < little_val, false);
  72. BOOST_CHECK_EQUAL(big_val > little_val, true);
  73. BOOST_CHECK_EQUAL(big_val != little_val, true);
  74. BOOST_CHECK_EQUAL(little_val == big_val, false);
  75. BOOST_CHECK_EQUAL(little_val <= big_val, true);
  76. BOOST_CHECK_EQUAL(little_val >= big_val, false);
  77. BOOST_CHECK_EQUAL(little_val < big_val, true);
  78. BOOST_CHECK_EQUAL(little_val > big_val, false);
  79. BOOST_CHECK_EQUAL(little_val != big_val, true);
  80. #ifndef BOOST_NO_EXCEPTIONS
  81. }
  82. catch (const std::exception& e)
  83. {
  84. std::cout << "Failed with unexpected exception: " << e.what() << std::endl;
  85. return 1;
  86. }
  87. #endif
  88. return boost::report_errors();
  89. }