1 /*=============================================================================
2 Copyright (c) 2017 Paul Fultz II
3 arg.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/arg.hpp>
8 #include <boost/hof/is_invocable.hpp>
9 #include <type_traits>
10 #include "test.hpp"
11
BOOST_HOF_TEST_CASE()12 BOOST_HOF_TEST_CASE()
13 {
14 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::arg_c<3>(1,2,3,4,5) == 3);
15 BOOST_HOF_TEST_CHECK( boost::hof::arg_c<3>(1,2,3,4,5) == 3 );
16 }
17
BOOST_HOF_TEST_CASE()18 BOOST_HOF_TEST_CASE()
19 {
20 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::arg(std::integral_constant<int, 3>())(1,2,3,4,5) == 3);
21 BOOST_HOF_TEST_CHECK( boost::hof::arg(std::integral_constant<int, 3>())(1,2,3,4,5) == 3 );
22 }
23
BOOST_HOF_TEST_CASE()24 BOOST_HOF_TEST_CASE()
25 {
26 auto at_3 = boost::hof::arg(std::integral_constant<int, 3>());
27 static_assert(boost::hof::is_invocable<decltype(at_3), int, int, int>::value, "Not SFINAE-friendly");
28 static_assert(!boost::hof::is_invocable<decltype(at_3), int, int>::value, "Not SFINAE-friendly");
29 static_assert(!boost::hof::is_invocable<decltype(at_3), int>::value, "Not SFINAE-friendly");
30 }
31
32 struct foo {};
33
BOOST_HOF_TEST_CASE()34 BOOST_HOF_TEST_CASE()
35 {
36 static_assert(!boost::hof::is_invocable<decltype(boost::hof::arg), int>::value, "Not sfinae friendly");
37 static_assert(!boost::hof::is_invocable<decltype(boost::hof::arg), foo>::value, "Not sfinae friendly");
38 }
39
40 struct copy_throws
41 {
copy_throwscopy_throws42 copy_throws() {}
copy_throwscopy_throws43 copy_throws(copy_throws const&) {}
copy_throwscopy_throws44 copy_throws(copy_throws&&) noexcept {}
45 };
46 #if BOOST_HOF_HAS_NOEXCEPT_DEDUCTION
BOOST_HOF_TEST_CASE()47 BOOST_HOF_TEST_CASE()
48 {
49 static_assert(noexcept(boost::hof::arg_c<3>(1,2,3,4,5)), "noexcept arg");
50 static_assert(noexcept(boost::hof::arg(std::integral_constant<int, 3>())(1,2,3,4,5)), "noexcept arg");
51 static_assert(!noexcept(boost::hof::arg(std::integral_constant<int, 3>())(1,2,copy_throws{},4,5)), "noexcept arg");
52 }
53 #endif
54