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