always.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /*=============================================================================
  2. Copyright (c) 2017 Paul Fultz II
  3. always.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/always.hpp>
  8. #include <boost/hof/function.hpp>
  9. #include <memory>
  10. #include "test.hpp"
  11. BOOST_HOF_TEST_CASE()
  12. {
  13. static const int ten = 10;
  14. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::always(ten)(1,2,3,4,5) == 10);
  15. BOOST_HOF_TEST_CHECK( boost::hof::always(ten)(1,2,3,4,5) == 10 );
  16. int i = 10;
  17. BOOST_HOF_TEST_CHECK( boost::hof::always(std::ref(i))(1,2,3,4,5) == 10 );
  18. BOOST_HOF_TEST_CHECK( &boost::hof::always(std::ref(i))(1,2,3,4,5) == &i );
  19. boost::hof::always()(1, 2);
  20. static_assert(std::is_same<decltype(boost::hof::always()(1, 2)), BOOST_HOF_ALWAYS_VOID_RETURN>::value, "Failed");
  21. }
  22. BOOST_HOF_TEST_CASE()
  23. {
  24. int i = 10;
  25. BOOST_HOF_TEST_CHECK( boost::hof::always_ref(i)(1,2,3,4,5) == 10 );
  26. BOOST_HOF_TEST_CHECK( &boost::hof::always_ref(i)(1,2,3,4,5) == &i );
  27. }
  28. BOOST_HOF_STATIC_FUNCTION(gten) = boost::hof::always(std::integral_constant<int, 10>{});
  29. BOOST_HOF_TEST_CASE()
  30. {
  31. BOOST_HOF_STATIC_TEST_CHECK(gten(1,2,3,4,5) == 10);
  32. BOOST_HOF_TEST_CHECK(gten(1,2,3,4,5) == 10);
  33. }
  34. BOOST_HOF_TEST_CASE()
  35. {
  36. auto f = boost::hof::always(10);
  37. STATIC_ASSERT_NOT_DEFAULT_CONSTRUCTIBLE(decltype(f));
  38. BOOST_HOF_TEST_CHECK(f(1,2,3,4,5) == 10);
  39. }
  40. struct copy_throws
  41. {
  42. copy_throws() {}
  43. copy_throws(copy_throws const&) {}
  44. copy_throws(copy_throws&&) noexcept {}
  45. };
  46. BOOST_HOF_TEST_CASE()
  47. {
  48. static_assert(noexcept(boost::hof::always()()), "noexcept always");
  49. static_assert(noexcept(boost::hof::always(1)()), "noexcept always");
  50. static_assert(!noexcept(boost::hof::always(copy_throws{})()), "noexcept always");
  51. copy_throws ct{};
  52. static_assert(!noexcept(boost::hof::always(ct)()), "noexcept always");
  53. static_assert(noexcept(boost::hof::always(std::ref(ct))()) == BOOST_HOF_IS_NOTHROW_COPY_CONSTRUCTIBLE(std::reference_wrapper<copy_throws>), "noexcept always");
  54. auto ctf = boost::hof::always(copy_throws{});
  55. static_assert(!noexcept(ctf()), "noexcept always");
  56. }