identity.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /*=============================================================================
  2. Copyright (c) 2017 Paul Fultz II
  3. identity.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/identity.hpp>
  8. #include <boost/hof/is_invocable.hpp>
  9. #include <boost/hof/detail/move.hpp>
  10. #include "test.hpp"
  11. BOOST_HOF_TEST_CASE()
  12. {
  13. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::identity(10) == 10);
  14. BOOST_HOF_TEST_CHECK(boost::hof::identity(10) == 10);
  15. }
  16. BOOST_HOF_TEST_CASE()
  17. {
  18. int i = 3;
  19. BOOST_HOF_TEST_CHECK(boost::hof::identity(i) == 3);
  20. BOOST_HOF_TEST_CHECK(&boost::hof::identity(i) == &i);
  21. static_assert(std::is_lvalue_reference<decltype(boost::hof::identity(i))>::value, "Not lvalue");
  22. static_assert(!std::is_lvalue_reference<decltype(boost::hof::identity(3))>::value, "Not rvalue");
  23. }
  24. BOOST_HOF_TEST_CASE()
  25. {
  26. auto ls = boost::hof::identity({1, 2, 3, 4});
  27. std::vector<int> v{1, 2, 3, 4};
  28. BOOST_HOF_TEST_CHECK(std::equal(ls.begin(), ls.end(), v.begin()));
  29. }
  30. BOOST_HOF_TEST_CASE()
  31. {
  32. BOOST_HOF_TEST_CHECK(std::vector<int>(boost::hof::identity({1, 2, 3})) == std::vector<int>{1, 2, 3});
  33. }
  34. BOOST_HOF_TEST_CASE()
  35. {
  36. static_assert(boost::hof::is_invocable<decltype(boost::hof::identity), int>::value, "Identiy callable");
  37. static_assert(!boost::hof::is_invocable<decltype(boost::hof::identity), int, int>::value, "Identiy not callable");
  38. static_assert(!boost::hof::is_invocable<decltype(boost::hof::identity)>::value, "Identiy not callable");
  39. }
  40. BOOST_HOF_TEST_CASE()
  41. {
  42. static_assert(noexcept(boost::hof::identity({1, 2, 3})), "Noexcept identity");
  43. static_assert(noexcept(boost::hof::identity(1)), "Noexcept identity");
  44. int i = 5;
  45. static_assert(noexcept(boost::hof::identity(i)), "Noexcept identity");
  46. }
  47. struct copy_throws
  48. {
  49. copy_throws() {}
  50. copy_throws(copy_throws const&) {}
  51. copy_throws(copy_throws&&) noexcept {}
  52. };
  53. BOOST_HOF_TEST_CASE()
  54. {
  55. copy_throws ct{};
  56. static_assert(noexcept(boost::hof::identity(ct)), "Noexcept identity");
  57. static_assert(noexcept(boost::hof::identity(boost::hof::move(ct))), "Noexcept identity");
  58. static_assert(!noexcept(boost::hof::identity(copy_throws{})), "Noexcept identity");
  59. }