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 BOOST_HOF_TEST_CASE()
13 {
14 static const int ten = 10;
15 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::always(ten)(1,2,3,4,5) == 10);
16 BOOST_HOF_TEST_CHECK( boost::hof::always(ten)(1,2,3,4,5) == 10 );
17
18 int i = 10;
19 BOOST_HOF_TEST_CHECK( boost::hof::always(std::ref(i))(1,2,3,4,5) == 10 );
20 BOOST_HOF_TEST_CHECK( &boost::hof::always(std::ref(i))(1,2,3,4,5) == &i );
21
22 boost::hof::always()(1, 2);
23 static_assert(std::is_same<decltype(boost::hof::always()(1, 2)), BOOST_HOF_ALWAYS_VOID_RETURN>::value, "Failed");
24 }
25
BOOST_HOF_TEST_CASE()26 BOOST_HOF_TEST_CASE()
27 {
28 int i = 10;
29 BOOST_HOF_TEST_CHECK( boost::hof::always_ref(i)(1,2,3,4,5) == 10 );
30 BOOST_HOF_TEST_CHECK( &boost::hof::always_ref(i)(1,2,3,4,5) == &i );
31 }
32
33 BOOST_HOF_STATIC_FUNCTION(gten) = boost::hof::always(std::integral_constant<int, 10>{});
34
BOOST_HOF_TEST_CASE()35 BOOST_HOF_TEST_CASE()
36 {
37 BOOST_HOF_STATIC_TEST_CHECK(gten(1,2,3,4,5) == 10);
38 BOOST_HOF_TEST_CHECK(gten(1,2,3,4,5) == 10);
39 }
40
BOOST_HOF_TEST_CASE()41 BOOST_HOF_TEST_CASE()
42 {
43 auto f = boost::hof::always(10);
44 STATIC_ASSERT_NOT_DEFAULT_CONSTRUCTIBLE(decltype(f));
45 BOOST_HOF_TEST_CHECK(f(1,2,3,4,5) == 10);
46 }
47
48 struct copy_throws
49 {
copy_throwscopy_throws50 copy_throws() {}
copy_throwscopy_throws51 copy_throws(copy_throws const&) {}
copy_throwscopy_throws52 copy_throws(copy_throws&&) noexcept {}
53 };
54
BOOST_HOF_TEST_CASE()55 BOOST_HOF_TEST_CASE()
56 {
57 static_assert(noexcept(boost::hof::always()()), "noexcept always");
58 static_assert(noexcept(boost::hof::always(1)()), "noexcept always");
59 static_assert(!noexcept(boost::hof::always(copy_throws{})()), "noexcept always");
60 copy_throws ct{};
61 static_assert(!noexcept(boost::hof::always(ct)()), "noexcept always");
62 static_assert(noexcept(boost::hof::always(std::ref(ct))()) == BOOST_HOF_IS_NOTHROW_COPY_CONSTRUCTIBLE(std::reference_wrapper<copy_throws>), "noexcept always");
63 auto ctf = boost::hof::always(copy_throws{});
64 static_assert(!noexcept(ctf()), "noexcept always");
65 }
66