/*============================================================================= Copyright (c) 2017 Paul Fultz II if.cpp Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include #include "test.hpp" #include #include struct is_5 { template constexpr bool operator()(T i) const { return i == 5; } }; struct is_not_5 { template constexpr bool operator()(T i) const { return i != 5; } }; template struct test_int { template constexpr bool operator()(T x) const { return boost::hof::first_of( boost::hof::if_(std::is_integral())(F()), boost::hof::always(true) )(x); } }; BOOST_HOF_TEST_CASE() { BOOST_HOF_TEST_CHECK(test_int()(5)); BOOST_HOF_TEST_CHECK(test_int()(5L)); BOOST_HOF_TEST_CHECK(test_int()(5.0)); BOOST_HOF_TEST_CHECK(test_int()(6.0)); BOOST_HOF_TEST_CHECK(test_int()(6)); BOOST_HOF_TEST_CHECK(test_int()(6L)); BOOST_HOF_TEST_CHECK(test_int()(5.0)); BOOST_HOF_TEST_CHECK(test_int()(6.0)); BOOST_HOF_STATIC_TEST_CHECK(test_int()(5)); BOOST_HOF_STATIC_TEST_CHECK(test_int()(5L)); BOOST_HOF_STATIC_TEST_CHECK(test_int()(5.0)); BOOST_HOF_STATIC_TEST_CHECK(test_int()(6.0)); BOOST_HOF_STATIC_TEST_CHECK(test_int()(6)); BOOST_HOF_STATIC_TEST_CHECK(test_int()(6L)); BOOST_HOF_STATIC_TEST_CHECK(test_int()(5.0)); BOOST_HOF_STATIC_TEST_CHECK(test_int()(6.0)); } template struct test_int_c { template constexpr bool operator()(T x) const { return boost::hof::first_of( boost::hof::if_c::value>(F()), boost::hof::always(true) )(x); } }; BOOST_HOF_TEST_CASE() { BOOST_HOF_TEST_CHECK(test_int_c()(5)); BOOST_HOF_TEST_CHECK(test_int_c()(5L)); BOOST_HOF_TEST_CHECK(test_int_c()(5.0)); BOOST_HOF_TEST_CHECK(test_int_c()(6.0)); BOOST_HOF_TEST_CHECK(test_int_c()(6)); BOOST_HOF_TEST_CHECK(test_int_c()(6L)); BOOST_HOF_TEST_CHECK(test_int_c()(5.0)); BOOST_HOF_TEST_CHECK(test_int_c()(6.0)); BOOST_HOF_STATIC_TEST_CHECK(test_int_c()(5)); BOOST_HOF_STATIC_TEST_CHECK(test_int_c()(5L)); BOOST_HOF_STATIC_TEST_CHECK(test_int_c()(5.0)); BOOST_HOF_STATIC_TEST_CHECK(test_int_c()(6.0)); BOOST_HOF_STATIC_TEST_CHECK(test_int_c()(6)); BOOST_HOF_STATIC_TEST_CHECK(test_int_c()(6L)); BOOST_HOF_STATIC_TEST_CHECK(test_int_c()(5.0)); BOOST_HOF_STATIC_TEST_CHECK(test_int_c()(6.0)); } struct sum_f { template constexpr int operator()(T x, T y) const { return boost::hof::first_of( boost::hof::if_(std::is_integral())(boost::hof::_ + boost::hof::_), boost::hof::always(0) )(x, y); } }; BOOST_HOF_TEST_CASE() { BOOST_HOF_TEST_CHECK(sum_f()(1, 2) == 3); BOOST_HOF_TEST_CHECK(sum_f()(1.0, 2.0) == 0); BOOST_HOF_TEST_CHECK(sum_f()("", "") == 0); BOOST_HOF_STATIC_TEST_CHECK(sum_f()(1, 2) == 3); BOOST_HOF_STATIC_TEST_CHECK(sum_f()("", "") == 0); } struct sum_f_c { template constexpr int operator()(T x, T y) const { return boost::hof::first_of( boost::hof::if_c::value>(boost::hof::_ + boost::hof::_), boost::hof::always(0) )(x, y); } }; BOOST_HOF_TEST_CASE() { BOOST_HOF_TEST_CHECK(sum_f_c()(1, 2) == 3); BOOST_HOF_TEST_CHECK(sum_f_c()(1.0, 2.0) == 0); BOOST_HOF_TEST_CHECK(sum_f_c()("", "") == 0); BOOST_HOF_STATIC_TEST_CHECK(sum_f_c()(1, 2) == 3); BOOST_HOF_STATIC_TEST_CHECK(sum_f_c()("", "") == 0); } #if BOOST_HOF_HAS_NOEXCEPT_DEDUCTION BOOST_HOF_TEST_CASE() { static_assert(noexcept(boost::hof::if_(std::is_integral())(boost::hof::identity)(1)), "noexcept if"); } #endif