• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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