test_nothrow_cpp_rational.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // Copyright 2015 John Maddock. Distributed under the Boost
  3. // 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/multiprecision/cpp_int.hpp>
  6. #include <boost/type_traits/is_nothrow_move_constructible.hpp>
  7. #include <boost/type_traits/is_nothrow_move_assignable.hpp>
  8. #include <boost/type_traits/has_nothrow_constructor.hpp>
  9. #include <boost/type_traits/has_nothrow_assign.hpp>
  10. #include <boost/type_traits/has_nothrow_copy.hpp>
  11. #include <boost/static_assert.hpp>
  12. typedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::int128_t::backend_type> > rat128_t;
  13. typedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::uint128_t::backend_type> > urat128_t;
  14. typedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::int512_t::backend_type> > rat512_t;
  15. typedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::uint512_t::backend_type> > urat512_t;
  16. typedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::checked_int128_t::backend_type> > checked_rat128_t;
  17. typedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::checked_uint128_t::backend_type> > checked_urat128_t;
  18. typedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::checked_int512_t::backend_type> > checked_rat512_t;
  19. typedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::checked_uint512_t::backend_type> > checked_urat512_t;
  20. #ifndef BOOST_NO_CXX11_NOEXCEPT
  21. #if !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_SFINAE_EXPR) || defined(BOOST_IS_NOTHROW_MOVE_CONSTRUCT)
  22. //
  23. // Move construct:
  24. //
  25. BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<boost::multiprecision::cpp_rational>::value);
  26. BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<rat128_t>::value);
  27. BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<checked_rat128_t>::value);
  28. BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<urat128_t>::value);
  29. BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<checked_urat128_t>::value);
  30. BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<rat512_t>::value);
  31. BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<checked_rat512_t>::value);
  32. BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<urat512_t>::value);
  33. BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<checked_urat512_t>::value);
  34. #endif
  35. #if !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_SFINAE_EXPR) || defined(BOOST_IS_NOTHROW_MOVE_ASSIGN)
  36. //
  37. // Move assign:
  38. //
  39. BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<boost::multiprecision::cpp_rational>::value);
  40. BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<rat128_t>::value);
  41. BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<checked_rat128_t>::value);
  42. BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<urat128_t>::value);
  43. BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<checked_urat128_t>::value);
  44. BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<rat512_t>::value);
  45. BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<checked_rat512_t>::value);
  46. BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<urat512_t>::value);
  47. BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<checked_urat512_t>::value);
  48. #endif
  49. #if 0
  50. //
  51. // Everything below could/should be made to work, given modifications to Boost.Rational
  52. //
  53. //
  54. // Construct:
  55. //
  56. #ifdef BOOST_HAS_NOTHROW_CONSTRUCTOR
  57. BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<boost::multiprecision::cpp_rational>::value);
  58. BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<rat128_t>::value);
  59. BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<checked_rat128_t>::value);
  60. BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<urat128_t>::value);
  61. BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<checked_urat128_t>::value);
  62. BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<rat512_t>::value);
  63. BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<checked_rat512_t>::value);
  64. BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<urat512_t>::value);
  65. BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<checked_urat512_t>::value);
  66. #endif
  67. //
  68. // Copy construct:
  69. //
  70. #ifdef BOOST_HAS_NOTHROW_COPY
  71. BOOST_STATIC_ASSERT(!boost::has_nothrow_copy<boost::multiprecision::cpp_rational>::value);
  72. BOOST_STATIC_ASSERT(boost::has_nothrow_copy<rat128_t>::value);
  73. BOOST_STATIC_ASSERT(boost::has_nothrow_copy<checked_rat128_t>::value);
  74. BOOST_STATIC_ASSERT(boost::has_nothrow_copy<urat128_t>::value);
  75. BOOST_STATIC_ASSERT(boost::has_nothrow_copy<checked_urat128_t>::value);
  76. BOOST_STATIC_ASSERT(boost::has_nothrow_copy<rat512_t>::value);
  77. BOOST_STATIC_ASSERT(boost::has_nothrow_copy<checked_rat512_t>::value);
  78. BOOST_STATIC_ASSERT(boost::has_nothrow_copy<urat512_t>::value);
  79. BOOST_STATIC_ASSERT(boost::has_nothrow_copy<checked_urat512_t>::value);
  80. #endif
  81. //
  82. // Assign:
  83. //
  84. #ifdef BOOST_HAS_NOTHROW_ASSIGN
  85. BOOST_STATIC_ASSERT(!boost::has_nothrow_assign<boost::multiprecision::cpp_rational>::value);
  86. BOOST_STATIC_ASSERT(boost::has_nothrow_assign<rat128_t>::value);
  87. BOOST_STATIC_ASSERT(boost::has_nothrow_assign<checked_rat128_t>::value);
  88. BOOST_STATIC_ASSERT(boost::has_nothrow_assign<urat128_t>::value);
  89. BOOST_STATIC_ASSERT(boost::has_nothrow_assign<checked_urat128_t>::value);
  90. BOOST_STATIC_ASSERT(boost::has_nothrow_assign<rat512_t>::value);
  91. BOOST_STATIC_ASSERT(boost::has_nothrow_assign<checked_rat512_t>::value);
  92. BOOST_STATIC_ASSERT(boost::has_nothrow_assign<urat512_t>::value);
  93. BOOST_STATIC_ASSERT(boost::has_nothrow_assign<checked_urat512_t>::value);
  94. #endif
  95. //
  96. // Construct from int:
  97. //
  98. BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::cpp_rational(std::declval<boost::multiprecision::signed_limb_type>())));
  99. BOOST_STATIC_ASSERT(noexcept(rat128_t(std::declval<boost::multiprecision::signed_limb_type>())));
  100. BOOST_STATIC_ASSERT(noexcept(checked_rat128_t(std::declval<boost::multiprecision::signed_limb_type>())));
  101. BOOST_STATIC_ASSERT(noexcept(urat128_t(std::declval<boost::multiprecision::signed_limb_type>())));
  102. BOOST_STATIC_ASSERT(!noexcept(checked_urat128_t(std::declval<boost::multiprecision::signed_limb_type>())));
  103. BOOST_STATIC_ASSERT(noexcept(rat512_t(std::declval<boost::multiprecision::signed_limb_type>())));
  104. BOOST_STATIC_ASSERT(noexcept(checked_rat512_t(std::declval<boost::multiprecision::signed_limb_type>())));
  105. BOOST_STATIC_ASSERT(noexcept(urat512_t(std::declval<boost::multiprecision::signed_limb_type>())));
  106. BOOST_STATIC_ASSERT(!noexcept(checked_urat512_t(std::declval<boost::multiprecision::signed_limb_type>())));
  107. //
  108. // Construct from unsigned int:
  109. //
  110. BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::cpp_rational(std::declval<boost::multiprecision::limb_type>())));
  111. BOOST_STATIC_ASSERT(noexcept(rat128_t(std::declval<boost::multiprecision::limb_type>())));
  112. BOOST_STATIC_ASSERT(noexcept(checked_rat128_t(std::declval<boost::multiprecision::limb_type>())));
  113. BOOST_STATIC_ASSERT(noexcept(urat128_t(std::declval<boost::multiprecision::limb_type>())));
  114. BOOST_STATIC_ASSERT(noexcept(checked_urat128_t(std::declval<boost::multiprecision::limb_type>())));
  115. BOOST_STATIC_ASSERT(noexcept(rat512_t(std::declval<boost::multiprecision::limb_type>())));
  116. BOOST_STATIC_ASSERT(noexcept(checked_rat512_t(std::declval<boost::multiprecision::limb_type>())));
  117. BOOST_STATIC_ASSERT(noexcept(urat512_t(std::declval<boost::multiprecision::limb_type>())));
  118. BOOST_STATIC_ASSERT(noexcept(checked_urat512_t(std::declval<boost::multiprecision::limb_type>())));
  119. //
  120. // Assign from int:
  121. //
  122. BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::cpp_rational>() = std::declval<boost::multiprecision::signed_limb_type>()));
  123. BOOST_STATIC_ASSERT(noexcept(std::declval<rat128_t>() = std::declval<boost::multiprecision::signed_limb_type>()));
  124. BOOST_STATIC_ASSERT(noexcept(std::declval<checked_rat128_t>() = std::declval<boost::multiprecision::signed_limb_type>()));
  125. BOOST_STATIC_ASSERT(noexcept(std::declval<urat128_t>() = std::declval<boost::multiprecision::signed_limb_type>()));
  126. BOOST_STATIC_ASSERT(!noexcept(std::declval<checked_urat128_t>() = std::declval<boost::multiprecision::signed_limb_type>()));
  127. BOOST_STATIC_ASSERT(noexcept(std::declval<rat512_t>() = std::declval<boost::multiprecision::signed_limb_type>()));
  128. BOOST_STATIC_ASSERT(noexcept(std::declval<checked_rat512_t>() = std::declval<boost::multiprecision::signed_limb_type>()));
  129. BOOST_STATIC_ASSERT(noexcept(std::declval<urat512_t>() = std::declval<boost::multiprecision::signed_limb_type>()));
  130. BOOST_STATIC_ASSERT(!noexcept(std::declval<checked_urat512_t>() = std::declval<boost::multiprecision::signed_limb_type>()));
  131. //
  132. // Assign from unsigned int:
  133. //
  134. BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::cpp_rational>() = std::declval<boost::multiprecision::limb_type>()));
  135. BOOST_STATIC_ASSERT(noexcept(std::declval<rat128_t>() = std::declval<boost::multiprecision::limb_type>()));
  136. BOOST_STATIC_ASSERT(noexcept(std::declval<checked_rat128_t>() = std::declval<boost::multiprecision::limb_type>()));
  137. BOOST_STATIC_ASSERT(noexcept(std::declval<urat128_t>() = std::declval<boost::multiprecision::limb_type>()));
  138. BOOST_STATIC_ASSERT(noexcept(std::declval<checked_urat128_t>() = std::declval<boost::multiprecision::limb_type>()));
  139. BOOST_STATIC_ASSERT(noexcept(std::declval<rat512_t>() = std::declval<boost::multiprecision::limb_type>()));
  140. BOOST_STATIC_ASSERT(noexcept(std::declval<checked_rat512_t>() = std::declval<boost::multiprecision::limb_type>()));
  141. BOOST_STATIC_ASSERT(noexcept(std::declval<urat512_t>() = std::declval<boost::multiprecision::limb_type>()));
  142. BOOST_STATIC_ASSERT(noexcept(std::declval<checked_urat512_t>() = std::declval<boost::multiprecision::limb_type>()));
  143. #if defined(BOOST_LITTLE_ENDIAN)
  144. //
  145. // Construct from int:
  146. //
  147. BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::cpp_rational(std::declval<boost::multiprecision::signed_double_limb_type>())));
  148. BOOST_STATIC_ASSERT(noexcept(rat128_t(std::declval<boost::multiprecision::signed_double_limb_type>())));
  149. BOOST_STATIC_ASSERT(noexcept(checked_rat128_t(std::declval<boost::multiprecision::signed_double_limb_type>())));
  150. BOOST_STATIC_ASSERT(noexcept(urat128_t(std::declval<boost::multiprecision::signed_double_limb_type>())));
  151. BOOST_STATIC_ASSERT(!noexcept(checked_urat128_t(std::declval<boost::multiprecision::signed_double_limb_type>())));
  152. BOOST_STATIC_ASSERT(noexcept(rat512_t(std::declval<boost::multiprecision::signed_double_limb_type>())));
  153. BOOST_STATIC_ASSERT(noexcept(checked_rat512_t(std::declval<boost::multiprecision::signed_double_limb_type>())));
  154. BOOST_STATIC_ASSERT(noexcept(urat512_t(std::declval<boost::multiprecision::signed_double_limb_type>())));
  155. BOOST_STATIC_ASSERT(!noexcept(checked_urat512_t(std::declval<boost::multiprecision::signed_double_limb_type>())));
  156. //
  157. // Construct from unsigned int:
  158. //
  159. BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::cpp_rational(std::declval<boost::multiprecision::double_limb_type>())));
  160. BOOST_STATIC_ASSERT(noexcept(rat128_t(std::declval<boost::multiprecision::double_limb_type>())));
  161. BOOST_STATIC_ASSERT(noexcept(checked_rat128_t(std::declval<boost::multiprecision::double_limb_type>())));
  162. BOOST_STATIC_ASSERT(noexcept(urat128_t(std::declval<boost::multiprecision::double_limb_type>())));
  163. BOOST_STATIC_ASSERT(noexcept(checked_urat128_t(std::declval<boost::multiprecision::double_limb_type>())));
  164. BOOST_STATIC_ASSERT(noexcept(rat512_t(std::declval<boost::multiprecision::double_limb_type>())));
  165. BOOST_STATIC_ASSERT(noexcept(checked_rat512_t(std::declval<boost::multiprecision::double_limb_type>())));
  166. BOOST_STATIC_ASSERT(noexcept(urat512_t(std::declval<boost::multiprecision::double_limb_type>())));
  167. BOOST_STATIC_ASSERT(noexcept(checked_urat512_t(std::declval<boost::multiprecision::double_limb_type>())));
  168. //
  169. // Assign from int:
  170. //
  171. BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::cpp_rational>() = std::declval<boost::multiprecision::signed_double_limb_type>()));
  172. BOOST_STATIC_ASSERT(noexcept(std::declval<rat128_t>() = std::declval<boost::multiprecision::signed_double_limb_type>()));
  173. BOOST_STATIC_ASSERT(noexcept(std::declval<checked_rat128_t>() = std::declval<boost::multiprecision::signed_double_limb_type>()));
  174. BOOST_STATIC_ASSERT(noexcept(std::declval<urat128_t>() = std::declval<boost::multiprecision::signed_double_limb_type>()));
  175. BOOST_STATIC_ASSERT(!noexcept(std::declval<checked_urat128_t>() = std::declval<boost::multiprecision::signed_double_limb_type>()));
  176. BOOST_STATIC_ASSERT(noexcept(std::declval<rat512_t>() = std::declval<boost::multiprecision::signed_double_limb_type>()));
  177. BOOST_STATIC_ASSERT(noexcept(std::declval<checked_rat512_t>() = std::declval<boost::multiprecision::signed_double_limb_type>()));
  178. BOOST_STATIC_ASSERT(noexcept(std::declval<urat512_t>() = std::declval<boost::multiprecision::signed_double_limb_type>()));
  179. BOOST_STATIC_ASSERT(!noexcept(std::declval<checked_urat512_t>() = std::declval<boost::multiprecision::signed_double_limb_type>()));
  180. //
  181. // Assign from unsigned int:
  182. //
  183. BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::cpp_rational>() = std::declval<boost::multiprecision::double_limb_type>()));
  184. BOOST_STATIC_ASSERT(noexcept(std::declval<rat128_t>() = std::declval<boost::multiprecision::double_limb_type>()));
  185. BOOST_STATIC_ASSERT(noexcept(std::declval<checked_rat128_t>() = std::declval<boost::multiprecision::double_limb_type>()));
  186. BOOST_STATIC_ASSERT(noexcept(std::declval<urat128_t>() = std::declval<boost::multiprecision::double_limb_type>()));
  187. BOOST_STATIC_ASSERT(noexcept(std::declval<checked_urat128_t>() = std::declval<boost::multiprecision::double_limb_type>()));
  188. BOOST_STATIC_ASSERT(noexcept(std::declval<rat512_t>() = std::declval<boost::multiprecision::double_limb_type>()));
  189. BOOST_STATIC_ASSERT(noexcept(std::declval<checked_rat512_t>() = std::declval<boost::multiprecision::double_limb_type>()));
  190. BOOST_STATIC_ASSERT(noexcept(std::declval<urat512_t>() = std::declval<boost::multiprecision::double_limb_type>()));
  191. BOOST_STATIC_ASSERT(noexcept(std::declval<checked_urat512_t>() = std::declval<boost::multiprecision::double_limb_type>()));
  192. #endif
  193. #endif // little endian
  194. #endif // noexcept