capture.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /*=============================================================================
  2. Copyright (c) 2017 Paul Fultz II
  3. capture.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/capture.hpp>
  8. #include <boost/hof/identity.hpp>
  9. #include "test.hpp"
  10. BOOST_HOF_TEST_CASE()
  11. {
  12. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::capture_basic(1, 2)(binary_class())() == 3);
  13. BOOST_HOF_TEST_CHECK(boost::hof::capture_basic(1, 2)(binary_class())() == 3);
  14. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::capture_basic(1)(binary_class())(2) == 3);
  15. BOOST_HOF_TEST_CHECK(boost::hof::capture_basic(1)(binary_class())(2) == 3);
  16. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::capture_basic()(binary_class())(1, 2) == 3);
  17. BOOST_HOF_TEST_CHECK(boost::hof::capture_basic()(binary_class())(1, 2) == 3);
  18. static const int one = 1;
  19. static const int two = 2;
  20. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::capture_forward(one, two)(binary_class())() == 3);
  21. BOOST_HOF_TEST_CHECK(boost::hof::capture_forward(one, two)(binary_class())() == 3);
  22. BOOST_HOF_TEST_CHECK(boost::hof::capture_forward(1, 2)(binary_class())() == 3);
  23. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::capture_forward(one)(binary_class())(two) == 3);
  24. BOOST_HOF_TEST_CHECK(boost::hof::capture_forward(1)(binary_class())(2) == 3);
  25. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::capture_forward()(binary_class())(one, two) == 3);
  26. BOOST_HOF_TEST_CHECK(boost::hof::capture_forward()(binary_class())(one, two) == 3);
  27. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::capture(1, 2)(binary_class())() == 3);
  28. BOOST_HOF_TEST_CHECK(boost::hof::capture(1, 2)(binary_class())() == 3);
  29. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::capture(1)(binary_class())(2) == 3);
  30. BOOST_HOF_TEST_CHECK(boost::hof::capture(1)(binary_class())(2) == 3);
  31. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::capture()(binary_class())(1, 2) == 3);
  32. BOOST_HOF_TEST_CHECK(boost::hof::capture()(binary_class())(1, 2) == 3);
  33. }
  34. struct add_member
  35. {
  36. int i;
  37. add_member(int ip) : i(ip)
  38. {}
  39. int add(int j) const
  40. {
  41. return i + j;
  42. }
  43. };
  44. BOOST_HOF_TEST_CASE()
  45. {
  46. BOOST_HOF_TEST_CHECK(boost::hof::capture_basic(add_member(1), 2)(&add_member::add)() == 3);
  47. BOOST_HOF_TEST_CHECK(boost::hof::capture_basic(add_member(1))(&add_member::add)(2) == 3);
  48. }
  49. BOOST_HOF_TEST_CASE()
  50. {
  51. auto id = boost::hof::identity;
  52. auto f = boost::hof::capture(boost::hof::identity)(boost::hof::identity);
  53. static_assert(BOOST_HOF_IS_DEFAULT_CONSTRUCTIBLE(decltype(id)), "Id not default constructible");
  54. static_assert(BOOST_HOF_IS_DEFAULT_CONSTRUCTIBLE(decltype(f)), "Not default constructible");
  55. f();
  56. }
  57. #if BOOST_HOF_HAS_NOEXCEPT_DEDUCTION
  58. BOOST_HOF_TEST_CASE()
  59. {
  60. static_assert(noexcept(boost::hof::capture(boost::hof::identity)(boost::hof::identity)()), "noexcept capture");
  61. static_assert(noexcept(boost::hof::capture_basic(boost::hof::identity)(boost::hof::identity)()), "noexcept capture");
  62. static_assert(noexcept(boost::hof::capture_forward(boost::hof::identity)(boost::hof::identity)()), "noexcept capture");
  63. }
  64. #endif
  65. BOOST_HOF_TEST_CASE()
  66. {
  67. auto f = boost::hof::capture_basic(boost::hof::identity)(boost::hof::identity);
  68. f();
  69. }
  70. BOOST_HOF_TEST_CASE()
  71. {
  72. auto f = boost::hof::capture_forward(boost::hof::identity)(boost::hof::identity);
  73. f();
  74. }
  75. BOOST_HOF_TEST_CASE()
  76. {
  77. auto f = boost::hof::capture(boost::hof::identity)(add_member{1});
  78. static_assert(!boost::hof::is_invocable<decltype(f), int>::value, "Not sfinae friendly");
  79. }