pipable.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /*=============================================================================
  2. Copyright (c) 2017 Paul Fultz II
  3. pipable.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/pipable.hpp>
  8. #include <boost/hof/static.hpp>
  9. #include <boost/hof/limit.hpp>
  10. #include "test.hpp"
  11. static constexpr boost::hof::static_<boost::hof::pipable_adaptor<binary_class> > binary_pipable = {};
  12. static constexpr boost::hof::static_<boost::hof::pipable_adaptor<unary_class> > unary_pipable = {};
  13. static constexpr boost::hof::static_<boost::hof::pipable_adaptor<mutable_class> > mutable_pipable = {};
  14. static constexpr boost::hof::static_<boost::hof::pipable_adaptor<void_class> > void_pipable = {};
  15. static constexpr boost::hof::static_<boost::hof::pipable_adaptor<mono_class> > mono_pipable = {};
  16. static constexpr boost::hof::static_<boost::hof::pipable_adaptor<move_class> > move_pipable = {};
  17. constexpr boost::hof::pipable_adaptor<void_class> void_pipable_constexpr = {};
  18. constexpr boost::hof::pipable_adaptor<binary_class> binary_pipable_constexpr = {};
  19. constexpr boost::hof::pipable_adaptor<unary_class> unary_pipable_constexpr = {};
  20. #if BOOST_HOF_HAS_NOEXCEPT_DEDUCTION
  21. BOOST_HOF_TEST_CASE()
  22. {
  23. static_assert(noexcept(1 | binary_pipable(2)), "noexcept pipable");
  24. static_assert(noexcept(binary_pipable(1, 2)), "noexcept pipable");
  25. }
  26. #endif
  27. BOOST_HOF_TEST_CASE()
  28. {
  29. void_pipable(1);
  30. 1 | void_pipable;
  31. BOOST_HOF_TEST_CHECK(3 == (1 | binary_pipable(2)));
  32. BOOST_HOF_TEST_CHECK(3 == (binary_pipable(1, 2)));
  33. BOOST_HOF_TEST_CHECK(3 == (3 | unary_pipable));
  34. BOOST_HOF_TEST_CHECK(3 == (3 | unary_pipable()));
  35. BOOST_HOF_TEST_CHECK(3 == (unary_pipable(3)));
  36. int i1 = 1;
  37. BOOST_HOF_TEST_CHECK(3 == (2 | binary_pipable(i1)));
  38. BOOST_HOF_TEST_CHECK(3 == (i1 | mutable_pipable(2)));
  39. BOOST_HOF_TEST_CHECK(3 == (i1));
  40. int i2 = 1;
  41. BOOST_HOF_TEST_CHECK(3 == (mutable_pipable(i2, 2)));
  42. BOOST_HOF_TEST_CHECK(3 == (i2));
  43. BOOST_HOF_TEST_CHECK(3 == (mono_pipable(2)));
  44. BOOST_HOF_TEST_CHECK(3 == (2| mono_pipable));
  45. }
  46. BOOST_HOF_TEST_CASE()
  47. {
  48. BOOST_HOF_TEST_CHECK(3 == (move_class()(1, 2)));
  49. BOOST_HOF_TEST_CHECK(3 == (move_pipable(1, 2)));
  50. BOOST_HOF_TEST_CHECK(3 == (1 | move_pipable(2)));
  51. BOOST_HOF_TEST_CHECK(3 == (1 | boost::hof::pipable(move_class())(2)));
  52. BOOST_HOF_TEST_CHECK(3 == (boost::hof::pipable(move_class())(1, 2)));
  53. }
  54. BOOST_HOF_TEST_CASE()
  55. {
  56. void_pipable_constexpr(1);
  57. 1 | void_pipable_constexpr;
  58. BOOST_HOF_STATIC_TEST_CHECK(3 == (1 | binary_pipable_constexpr(2)));
  59. BOOST_HOF_STATIC_TEST_CHECK(3 == (binary_pipable_constexpr(1, 2)));
  60. BOOST_HOF_STATIC_TEST_CHECK(3 == (3 | unary_pipable_constexpr));
  61. BOOST_HOF_STATIC_TEST_CHECK(3 == (3 | unary_pipable_constexpr()));
  62. BOOST_HOF_STATIC_TEST_CHECK(3 == (unary_pipable_constexpr(3)));
  63. }
  64. BOOST_HOF_TEST_CASE()
  65. {
  66. BOOST_HOF_TEST_CHECK(3 == boost::hof::limit_c<2>(binary_pipable_constexpr)(1, 2));
  67. BOOST_HOF_STATIC_TEST_CHECK(3 == boost::hof::limit_c<2>(binary_pipable_constexpr)(1, 2));
  68. }
  69. BOOST_HOF_TEST_CASE()
  70. {
  71. auto f = boost::hof::pipable(boost::hof::limit_c<2>(binary_class()));
  72. static_assert(boost::hof::is_invocable<decltype(f), int, int>::value, "Passing the limit is not callable");
  73. static_assert(!boost::hof::is_invocable<decltype(f), int, int, int>::value, "Passing the limit is not callable");
  74. static_assert(!boost::hof::is_invocable<decltype(f), int, int, int, int>::value, "Passing the limit is not callable");
  75. }