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 BOOST_HOF_TEST_CASE()
13 {
14 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::identity(10) == 10);
15 BOOST_HOF_TEST_CHECK(boost::hof::identity(10) == 10);
16 }
17
BOOST_HOF_TEST_CASE()18 BOOST_HOF_TEST_CASE()
19 {
20 int i = 3;
21 BOOST_HOF_TEST_CHECK(boost::hof::identity(i) == 3);
22 BOOST_HOF_TEST_CHECK(&boost::hof::identity(i) == &i);
23 static_assert(std::is_lvalue_reference<decltype(boost::hof::identity(i))>::value, "Not lvalue");
24 static_assert(!std::is_lvalue_reference<decltype(boost::hof::identity(3))>::value, "Not rvalue");
25 }
26
BOOST_HOF_TEST_CASE()27 BOOST_HOF_TEST_CASE()
28 {
29 auto ls = boost::hof::identity({1, 2, 3, 4});
30 std::vector<int> v{1, 2, 3, 4};
31 BOOST_HOF_TEST_CHECK(std::equal(ls.begin(), ls.end(), v.begin()));
32 }
33
BOOST_HOF_TEST_CASE()34 BOOST_HOF_TEST_CASE()
35 {
36 BOOST_HOF_TEST_CHECK(std::vector<int>(boost::hof::identity({1, 2, 3})) == std::vector<int>{1, 2, 3});
37 }
38
BOOST_HOF_TEST_CASE()39 BOOST_HOF_TEST_CASE()
40 {
41 static_assert(boost::hof::is_invocable<decltype(boost::hof::identity), int>::value, "Identiy callable");
42 static_assert(!boost::hof::is_invocable<decltype(boost::hof::identity), int, int>::value, "Identiy not callable");
43 static_assert(!boost::hof::is_invocable<decltype(boost::hof::identity)>::value, "Identiy not callable");
44 }
45
BOOST_HOF_TEST_CASE()46 BOOST_HOF_TEST_CASE()
47 {
48 static_assert(noexcept(boost::hof::identity({1, 2, 3})), "Noexcept identity");
49 static_assert(noexcept(boost::hof::identity(1)), "Noexcept identity");
50 int i = 5;
51 static_assert(noexcept(boost::hof::identity(i)), "Noexcept identity");
52 }
53
54 struct copy_throws
55 {
copy_throwscopy_throws56 copy_throws() {}
copy_throwscopy_throws57 copy_throws(copy_throws const&) {}
copy_throwscopy_throws58 copy_throws(copy_throws&&) noexcept {}
59 };
60
BOOST_HOF_TEST_CASE()61 BOOST_HOF_TEST_CASE()
62 {
63 copy_throws ct{};
64 static_assert(noexcept(boost::hof::identity(ct)), "Noexcept identity");
65 static_assert(noexcept(boost::hof::identity(boost::hof::move(ct))), "Noexcept identity");
66 static_assert(!noexcept(boost::hof::identity(copy_throws{})), "Noexcept identity");
67 }
68
69