repeat.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /*=============================================================================
  2. Copyright (c) 2017 Paul Fultz II
  3. repeat.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.hpp>
  8. #include <limits>
  9. #include "test.hpp"
  10. // TODO: Add tests for multiple parameters
  11. struct increment
  12. {
  13. template<class T>
  14. constexpr T operator()(T x) const noexcept
  15. {
  16. return x + 1;
  17. }
  18. };
  19. #if BOOST_HOF_HAS_NOEXCEPT_DEDUCTION
  20. BOOST_HOF_TEST_CASE()
  21. {
  22. static_assert(noexcept(boost::hof::repeat(std::integral_constant<int, 5>())(increment())(1)), "noexcept repeat");
  23. static_assert(noexcept(boost::hof::repeat(5)(increment())(1)), "noexcept repeat");
  24. }
  25. #endif
  26. BOOST_HOF_TEST_CASE()
  27. {
  28. BOOST_HOF_TEST_CHECK(boost::hof::repeat(std::integral_constant<int, 5>())(increment())(1) == 6);
  29. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::repeat(std::integral_constant<int, 5>())(increment())(1) == 6);
  30. }
  31. BOOST_HOF_TEST_CASE()
  32. {
  33. BOOST_HOF_TEST_CHECK(boost::hof::repeat(5)(increment())(1) == 6);
  34. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::repeat(5)(increment())(1) == 6);
  35. }
  36. BOOST_HOF_TEST_CASE()
  37. {
  38. int i = 5;
  39. BOOST_HOF_TEST_CHECK(boost::hof::repeat(i)(increment())(1) == 6);
  40. }
  41. BOOST_HOF_TEST_CASE()
  42. {
  43. static const int i = 5;
  44. BOOST_HOF_TEST_CHECK(boost::hof::repeat(i)(increment())(1) == 6);
  45. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::repeat(i)(increment())(1) == 6);
  46. }
  47. // BOOST_HOF_TEST_CASE()
  48. // {
  49. // BOOST_HOF_TEST_CHECK(boost::hof::repeat(std::numeric_limits<int>::max()/4)(increment())(0) == std::numeric_limits<int>::max()/4);
  50. // }
  51. BOOST_HOF_TEST_CASE()
  52. {
  53. BOOST_HOF_TEST_CHECK(boost::hof::repeat(BOOST_HOF_RECURSIVE_CONSTEXPR_DEPTH+4)(increment())(0) == BOOST_HOF_RECURSIVE_CONSTEXPR_DEPTH+4);
  54. #if BOOST_HOF_HAS_RELAXED_CONSTEXPR
  55. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::repeat(BOOST_HOF_RECURSIVE_CONSTEXPR_DEPTH+4)(increment())(0) == BOOST_HOF_RECURSIVE_CONSTEXPR_DEPTH+4);
  56. #endif
  57. }