// // blocking_adaptation.cpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // 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) // // Disable autolinking for unit tests. #if !defined(BOOST_ALL_NO_LIB) #define BOOST_ALL_NO_LIB 1 #endif // !defined(BOOST_ALL_NO_LIB) // Test that header file is self-contained. #include "asio/execution/blocking_adaptation.hpp" #include "asio/prefer.hpp" #include "asio/query.hpp" #include "asio/require.hpp" #include "../unit_test.hpp" namespace exec = asio::execution; typedef exec::blocking_adaptation_t s; typedef exec::blocking_adaptation_t::disallowed_t n1; typedef exec::blocking_adaptation_t::allowed_t n2; struct ex_nq_nr { template void execute(const F&) const { } friend bool operator==(const ex_nq_nr&, const ex_nq_nr&) noexcept { return true; } friend bool operator!=(const ex_nq_nr&, const ex_nq_nr&) noexcept { return false; } }; namespace asio { namespace traits { #if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) template <> struct equality_comparable { static constexpr bool is_valid = true; static constexpr bool is_noexcept = true; }; #endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) #if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) template struct execute_member { static constexpr bool is_valid = true; static constexpr bool is_noexcept = false; typedef void result_type; }; #endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) } // namespace traits } // namespace asio template struct ex_cq_nr { static constexpr ResultType query(ParamType) noexcept { return Result(); } template void execute(const F&) const { } friend bool operator==(const ex_cq_nr&, const ex_cq_nr&) noexcept { return true; } friend bool operator!=(const ex_cq_nr&, const ex_cq_nr&) noexcept { return false; } }; namespace asio { namespace traits { #if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) template struct equality_comparable > { static constexpr bool is_valid = true; static constexpr bool is_noexcept = true; }; #endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) #if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) template struct execute_member, Function> { static constexpr bool is_valid = true; static constexpr bool is_noexcept = false; typedef void result_type; }; #endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) #if !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT) template struct query_static_constexpr_member< ex_cq_nr, Param, typename asio::enable_if< asio::is_convertible::value >::type> { static constexpr bool is_valid = true; static constexpr bool is_noexcept = true; typedef Result result_type; // Must return raw result type. static constexpr result_type value() { return Result(); } }; #endif // !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT) } // namespace traits } // namespace asio template struct ex_mq_nr { ResultType query(ParamType) const noexcept { return Result(); } template void execute(const F&) const { } friend bool operator==(const ex_mq_nr&, const ex_mq_nr&) noexcept { return true; } friend bool operator!=(const ex_mq_nr&, const ex_mq_nr&) noexcept { return false; } }; namespace asio { namespace traits { #if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) template struct equality_comparable > { static constexpr bool is_valid = true; static constexpr bool is_noexcept = true; }; #endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) #if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) template struct execute_member, Function> { static constexpr bool is_valid = true; static constexpr bool is_noexcept = false; typedef void result_type; }; #endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) #if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT) template struct query_member< ex_mq_nr, Param, typename asio::enable_if< asio::is_convertible::value >::type> { static constexpr bool is_valid = true; static constexpr bool is_noexcept = true; typedef ResultType result_type; }; #endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT) } // namespace traits } // namespace asio template struct ex_fq_nr { friend ResultType query(const ex_fq_nr&, ParamType) noexcept { return Result(); } template void execute(const F&) const { } friend bool operator==(const ex_fq_nr&, const ex_fq_nr&) noexcept { return true; } friend bool operator!=(const ex_fq_nr&, const ex_fq_nr&) noexcept { return false; } }; namespace asio { namespace traits { #if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) template struct equality_comparable > { static constexpr bool is_valid = true; static constexpr bool is_noexcept = true; }; #endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) #if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) template struct execute_member, Function> { static constexpr bool is_valid = true; static constexpr bool is_noexcept = false; typedef void result_type; }; #endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) #if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT) template struct query_free< ex_fq_nr, Param, typename asio::enable_if< asio::is_convertible::value >::type> { static constexpr bool is_valid = true; static constexpr bool is_noexcept = true; typedef ResultType result_type; }; #endif // !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT) } // namespace traits } // namespace asio template struct ex_mq_mr { CurrentType query(CurrentType) const noexcept { return CurrentType(); } CurrentType query(OtherType) const noexcept { return CurrentType(); } ex_mq_mr require( CurrentType) const noexcept { return ex_mq_mr(); } ex_mq_mr require( OtherType) const noexcept { return ex_mq_mr(); } template void execute(const F&) const { } friend bool operator==(const ex_mq_mr&, const ex_mq_mr&) noexcept { return true; } friend bool operator!=(const ex_mq_mr&, const ex_mq_mr&) noexcept { return false; } }; template struct ex_mq_mr { CurrentType query(CurrentType) const noexcept { return CurrentType(); } ex_mq_mr require( CurrentType) const noexcept { return ex_mq_mr(); } template void execute(const F&) const { } friend bool operator==(const ex_mq_mr&, const ex_mq_mr&) noexcept { return true; } friend bool operator!=(const ex_mq_mr&, const ex_mq_mr&) noexcept { return false; } }; namespace asio { namespace traits { #if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) template struct equality_comparable > { static constexpr bool is_valid = true; static constexpr bool is_noexcept = true; }; #endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) #if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) template struct execute_member, Function> { static constexpr bool is_valid = true; static constexpr bool is_noexcept = false; typedef void result_type; }; #endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) #if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT) template struct query_member< ex_mq_mr, Param, typename asio::enable_if< asio::is_convertible::value || asio::is_convertible::value >::type> { static constexpr bool is_valid = true; static constexpr bool is_noexcept = true; typedef CurrentType result_type; }; #endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT) #if !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT) template struct require_member< ex_mq_mr, Param, typename asio::enable_if< asio::is_convertible::value >::type> { static constexpr bool is_valid = true; static constexpr bool is_noexcept = true; typedef ex_mq_mr result_type; }; template struct require_member< ex_mq_mr, Param, typename asio::enable_if< asio::is_convertible::value && !asio::is_same::value >::type> { static constexpr bool is_valid = true; static constexpr bool is_noexcept = true; typedef ex_mq_mr result_type; }; #endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT) } // namespace traits } // namespace asio template struct ex_fq_fr { friend CurrentType query(const ex_fq_fr&, CurrentType) noexcept { return CurrentType(); } friend CurrentType query(const ex_fq_fr&, OtherType) noexcept { return CurrentType(); } friend ex_fq_fr require( const ex_fq_fr&, CurrentType) noexcept { return ex_fq_fr(); } friend ex_fq_fr require( const ex_fq_fr&, OtherType) noexcept { return ex_fq_fr(); } friend ex_fq_fr prefer( const ex_fq_fr&, CurrentType) noexcept { return ex_fq_fr(); } friend ex_fq_fr prefer( const ex_fq_fr&, OtherType) noexcept { return ex_fq_fr(); } template void execute(const F&) const { } friend bool operator==(const ex_fq_fr&, const ex_fq_fr&) noexcept { return true; } friend bool operator!=(const ex_fq_fr&, const ex_fq_fr&) noexcept { return false; } }; template struct ex_fq_fr { friend CurrentType query(const ex_fq_fr&, CurrentType) noexcept { return CurrentType(); } friend ex_fq_fr require( const ex_fq_fr&, CurrentType) noexcept { return ex_fq_fr(); } friend ex_fq_fr prefer( const ex_fq_fr&, CurrentType) noexcept { return ex_fq_fr(); } template void execute(const F&) const { } friend bool operator==(const ex_fq_fr&, const ex_fq_fr&) noexcept { return true; } friend bool operator!=(const ex_fq_fr&, const ex_fq_fr&) noexcept { return false; } }; namespace asio { namespace traits { #if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) template struct equality_comparable > { static constexpr bool is_valid = true; static constexpr bool is_noexcept = true; }; #endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) #if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) template struct execute_member, Function> { static constexpr bool is_valid = true; static constexpr bool is_noexcept = false; typedef void result_type; }; #endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) #if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT) template struct query_free< ex_fq_fr, Param, typename asio::enable_if< asio::is_convertible::value || asio::is_convertible::value >::type> { static constexpr bool is_valid = true; static constexpr bool is_noexcept = true; typedef CurrentType result_type; }; #endif // !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT) #if !defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT) template struct require_free< ex_fq_fr, Param, typename asio::enable_if< asio::is_convertible::value >::type> { static constexpr bool is_valid = true; static constexpr bool is_noexcept = true; typedef ex_fq_fr result_type; }; template struct require_free< ex_fq_fr, Param, typename asio::enable_if< asio::is_convertible::value && !asio::is_same::value >::type> { static constexpr bool is_valid = true; static constexpr bool is_noexcept = true; typedef ex_fq_fr result_type; }; #endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT) #if !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT) template struct prefer_free< ex_fq_fr, Param, typename asio::enable_if< asio::is_convertible::value >::type> { static constexpr bool is_valid = true; static constexpr bool is_noexcept = true; typedef ex_fq_fr result_type; }; template struct prefer_free< ex_fq_fr, Param, typename asio::enable_if< asio::is_convertible::value && !asio::is_same::value >::type> { static constexpr bool is_valid = true; static constexpr bool is_noexcept = true; typedef ex_fq_fr result_type; }; #endif // !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT) } // namespace traits } // namespace asio template void test_can_query() { constexpr bool b1 = asio::can_query::value; ASIO_CHECK(b1 == ExpectedResult); constexpr bool b2 = asio::can_query::value; ASIO_CHECK(b2 == ExpectedResult); constexpr bool b3 = asio::can_query::value; ASIO_CHECK(b3 == ExpectedResult); constexpr bool b4 = asio::can_query::value; ASIO_CHECK(b4 == ExpectedResult); } template void test_query() { exec::blocking_adaptation_t result1 = asio::query(Executor(), Param()); ASIO_CHECK(result1 == ExpectedResult()); Executor ex1 = {}; exec::blocking_adaptation_t result2 = asio::query(ex1, Param()); ASIO_CHECK(result2 == ExpectedResult()); const Executor ex2 = {}; exec::blocking_adaptation_t result3 = asio::query(ex2, Param()); ASIO_CHECK(result3 == ExpectedResult()); } template void test_constexpr_query() { constexpr Executor ex1 = {}; constexpr exec::blocking_adaptation_t result1 = asio::query(ex1, Param()); ASIO_CHECK(result1 == ExpectedResult()); } template void test_can_require() { constexpr bool b1 = asio::can_require::value; ASIO_CHECK(b1 == ExpectedResult); constexpr bool b2 = asio::can_require::value; ASIO_CHECK(b2 == ExpectedResult); constexpr bool b3 = asio::can_require::value; ASIO_CHECK(b3 == ExpectedResult); constexpr bool b4 = asio::can_require::value; ASIO_CHECK(b4 == ExpectedResult); } void do_nothing() { } template void test_require() { ASIO_CHECK( asio::query( asio::require(Executor(), Param()), Param()) == ExpectedResult()); Executor ex1 = {}; ASIO_CHECK( asio::query( asio::require(ex1, Param()), Param()) == ExpectedResult()); ASIO_CHECK(( asio::execution::is_executor< typename asio::decay< typename asio::require_result::type >::type >::value)); const Executor ex2 = {}; ASIO_CHECK( asio::query( asio::require(ex2, Param()), Param()) == ExpectedResult()); ASIO_CHECK(( asio::execution::is_executor< typename asio::decay< typename asio::require_result::type >::type >::value)); } template void test_can_prefer() { constexpr bool b1 = asio::can_prefer::value; ASIO_CHECK(b1 == ExpectedResult); constexpr bool b2 = asio::can_prefer::value; ASIO_CHECK(b2 == ExpectedResult); constexpr bool b3 = asio::can_prefer::value; ASIO_CHECK(b3 == ExpectedResult); constexpr bool b4 = asio::can_prefer::value; ASIO_CHECK(b4 == ExpectedResult); } template void test_prefer() { ASIO_CHECK( s(asio::query( asio::prefer(Executor(), Param()), s())) == s(ExpectedResult())); Executor ex1 = {}; ASIO_CHECK( s(asio::query( asio::prefer(ex1, Param()), s())) == s(ExpectedResult())); const Executor ex2 = {}; ASIO_CHECK( s(asio::query( asio::prefer(ex2, Param()), s())) == s(ExpectedResult())); } void test_vars() { ASIO_CHECK(s() == exec::blocking_adaptation); ASIO_CHECK(s() != exec::blocking_adaptation.disallowed); ASIO_CHECK(s() != exec::blocking_adaptation.allowed); ASIO_CHECK(n1() == exec::blocking_adaptation.disallowed); ASIO_CHECK(n1() != exec::blocking_adaptation.allowed); ASIO_CHECK(n2() == exec::blocking_adaptation.allowed); ASIO_CHECK(n2() != exec::blocking_adaptation.disallowed); } ASIO_TEST_SUITE ( "blocking_adaptation", ASIO_TEST_CASE3(test_can_query) ASIO_TEST_CASE3(test_can_query) ASIO_TEST_CASE3(test_can_query) ASIO_TEST_CASE3(test_query) ASIO_TEST_CASE3(test_query) ASIO_TEST_CASE3(test_constexpr_query) ASIO_TEST_CASE3(test_constexpr_query) ASIO_TEST_CASE3(test_can_require) ASIO_TEST_CASE3(test_can_require) ASIO_TEST_CASE3(test_can_require) ASIO_TEST_CASE3(test_require) ASIO_TEST_CASE3(test_require) ASIO_TEST_CASE3(test_can_prefer) ASIO_TEST_CASE3(test_can_prefer) ASIO_TEST_CASE3(test_can_prefer) ASIO_TEST_CASE3(test_prefer) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, true>) ASIO_TEST_CASE5(test_can_query, n2, true>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, true>) ASIO_TEST_CASE5(test_can_query, n2, true>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, true>) ASIO_TEST_CASE5(test_can_query, n2, false>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, true>) ASIO_TEST_CASE5(test_can_query, n2, false>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, false>) ASIO_TEST_CASE5(test_can_query, n2, true>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, false>) ASIO_TEST_CASE5(test_can_query, n2, true>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, true>) ASIO_TEST_CASE5(test_can_query, n2, true>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, true>) ASIO_TEST_CASE5(test_can_query, n2, true>) ASIO_TEST_CASE5(test_query, s, n1>) ASIO_TEST_CASE5(test_query, n1, n1>) ASIO_TEST_CASE5(test_query, n2, n1>) ASIO_TEST_CASE5(test_query, s, n2>) ASIO_TEST_CASE5(test_query, n1, n2>) ASIO_TEST_CASE5(test_query, n2, n2>) ASIO_TEST_CASE5(test_query, s, n1>) ASIO_TEST_CASE5(test_query, n1, n1>) ASIO_TEST_CASE5(test_query, s, n2>) ASIO_TEST_CASE5(test_query, n1, n2>) ASIO_TEST_CASE5(test_query, s, n1>) ASIO_TEST_CASE5(test_query, n2, n1>) ASIO_TEST_CASE5(test_query, s, n2>) ASIO_TEST_CASE5(test_query, n2, n2>) ASIO_TEST_CASE5(test_query, s, n1>) ASIO_TEST_CASE5(test_query, n1, n1>) ASIO_TEST_CASE5(test_query, n2, n1>) ASIO_TEST_CASE5(test_query, s, n2>) ASIO_TEST_CASE5(test_query, n1, n2>) ASIO_TEST_CASE5(test_query, n2, n2>) ASIO_TEST_CASE5(test_constexpr_query, s, n1>) ASIO_TEST_CASE5(test_constexpr_query, n1, n1>) ASIO_TEST_CASE5(test_constexpr_query, n2, n1>) ASIO_TEST_CASE5(test_constexpr_query, s, n2>) ASIO_TEST_CASE5(test_constexpr_query, n1, n2>) ASIO_TEST_CASE5(test_constexpr_query, n2, n2>) ASIO_TEST_CASE5(test_constexpr_query, s, n1>) ASIO_TEST_CASE5(test_constexpr_query, n1, n1>) ASIO_TEST_CASE5(test_constexpr_query, s, n2>) ASIO_TEST_CASE5(test_constexpr_query, n1, n2>) ASIO_TEST_CASE5(test_constexpr_query, s, n1>) ASIO_TEST_CASE5(test_constexpr_query, n2, n1>) ASIO_TEST_CASE5(test_constexpr_query, s, n2>) ASIO_TEST_CASE5(test_constexpr_query, n2, n2>) ASIO_TEST_CASE5(test_constexpr_query, s, n1>) ASIO_TEST_CASE5(test_constexpr_query, n1, n1>) ASIO_TEST_CASE5(test_constexpr_query, n2, n1>) ASIO_TEST_CASE5(test_constexpr_query, s, n2>) ASIO_TEST_CASE5(test_constexpr_query, n1, n2>) ASIO_TEST_CASE5(test_constexpr_query, n2, n2>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, true>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, false>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, true>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, false>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, false>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, false>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, true>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, false>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_require, n1, n1>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_require, n1, n1>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_require, n1, n1>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_prefer, n1, n1>) ASIO_TEST_CASE5(test_prefer, n1, n2>) ASIO_TEST_CASE5(test_prefer, n1, n1>) ASIO_TEST_CASE5(test_prefer, n1, n2>) ASIO_TEST_CASE5(test_prefer, n1, n1>) ASIO_TEST_CASE5(test_prefer, n1, n2>) ASIO_TEST_CASE5(test_prefer, n1, n1>) ASIO_TEST_CASE5(test_prefer, n1, n2>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, true>) ASIO_TEST_CASE5(test_can_query, n2, true>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, true>) ASIO_TEST_CASE5(test_can_query, n2, true>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, true>) ASIO_TEST_CASE5(test_can_query, n2, false>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, true>) ASIO_TEST_CASE5(test_can_query, n2, false>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, false>) ASIO_TEST_CASE5(test_can_query, n2, true>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, false>) ASIO_TEST_CASE5(test_can_query, n2, true>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, true>) ASIO_TEST_CASE5(test_can_query, n2, true>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, true>) ASIO_TEST_CASE5(test_can_query, n2, true>) ASIO_TEST_CASE5(test_query, s, n1>) ASIO_TEST_CASE5(test_query, n1, n1>) ASIO_TEST_CASE5(test_query, n2, n1>) ASIO_TEST_CASE5(test_query, s, n2>) ASIO_TEST_CASE5(test_query, n1, n2>) ASIO_TEST_CASE5(test_query, n2, n2>) ASIO_TEST_CASE5(test_query, s, n1>) ASIO_TEST_CASE5(test_query, n1, n1>) ASIO_TEST_CASE5(test_query, s, n2>) ASIO_TEST_CASE5(test_query, n1, n2>) ASIO_TEST_CASE5(test_query, s, n1>) ASIO_TEST_CASE5(test_query, n2, n1>) ASIO_TEST_CASE5(test_query, s, n2>) ASIO_TEST_CASE5(test_query, n2, n2>) ASIO_TEST_CASE5(test_query, s, n1>) ASIO_TEST_CASE5(test_query, n1, n1>) ASIO_TEST_CASE5(test_query, n2, n1>) ASIO_TEST_CASE5(test_query, s, n2>) ASIO_TEST_CASE5(test_query, n1, n2>) ASIO_TEST_CASE5(test_query, n2, n2>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, false>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, false>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, false>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, false>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, false>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, false>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, false>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, false>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_prefer, n1, n1>) ASIO_TEST_CASE5(test_prefer, n1, n2>) ASIO_TEST_CASE5(test_prefer, n1, n1>) ASIO_TEST_CASE5(test_prefer, n1, n2>) ASIO_TEST_CASE5(test_prefer, n1, n1>) ASIO_TEST_CASE5(test_prefer, n1, n2>) ASIO_TEST_CASE5(test_prefer, n1, n1>) ASIO_TEST_CASE5(test_prefer, n1, n2>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, true>) ASIO_TEST_CASE5(test_can_query, n2, true>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, true>) ASIO_TEST_CASE5(test_can_query, n2, true>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, true>) ASIO_TEST_CASE5(test_can_query, n2, false>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, true>) ASIO_TEST_CASE5(test_can_query, n2, false>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, false>) ASIO_TEST_CASE5(test_can_query, n2, true>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, false>) ASIO_TEST_CASE5(test_can_query, n2, true>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, true>) ASIO_TEST_CASE5(test_can_query, n2, true>) ASIO_TEST_CASE5(test_can_query, s, true>) ASIO_TEST_CASE5(test_can_query, n1, true>) ASIO_TEST_CASE5(test_can_query, n2, true>) ASIO_TEST_CASE5(test_query, s, n1>) ASIO_TEST_CASE5(test_query, n1, n1>) ASIO_TEST_CASE5(test_query, n2, n1>) ASIO_TEST_CASE5(test_query, s, n2>) ASIO_TEST_CASE5(test_query, n1, n2>) ASIO_TEST_CASE5(test_query, n2, n2>) ASIO_TEST_CASE5(test_query, s, n1>) ASIO_TEST_CASE5(test_query, n1, n1>) ASIO_TEST_CASE5(test_query, s, n2>) ASIO_TEST_CASE5(test_query, n1, n2>) ASIO_TEST_CASE5(test_query, s, n1>) ASIO_TEST_CASE5(test_query, n2, n1>) ASIO_TEST_CASE5(test_query, s, n2>) ASIO_TEST_CASE5(test_query, n2, n2>) ASIO_TEST_CASE5(test_query, s, n1>) ASIO_TEST_CASE5(test_query, n1, n1>) ASIO_TEST_CASE5(test_query, n2, n1>) ASIO_TEST_CASE5(test_query, s, n2>) ASIO_TEST_CASE5(test_query, n1, n2>) ASIO_TEST_CASE5(test_query, n2, n2>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, false>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, false>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, false>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, false>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, false>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, false>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, false>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_can_require, s, false>) ASIO_TEST_CASE5(test_can_require, n1, false>) ASIO_TEST_CASE5(test_can_require, n2, true>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_require, n2, n2>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_can_prefer, s, false>) ASIO_TEST_CASE5(test_can_prefer, n1, true>) ASIO_TEST_CASE5(test_can_prefer, n2, false>) ASIO_TEST_CASE5(test_prefer, n1, n1>) ASIO_TEST_CASE5(test_prefer, n1, n2>) ASIO_TEST_CASE5(test_prefer, n1, n1>) ASIO_TEST_CASE5(test_prefer, n1, n2>) ASIO_TEST_CASE5(test_prefer, n1, n1>) ASIO_TEST_CASE5(test_prefer, n1, n2>) ASIO_TEST_CASE5(test_prefer, n1, n1>) ASIO_TEST_CASE5(test_prefer, n1, n2>) ASIO_TEST_CASE4(test_can_query, s, true>) ASIO_TEST_CASE4(test_can_query, n1, true>) ASIO_TEST_CASE4(test_can_query, n2, false>) ASIO_TEST_CASE4(test_can_query, s, true>) ASIO_TEST_CASE4(test_can_query, n1, true>) ASIO_TEST_CASE4(test_can_query, n2, true>) ASIO_TEST_CASE4(test_can_query, s, true>) ASIO_TEST_CASE4(test_can_query, n1, true>) ASIO_TEST_CASE4(test_can_query, n2, true>) ASIO_TEST_CASE4(test_can_query, s, true>) ASIO_TEST_CASE4(test_can_query, n1, false>) ASIO_TEST_CASE4(test_can_query, n2, true>) ASIO_TEST_CASE4(test_query, s, n1>) ASIO_TEST_CASE4(test_query, n1, n1>) ASIO_TEST_CASE4(test_query, s, n1>) ASIO_TEST_CASE4(test_query, n1, n1>) ASIO_TEST_CASE4(test_query, s, n2>) ASIO_TEST_CASE4(test_query, n2, n2>) ASIO_TEST_CASE4(test_query, s, n2>) ASIO_TEST_CASE4(test_query, n2, n2>) ASIO_TEST_CASE4(test_can_require, s, false>) ASIO_TEST_CASE4(test_can_require, n1, true>) ASIO_TEST_CASE4(test_can_require, n2, true>) ASIO_TEST_CASE4(test_can_require, s, false>) ASIO_TEST_CASE4(test_can_require, n1, true>) ASIO_TEST_CASE4(test_can_require, n2, true>) ASIO_TEST_CASE4(test_can_require, s, false>) ASIO_TEST_CASE4(test_can_require, n1, true>) ASIO_TEST_CASE4(test_can_require, n2, true>) ASIO_TEST_CASE4(test_can_require, s, false>) ASIO_TEST_CASE4(test_can_require, n1, false>) ASIO_TEST_CASE4(test_can_require, n2, true>) ASIO_TEST_CASE4(test_require, n1, n1>) ASIO_TEST_CASE4(test_require, n2, n2>) ASIO_TEST_CASE4(test_require, n1, n1>) ASIO_TEST_CASE4(test_require, n2, n2>) ASIO_TEST_CASE4(test_require, n1, n1>) ASIO_TEST_CASE4(test_require, n2, n2>) ASIO_TEST_CASE4(test_require, n2, n2>) ASIO_TEST_CASE4(test_can_prefer, s, false>) ASIO_TEST_CASE4(test_can_prefer, n1, true>) ASIO_TEST_CASE4(test_can_prefer, n2, false>) ASIO_TEST_CASE4(test_can_prefer, s, false>) ASIO_TEST_CASE4(test_can_prefer, n1, true>) ASIO_TEST_CASE4(test_can_prefer, n2, false>) ASIO_TEST_CASE4(test_can_prefer, s, false>) ASIO_TEST_CASE4(test_can_prefer, n1, true>) ASIO_TEST_CASE4(test_can_prefer, n2, false>) ASIO_TEST_CASE4(test_can_prefer, s, false>) ASIO_TEST_CASE4(test_can_prefer, n1, true>) ASIO_TEST_CASE4(test_can_prefer, n2, false>) ASIO_TEST_CASE4(test_prefer, n1, n1>) ASIO_TEST_CASE4(test_prefer, n1, n1>) ASIO_TEST_CASE4(test_prefer, n1, n1>) ASIO_TEST_CASE4(test_prefer, n1, n2>) ASIO_TEST_CASE4(test_can_query, s, true>) ASIO_TEST_CASE4(test_can_query, n1, true>) ASIO_TEST_CASE4(test_can_query, n2, false>) ASIO_TEST_CASE4(test_can_query, s, true>) ASIO_TEST_CASE4(test_can_query, n1, true>) ASIO_TEST_CASE4(test_can_query, n2, true>) ASIO_TEST_CASE4(test_can_query, s, true>) ASIO_TEST_CASE4(test_can_query, n1, true>) ASIO_TEST_CASE4(test_can_query, n2, true>) ASIO_TEST_CASE4(test_can_query, s, true>) ASIO_TEST_CASE4(test_can_query, n1, false>) ASIO_TEST_CASE4(test_can_query, n2, true>) ASIO_TEST_CASE4(test_query, s, n1>) ASIO_TEST_CASE4(test_query, n1, n1>) ASIO_TEST_CASE4(test_query, s, n1>) ASIO_TEST_CASE4(test_query, n1, n1>) ASIO_TEST_CASE4(test_query, s, n2>) ASIO_TEST_CASE4(test_query, n2, n2>) ASIO_TEST_CASE4(test_query, s, n2>) ASIO_TEST_CASE4(test_query, n2, n2>) ASIO_TEST_CASE4(test_can_require, s, false>) ASIO_TEST_CASE4(test_can_require, n1, true>) ASIO_TEST_CASE4(test_can_require, n2, true>) ASIO_TEST_CASE4(test_can_require, s, false>) ASIO_TEST_CASE4(test_can_require, n1, true>) ASIO_TEST_CASE4(test_can_require, n2, true>) ASIO_TEST_CASE4(test_can_require, s, false>) ASIO_TEST_CASE4(test_can_require, n1, true>) ASIO_TEST_CASE4(test_can_require, n2, true>) ASIO_TEST_CASE4(test_can_require, s, false>) ASIO_TEST_CASE4(test_can_require, n1, false>) ASIO_TEST_CASE4(test_can_require, n2, true>) ASIO_TEST_CASE4(test_require, n1, n1>) ASIO_TEST_CASE4(test_require, n2, n2>) ASIO_TEST_CASE4(test_require, n1, n1>) ASIO_TEST_CASE4(test_require, n2, n2>) ASIO_TEST_CASE4(test_require, n1, n1>) ASIO_TEST_CASE4(test_require, n2, n2>) ASIO_TEST_CASE4(test_require, n2, n2>) ASIO_TEST_CASE4(test_can_prefer, s, false>) ASIO_TEST_CASE4(test_can_prefer, n1, true>) ASIO_TEST_CASE4(test_can_prefer, n2, false>) ASIO_TEST_CASE4(test_can_prefer, s, false>) ASIO_TEST_CASE4(test_can_prefer, n1, true>) ASIO_TEST_CASE4(test_can_prefer, n2, false>) ASIO_TEST_CASE4(test_can_prefer, s, false>) ASIO_TEST_CASE4(test_can_prefer, n1, true>) ASIO_TEST_CASE4(test_can_prefer, n2, false>) ASIO_TEST_CASE4(test_can_prefer, s, false>) ASIO_TEST_CASE4(test_can_prefer, n1, true>) ASIO_TEST_CASE4(test_can_prefer, n2, false>) ASIO_TEST_CASE4(test_prefer, n1, n1>) ASIO_TEST_CASE4(test_prefer, n1, n1>) ASIO_TEST_CASE4(test_prefer, n1, n1>) ASIO_TEST_CASE4(test_prefer, n1, n2>) ASIO_TEST_CASE(test_vars) )