repeat_while.cpp 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /*=============================================================================
  2. Copyright (c) 2017 Paul Fultz II
  3. repeat_while.cpp
  4. Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. ==============================================================================*/
  7. #include <boost/hof/repeat_while.hpp>
  8. #include <boost/hof/reveal.hpp>
  9. #include "test.hpp"
  10. // TODO: Test default construction, and static initialization
  11. struct increment_constant
  12. {
  13. template<class T>
  14. constexpr std::integral_constant<int, T::value + 1> operator()(T) const noexcept
  15. {
  16. return std::integral_constant<int, T::value + 1>();
  17. }
  18. };
  19. struct increment
  20. {
  21. template<class T>
  22. constexpr T operator()(T x) const noexcept
  23. {
  24. return x + 1;
  25. }
  26. };
  27. struct not_6_constant
  28. {
  29. template<class T>
  30. constexpr std::integral_constant<bool, (T::value != 6)>
  31. operator()(T) const noexcept
  32. {
  33. return std::integral_constant<bool, (T::value != 6)>();
  34. }
  35. };
  36. struct not_6
  37. {
  38. template<class T>
  39. constexpr bool operator()(T x) const noexcept
  40. {
  41. return x != 6;
  42. }
  43. };
  44. struct not_limit
  45. {
  46. template<class T>
  47. constexpr bool operator()(T x) const
  48. {
  49. return x != (BOOST_HOF_RECURSIVE_CONSTEXPR_DEPTH+4);
  50. }
  51. };
  52. #if BOOST_HOF_HAS_NOEXCEPT_DEDUCTION
  53. BOOST_HOF_TEST_CASE()
  54. {
  55. static_assert(noexcept(boost::hof::repeat_while(not_6())(increment())(1)), "noexcept repeat_while");
  56. static_assert(noexcept(boost::hof::repeat_while(not_6_constant())(increment_constant())(std::integral_constant<int, 1>())), "noexcept repeat_while");
  57. }
  58. #endif
  59. BOOST_HOF_TEST_CASE()
  60. {
  61. static_assert
  62. (
  63. std::is_same<
  64. std::integral_constant<int, 6>,
  65. decltype(boost::hof::repeat_while(not_6_constant())(increment_constant())(std::integral_constant<int, 1>()))
  66. >::value,
  67. "Error"
  68. );
  69. std::integral_constant<int, 6> x = boost::hof::repeat_while(not_6_constant())(increment_constant())(std::integral_constant<int, 1>());
  70. boost::hof::test::unused(x);
  71. }
  72. BOOST_HOF_TEST_CASE()
  73. {
  74. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::repeat_while(not_6())(increment())(1) == 6);
  75. BOOST_HOF_TEST_CHECK(boost::hof::repeat_while(not_6())(increment())(1) == 6);
  76. BOOST_HOF_TEST_CHECK(boost::hof::reveal(boost::hof::repeat_while(not_6())(increment()))(1) == 6);
  77. }
  78. BOOST_HOF_TEST_CASE()
  79. {
  80. BOOST_HOF_TEST_CHECK(boost::hof::repeat_while(not_limit())(increment())(1) == BOOST_HOF_RECURSIVE_CONSTEXPR_DEPTH+4);
  81. #if BOOST_HOF_HAS_RELAXED_CONSTEXPR
  82. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::repeat_while(not_limit())(increment())(1) == BOOST_HOF_RECURSIVE_CONSTEXPR_DEPTH+4);
  83. #endif
  84. }