arg.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. /*=============================================================================
  2. Copyright (c) 2017 Paul Fultz II
  3. arg.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/arg.hpp>
  8. #include <boost/hof/is_invocable.hpp>
  9. #include <type_traits>
  10. #include "test.hpp"
  11. BOOST_HOF_TEST_CASE()
  12. {
  13. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::arg_c<3>(1,2,3,4,5) == 3);
  14. BOOST_HOF_TEST_CHECK( boost::hof::arg_c<3>(1,2,3,4,5) == 3 );
  15. }
  16. BOOST_HOF_TEST_CASE()
  17. {
  18. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::arg(std::integral_constant<int, 3>())(1,2,3,4,5) == 3);
  19. BOOST_HOF_TEST_CHECK( boost::hof::arg(std::integral_constant<int, 3>())(1,2,3,4,5) == 3 );
  20. }
  21. BOOST_HOF_TEST_CASE()
  22. {
  23. auto at_3 = boost::hof::arg(std::integral_constant<int, 3>());
  24. static_assert(boost::hof::is_invocable<decltype(at_3), int, int, int>::value, "Not SFINAE-friendly");
  25. static_assert(!boost::hof::is_invocable<decltype(at_3), int, int>::value, "Not SFINAE-friendly");
  26. static_assert(!boost::hof::is_invocable<decltype(at_3), int>::value, "Not SFINAE-friendly");
  27. }
  28. struct foo {};
  29. BOOST_HOF_TEST_CASE()
  30. {
  31. static_assert(!boost::hof::is_invocable<decltype(boost::hof::arg), int>::value, "Not sfinae friendly");
  32. static_assert(!boost::hof::is_invocable<decltype(boost::hof::arg), foo>::value, "Not sfinae friendly");
  33. }
  34. struct copy_throws
  35. {
  36. copy_throws() {}
  37. copy_throws(copy_throws const&) {}
  38. copy_throws(copy_throws&&) noexcept {}
  39. };
  40. #if BOOST_HOF_HAS_NOEXCEPT_DEDUCTION
  41. BOOST_HOF_TEST_CASE()
  42. {
  43. static_assert(noexcept(boost::hof::arg_c<3>(1,2,3,4,5)), "noexcept arg");
  44. static_assert(noexcept(boost::hof::arg(std::integral_constant<int, 3>())(1,2,3,4,5)), "noexcept arg");
  45. static_assert(!noexcept(boost::hof::arg(std::integral_constant<int, 3>())(1,2,copy_throws{},4,5)), "noexcept arg");
  46. }
  47. #endif