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