diff options
Diffstat (limited to '3rdparty/asio/src/tests/unit/execution')
-rw-r--r-- | 3rdparty/asio/src/tests/unit/execution/any_executor.cpp | 1202 | ||||
-rw-r--r-- | 3rdparty/asio/src/tests/unit/execution/blocking.cpp | 1921 | ||||
-rw-r--r-- | 3rdparty/asio/src/tests/unit/execution/blocking_adaptation.cpp | 1323 | ||||
-rw-r--r-- | 3rdparty/asio/src/tests/unit/execution/context_as.cpp | 147 | ||||
-rw-r--r-- | 3rdparty/asio/src/tests/unit/execution/executor.cpp | 106 | ||||
-rw-r--r-- | 3rdparty/asio/src/tests/unit/execution/invocable_archetype.cpp | 25 | ||||
-rw-r--r-- | 3rdparty/asio/src/tests/unit/execution/mapping.cpp | 1985 | ||||
-rw-r--r-- | 3rdparty/asio/src/tests/unit/execution/outstanding_work.cpp | 1252 | ||||
-rw-r--r-- | 3rdparty/asio/src/tests/unit/execution/prefer_only.cpp | 533 | ||||
-rw-r--r-- | 3rdparty/asio/src/tests/unit/execution/relationship.cpp | 1252 |
10 files changed, 9746 insertions, 0 deletions
diff --git a/3rdparty/asio/src/tests/unit/execution/any_executor.cpp b/3rdparty/asio/src/tests/unit/execution/any_executor.cpp new file mode 100644 index 00000000000..3e2dabdc5a5 --- /dev/null +++ b/3rdparty/asio/src/tests/unit/execution/any_executor.cpp @@ -0,0 +1,1202 @@ +// +// any_executor.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/any_executor.hpp" + +#include <cstring> +#include <functional> +#include "asio/thread_pool.hpp" +#include "../unit_test.hpp" + +using namespace asio; +namespace bindns = std; + +static bool next_nothrow_new_fails = false; + +void* operator new(std::size_t n, + const std::nothrow_t&) noexcept +{ + if (next_nothrow_new_fails) + { + next_nothrow_new_fails = false; + return 0; + } + return ::operator new(n); +} + +struct fat_executor +{ + fat_executor(int id) + : id_(id) + { + std::memset(data_, 0, sizeof(data_)); + } + + template <typename F> + void execute(const F&) const + { + } + + std::size_t query(execution::occupancy_t) const + { + return 1; + } + + friend bool operator==(const fat_executor& a, + const fat_executor& b) noexcept + { + return a.id_ == b.id_; + } + + friend bool operator!=(const fat_executor& a, + const fat_executor& b) noexcept + { + return a.id_ != b.id_; + } + + int id_; + unsigned char data_[1024]; +}; + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) + +template <typename F> +struct execute_member<fat_executor, F> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + typedef void result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) + +#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT) + +template <> +struct query_member<fat_executor, execution::occupancy_t> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = false; + typedef std::size_t result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT) + +#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) + +template <> +struct equality_comparable<fat_executor> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) + +} // namespace traits +} // namespace asio + +void increment(int* count) +{ + ++(*count); +} + +void any_executor_construction_test() +{ + typedef execution::any_executor<> ex_no_props_t; + + typedef execution::any_executor< + execution::blocking_t + > ex_one_prop_t; + + typedef execution::any_executor< + execution::blocking_t, + execution::occupancy_t + > ex_two_props_t; + + thread_pool pool(1); + asio::nullptr_t null_ptr = asio::nullptr_t(); + + ex_two_props_t ex_two_props_1; + + ASIO_CHECK(ex_two_props_1.target<void>() == 0); + ASIO_CHECK(ex_two_props_1 == null_ptr); + + ex_two_props_t ex_two_props_2(null_ptr); + + ASIO_CHECK(ex_two_props_2.target<void>() == 0); + ASIO_CHECK(ex_two_props_2 == null_ptr); + ASIO_CHECK(ex_two_props_2 == ex_two_props_1); + + ex_two_props_t ex_two_props_3(pool.executor()); + + ASIO_CHECK(ex_two_props_3.target<void>() != 0); + ASIO_CHECK(ex_two_props_3 != null_ptr); + ASIO_CHECK(ex_two_props_3 != ex_two_props_1); + + ex_two_props_t ex_two_props_4(ex_two_props_1); + + ASIO_CHECK(ex_two_props_4.target<void>() == 0); + ASIO_CHECK(ex_two_props_4 == null_ptr); + ASIO_CHECK(ex_two_props_4 == ex_two_props_1); + + ex_two_props_t ex_two_props_5(ex_two_props_3); + + ASIO_CHECK(ex_two_props_5.target<void>() != 0); + ASIO_CHECK(ex_two_props_5 != null_ptr); + ASIO_CHECK(ex_two_props_5 == ex_two_props_3); + + ex_two_props_t ex_two_props_6 = fat_executor(1); + + ASIO_CHECK(ex_two_props_6.target<void>() != 0); + ASIO_CHECK(ex_two_props_6 != null_ptr); + ASIO_CHECK(ex_two_props_6 != ex_two_props_1); + + ex_two_props_t ex_two_props_7 = fat_executor(1); + + ASIO_CHECK(ex_two_props_7.target<void>() != 0); + ASIO_CHECK(ex_two_props_7 != null_ptr); + ASIO_CHECK(ex_two_props_7 != ex_two_props_1); + ASIO_CHECK(ex_two_props_7 == ex_two_props_6); + + ex_two_props_t ex_two_props_8 = fat_executor(2); + + ASIO_CHECK(ex_two_props_8.target<void>() != 0); + ASIO_CHECK(ex_two_props_8 != null_ptr); + ASIO_CHECK(ex_two_props_8 != ex_two_props_1); + ASIO_CHECK(ex_two_props_8 != ex_two_props_6); + ASIO_CHECK(ex_two_props_8 != ex_two_props_7); + + ex_two_props_t ex_two_props_9(ex_two_props_6); + + ASIO_CHECK(ex_two_props_9.target<void>() != 0); + ASIO_CHECK(ex_two_props_9 != null_ptr); + ASIO_CHECK(ex_two_props_9 != ex_two_props_1); + ASIO_CHECK(ex_two_props_9 == ex_two_props_6); + ASIO_CHECK(ex_two_props_9 == ex_two_props_7); + ASIO_CHECK(ex_two_props_9 != ex_two_props_8); + + ex_two_props_t ex_two_props_10(std::move(ex_two_props_1)); + + ASIO_CHECK(ex_two_props_10.target<void>() == 0); + ASIO_CHECK(ex_two_props_10 == null_ptr); + ASIO_CHECK(ex_two_props_1.target<void>() == 0); + ASIO_CHECK(ex_two_props_1 == null_ptr); + + ex_two_props_t ex_two_props_11(std::move(ex_two_props_3)); + + ASIO_CHECK(ex_two_props_11.target<void>() != 0); + ASIO_CHECK(ex_two_props_11 != null_ptr); + ASIO_CHECK(ex_two_props_3.target<void>() == 0); + ASIO_CHECK(ex_two_props_3 == null_ptr); + ASIO_CHECK(ex_two_props_11 == ex_two_props_5); + + ex_two_props_t ex_two_props_12(std::move(ex_two_props_7)); + + ASIO_CHECK(ex_two_props_12.target<void>() != 0); + ASIO_CHECK(ex_two_props_12 != null_ptr); + ASIO_CHECK(ex_two_props_7.target<void>() == 0); + ASIO_CHECK(ex_two_props_7 == null_ptr); + ASIO_CHECK(ex_two_props_12 == ex_two_props_6); + ASIO_CHECK(ex_two_props_12 != ex_two_props_8); + + ex_one_prop_t ex_one_prop_1; + + ASIO_CHECK(ex_one_prop_1.target<void>() == 0); + ASIO_CHECK(ex_one_prop_1 == null_ptr); + + ex_one_prop_t ex_one_prop_2(null_ptr); + + ASIO_CHECK(ex_one_prop_2.target<void>() == 0); + ASIO_CHECK(ex_one_prop_2 == null_ptr); + ASIO_CHECK(ex_one_prop_2 == ex_one_prop_1); + + ex_one_prop_t ex_one_prop_3(pool.executor()); + + ASIO_CHECK(ex_one_prop_3.target<void>() != 0); + ASIO_CHECK(ex_one_prop_3 != null_ptr); + ASIO_CHECK(ex_one_prop_3 != ex_one_prop_1); + + ex_one_prop_t ex_one_prop_4(ex_one_prop_1); + + ASIO_CHECK(ex_one_prop_4.target<void>() == 0); + ASIO_CHECK(ex_one_prop_4 == null_ptr); + ASIO_CHECK(ex_one_prop_4 == ex_one_prop_1); + + ex_one_prop_t ex_one_prop_5(ex_one_prop_3); + + ASIO_CHECK(ex_one_prop_5.target<void>() != 0); + ASIO_CHECK(ex_one_prop_5 != null_ptr); + ASIO_CHECK(ex_one_prop_5 == ex_one_prop_3); + + ex_one_prop_t ex_one_prop_6 = fat_executor(1); + + ASIO_CHECK(ex_one_prop_6.target<void>() != 0); + ASIO_CHECK(ex_one_prop_6 != null_ptr); + ASIO_CHECK(ex_one_prop_6 != ex_one_prop_1); + + ex_one_prop_t ex_one_prop_7 = fat_executor(1); + + ASIO_CHECK(ex_one_prop_7.target<void>() != 0); + ASIO_CHECK(ex_one_prop_7 != null_ptr); + ASIO_CHECK(ex_one_prop_7 != ex_one_prop_1); + ASIO_CHECK(ex_one_prop_7 == ex_one_prop_6); + + ex_one_prop_t ex_one_prop_8 = fat_executor(2); + + ASIO_CHECK(ex_one_prop_8.target<void>() != 0); + ASIO_CHECK(ex_one_prop_8 != null_ptr); + ASIO_CHECK(ex_one_prop_8 != ex_one_prop_1); + ASIO_CHECK(ex_one_prop_8 != ex_one_prop_6); + ASIO_CHECK(ex_one_prop_8 != ex_one_prop_7); + + ex_one_prop_t ex_one_prop_9(ex_one_prop_6); + + ASIO_CHECK(ex_one_prop_9.target<void>() != 0); + ASIO_CHECK(ex_one_prop_9 != null_ptr); + ASIO_CHECK(ex_one_prop_9 != ex_one_prop_1); + ASIO_CHECK(ex_one_prop_9 == ex_one_prop_6); + ASIO_CHECK(ex_one_prop_9 == ex_one_prop_7); + ASIO_CHECK(ex_one_prop_9 != ex_one_prop_8); + + ex_one_prop_t ex_one_prop_10(std::move(ex_one_prop_1)); + + ASIO_CHECK(ex_one_prop_10.target<void>() == 0); + ASIO_CHECK(ex_one_prop_10 == null_ptr); + ASIO_CHECK(ex_one_prop_1.target<void>() == 0); + ASIO_CHECK(ex_one_prop_1 == null_ptr); + + ex_one_prop_t ex_one_prop_11(std::move(ex_one_prop_3)); + + ASIO_CHECK(ex_one_prop_11.target<void>() != 0); + ASIO_CHECK(ex_one_prop_11 != null_ptr); + ASIO_CHECK(ex_one_prop_3.target<void>() == 0); + ASIO_CHECK(ex_one_prop_3 == null_ptr); + ASIO_CHECK(ex_one_prop_11 == ex_one_prop_5); + + ex_one_prop_t ex_one_prop_12(std::move(ex_one_prop_7)); + + ASIO_CHECK(ex_one_prop_12.target<void>() != 0); + ASIO_CHECK(ex_one_prop_12 != null_ptr); + ASIO_CHECK(ex_one_prop_7.target<void>() == 0); + ASIO_CHECK(ex_one_prop_7 == null_ptr); + ASIO_CHECK(ex_one_prop_12 == ex_one_prop_6); + ASIO_CHECK(ex_one_prop_12 != ex_one_prop_8); + + ex_one_prop_t ex_one_prop_13(ex_two_props_1); + + ASIO_CHECK(ex_one_prop_13.target<void>() == 0); + ASIO_CHECK(ex_one_prop_13 == null_ptr); + + ex_one_prop_t ex_one_prop_14(ex_two_props_5); + + ASIO_CHECK(ex_one_prop_14.target<void>() != 0); + ASIO_CHECK(ex_one_prop_14 != null_ptr); + + ex_one_prop_t ex_one_prop_15(ex_two_props_9); + + ASIO_CHECK(ex_one_prop_15.target<void>() != 0); + ASIO_CHECK(ex_one_prop_15 != null_ptr); + + ex_no_props_t ex_no_props_1; + + ASIO_CHECK(ex_no_props_1.target<void>() == 0); + ASIO_CHECK(ex_no_props_1 == null_ptr); + + ex_no_props_t ex_no_props_2(null_ptr); + + ASIO_CHECK(ex_no_props_2.target<void>() == 0); + ASIO_CHECK(ex_no_props_2 == null_ptr); + ASIO_CHECK(ex_no_props_2 == ex_no_props_1); + + ex_no_props_t ex_no_props_3(pool.executor()); + + ASIO_CHECK(ex_no_props_3.target<void>() != 0); + ASIO_CHECK(ex_no_props_3 != null_ptr); + ASIO_CHECK(ex_no_props_3 != ex_no_props_1); + + ex_no_props_t ex_no_props_4(ex_no_props_1); + + ASIO_CHECK(ex_no_props_4.target<void>() == 0); + ASIO_CHECK(ex_no_props_4 == null_ptr); + ASIO_CHECK(ex_no_props_4 == ex_no_props_1); + + ex_no_props_t ex_no_props_5(ex_no_props_3); + + ASIO_CHECK(ex_no_props_5.target<void>() != 0); + ASIO_CHECK(ex_no_props_5 != null_ptr); + ASIO_CHECK(ex_no_props_5 == ex_no_props_3); + + ex_no_props_t ex_no_props_6 = fat_executor(1); + + ASIO_CHECK(ex_no_props_6.target<void>() != 0); + ASIO_CHECK(ex_no_props_6 != null_ptr); + ASIO_CHECK(ex_no_props_6 != ex_no_props_1); + + ex_no_props_t ex_no_props_7 = fat_executor(1); + + ASIO_CHECK(ex_no_props_7.target<void>() != 0); + ASIO_CHECK(ex_no_props_7 != null_ptr); + ASIO_CHECK(ex_no_props_7 != ex_no_props_1); + ASIO_CHECK(ex_no_props_7 == ex_no_props_6); + + ex_no_props_t ex_no_props_8 = fat_executor(2); + + ASIO_CHECK(ex_no_props_8.target<void>() != 0); + ASIO_CHECK(ex_no_props_8 != null_ptr); + ASIO_CHECK(ex_no_props_8 != ex_no_props_1); + ASIO_CHECK(ex_no_props_8 != ex_no_props_6); + ASIO_CHECK(ex_no_props_8 != ex_no_props_7); + + ex_no_props_t ex_no_props_9(ex_no_props_6); + + ASIO_CHECK(ex_no_props_9.target<void>() != 0); + ASIO_CHECK(ex_no_props_9 != null_ptr); + ASIO_CHECK(ex_no_props_9 != ex_no_props_1); + ASIO_CHECK(ex_no_props_9 == ex_no_props_6); + ASIO_CHECK(ex_no_props_9 == ex_no_props_7); + ASIO_CHECK(ex_no_props_9 != ex_no_props_8); + + ex_no_props_t ex_no_props_10(std::move(ex_no_props_1)); + + ASIO_CHECK(ex_no_props_10.target<void>() == 0); + ASIO_CHECK(ex_no_props_10 == null_ptr); + ASIO_CHECK(ex_no_props_1.target<void>() == 0); + ASIO_CHECK(ex_no_props_1 == null_ptr); + + ex_no_props_t ex_no_props_11(std::move(ex_no_props_3)); + + ASIO_CHECK(ex_no_props_11.target<void>() != 0); + ASIO_CHECK(ex_no_props_11 != null_ptr); + ASIO_CHECK(ex_no_props_3.target<void>() == 0); + ASIO_CHECK(ex_no_props_3 == null_ptr); + ASIO_CHECK(ex_no_props_11 == ex_no_props_5); + + ex_no_props_t ex_no_props_12(std::move(ex_no_props_7)); + + ASIO_CHECK(ex_no_props_12.target<void>() != 0); + ASIO_CHECK(ex_no_props_12 != null_ptr); + ASIO_CHECK(ex_no_props_7.target<void>() == 0); + ASIO_CHECK(ex_no_props_7 == null_ptr); + ASIO_CHECK(ex_no_props_12 == ex_no_props_6); + ASIO_CHECK(ex_no_props_12 != ex_no_props_8); + + ex_no_props_t ex_no_props_13(ex_two_props_1); + + ASIO_CHECK(ex_no_props_13.target<void>() == 0); + ASIO_CHECK(ex_no_props_13 == null_ptr); + + ex_no_props_t ex_no_props_14(ex_two_props_5); + + ASIO_CHECK(ex_no_props_14.target<void>() != 0); + ASIO_CHECK(ex_no_props_14 != null_ptr); + + ex_no_props_t ex_no_props_15(ex_two_props_9); + + ASIO_CHECK(ex_no_props_15.target<void>() != 0); + ASIO_CHECK(ex_no_props_15 != null_ptr); + + ex_no_props_t ex_no_props_16(ex_one_prop_1); + + ASIO_CHECK(ex_no_props_16.target<void>() == 0); + ASIO_CHECK(ex_no_props_16 == null_ptr); + + ex_no_props_t ex_no_props_17(ex_one_prop_5); + + ASIO_CHECK(ex_no_props_17.target<void>() != 0); + ASIO_CHECK(ex_no_props_17 != null_ptr); + + ex_no_props_t ex_no_props_18(ex_one_prop_9); + + ASIO_CHECK(ex_no_props_18.target<void>() != 0); + ASIO_CHECK(ex_no_props_18 != null_ptr); +} + +void any_executor_nothrow_construction_test() +{ + typedef execution::any_executor<> ex_no_props_t; + + typedef execution::any_executor< + execution::blocking_t + > ex_one_prop_t; + + typedef execution::any_executor< + execution::blocking_t, + execution::occupancy_t + > ex_two_props_t; + + thread_pool pool(1); + asio::nullptr_t null_ptr = asio::nullptr_t(); + + ex_two_props_t ex_two_props_1; + + ASIO_CHECK(ex_two_props_1.target<void>() == 0); + ASIO_CHECK(ex_two_props_1 == null_ptr); + + ex_two_props_t ex_two_props_2(null_ptr); + + ASIO_CHECK(ex_two_props_2.target<void>() == 0); + ASIO_CHECK(ex_two_props_2 == null_ptr); + ASIO_CHECK(ex_two_props_2 == ex_two_props_1); + + ex_two_props_t ex_two_props_3(std::nothrow, pool.executor()); + + ASIO_CHECK(ex_two_props_3.target<void>() != 0); + ASIO_CHECK(ex_two_props_3 != null_ptr); + ASIO_CHECK(ex_two_props_3 != ex_two_props_1); + + ex_two_props_t ex_two_props_4(std::nothrow, ex_two_props_1); + + ASIO_CHECK(ex_two_props_4.target<void>() == 0); + ASIO_CHECK(ex_two_props_4 == null_ptr); + ASIO_CHECK(ex_two_props_4 == ex_two_props_1); + + ex_two_props_t ex_two_props_5(std::nothrow, ex_two_props_3); + + ASIO_CHECK(ex_two_props_5.target<void>() != 0); + ASIO_CHECK(ex_two_props_5 != null_ptr); + ASIO_CHECK(ex_two_props_5 == ex_two_props_3); + + ex_two_props_t ex_two_props_6(std::nothrow, fat_executor(1)); + + ASIO_CHECK(ex_two_props_6.target<void>() != 0); + ASIO_CHECK(ex_two_props_6 != null_ptr); + ASIO_CHECK(ex_two_props_6 != ex_two_props_1); + + ex_two_props_t ex_two_props_7(std::nothrow, fat_executor(1)); + + ASIO_CHECK(ex_two_props_7.target<void>() != 0); + ASIO_CHECK(ex_two_props_7 != null_ptr); + ASIO_CHECK(ex_two_props_7 != ex_two_props_1); + ASIO_CHECK(ex_two_props_7 == ex_two_props_6); + + ex_two_props_t ex_two_props_8(std::nothrow, fat_executor(2)); + + ASIO_CHECK(ex_two_props_8.target<void>() != 0); + ASIO_CHECK(ex_two_props_8 != null_ptr); + ASIO_CHECK(ex_two_props_8 != ex_two_props_1); + ASIO_CHECK(ex_two_props_8 != ex_two_props_6); + ASIO_CHECK(ex_two_props_8 != ex_two_props_7); + + ex_two_props_t ex_two_props_9(std::nothrow, ex_two_props_6); + + ASIO_CHECK(ex_two_props_9.target<void>() != 0); + ASIO_CHECK(ex_two_props_9 != null_ptr); + ASIO_CHECK(ex_two_props_9 != ex_two_props_1); + ASIO_CHECK(ex_two_props_9 == ex_two_props_6); + ASIO_CHECK(ex_two_props_9 == ex_two_props_7); + ASIO_CHECK(ex_two_props_9 != ex_two_props_8); + + ex_two_props_t ex_two_props_10(std::nothrow, std::move(ex_two_props_1)); + + ASIO_CHECK(ex_two_props_10.target<void>() == 0); + ASIO_CHECK(ex_two_props_10 == null_ptr); + ASIO_CHECK(ex_two_props_1.target<void>() == 0); + ASIO_CHECK(ex_two_props_1 == null_ptr); + + ex_two_props_t ex_two_props_11(std::nothrow, std::move(ex_two_props_3)); + + ASIO_CHECK(ex_two_props_11.target<void>() != 0); + ASIO_CHECK(ex_two_props_11 != null_ptr); + ASIO_CHECK(ex_two_props_3.target<void>() == 0); + ASIO_CHECK(ex_two_props_3 == null_ptr); + ASIO_CHECK(ex_two_props_11 == ex_two_props_5); + + ex_two_props_t ex_two_props_12(std::nothrow, std::move(ex_two_props_7)); + + ASIO_CHECK(ex_two_props_12.target<void>() != 0); + ASIO_CHECK(ex_two_props_12 != null_ptr); + ASIO_CHECK(ex_two_props_7.target<void>() == 0); + ASIO_CHECK(ex_two_props_7 == null_ptr); + ASIO_CHECK(ex_two_props_12 == ex_two_props_6); + ASIO_CHECK(ex_two_props_12 != ex_two_props_8); + + next_nothrow_new_fails = true; + ex_two_props_t ex_two_props_13(std::nothrow, fat_executor(3)); + + ASIO_CHECK(ex_two_props_13.target<void>() == 0); + ASIO_CHECK(ex_two_props_13 == null_ptr); + ASIO_CHECK(ex_two_props_13 == ex_two_props_1); + + ex_one_prop_t ex_one_prop_1; + + ASIO_CHECK(ex_one_prop_1.target<void>() == 0); + ASIO_CHECK(ex_one_prop_1 == null_ptr); + + ex_one_prop_t ex_one_prop_2(null_ptr); + + ASIO_CHECK(ex_one_prop_2.target<void>() == 0); + ASIO_CHECK(ex_one_prop_2 == null_ptr); + ASIO_CHECK(ex_one_prop_2 == ex_one_prop_1); + + ex_one_prop_t ex_one_prop_3(std::nothrow, pool.executor()); + + ASIO_CHECK(ex_one_prop_3.target<void>() != 0); + ASIO_CHECK(ex_one_prop_3 != null_ptr); + ASIO_CHECK(ex_one_prop_3 != ex_one_prop_1); + + ex_one_prop_t ex_one_prop_4(std::nothrow, ex_one_prop_1); + + ASIO_CHECK(ex_one_prop_4.target<void>() == 0); + ASIO_CHECK(ex_one_prop_4 == null_ptr); + ASIO_CHECK(ex_one_prop_4 == ex_one_prop_1); + + ex_one_prop_t ex_one_prop_5(std::nothrow, ex_one_prop_3); + + ASIO_CHECK(ex_one_prop_5.target<void>() != 0); + ASIO_CHECK(ex_one_prop_5 != null_ptr); + ASIO_CHECK(ex_one_prop_5 == ex_one_prop_3); + + ex_one_prop_t ex_one_prop_6 = fat_executor(1); + + ASIO_CHECK(ex_one_prop_6.target<void>() != 0); + ASIO_CHECK(ex_one_prop_6 != null_ptr); + ASIO_CHECK(ex_one_prop_6 != ex_one_prop_1); + + ex_one_prop_t ex_one_prop_7(std::nothrow, fat_executor(1)); + + ASIO_CHECK(ex_one_prop_7.target<void>() != 0); + ASIO_CHECK(ex_one_prop_7 != null_ptr); + ASIO_CHECK(ex_one_prop_7 != ex_one_prop_1); + ASIO_CHECK(ex_one_prop_7 == ex_one_prop_6); + + ex_one_prop_t ex_one_prop_8(std::nothrow, fat_executor(2)); + + ASIO_CHECK(ex_one_prop_8.target<void>() != 0); + ASIO_CHECK(ex_one_prop_8 != null_ptr); + ASIO_CHECK(ex_one_prop_8 != ex_one_prop_1); + ASIO_CHECK(ex_one_prop_8 != ex_one_prop_6); + ASIO_CHECK(ex_one_prop_8 != ex_one_prop_7); + + ex_one_prop_t ex_one_prop_9(std::nothrow, ex_one_prop_6); + + ASIO_CHECK(ex_one_prop_9.target<void>() != 0); + ASIO_CHECK(ex_one_prop_9 != null_ptr); + ASIO_CHECK(ex_one_prop_9 != ex_one_prop_1); + ASIO_CHECK(ex_one_prop_9 == ex_one_prop_6); + ASIO_CHECK(ex_one_prop_9 == ex_one_prop_7); + ASIO_CHECK(ex_one_prop_9 != ex_one_prop_8); + + ex_one_prop_t ex_one_prop_10(std::nothrow, std::move(ex_one_prop_1)); + + ASIO_CHECK(ex_one_prop_10.target<void>() == 0); + ASIO_CHECK(ex_one_prop_10 == null_ptr); + ASIO_CHECK(ex_one_prop_1.target<void>() == 0); + ASIO_CHECK(ex_one_prop_1 == null_ptr); + + ex_one_prop_t ex_one_prop_11(std::nothrow, std::move(ex_one_prop_3)); + + ASIO_CHECK(ex_one_prop_11.target<void>() != 0); + ASIO_CHECK(ex_one_prop_11 != null_ptr); + ASIO_CHECK(ex_one_prop_3.target<void>() == 0); + ASIO_CHECK(ex_one_prop_3 == null_ptr); + ASIO_CHECK(ex_one_prop_11 == ex_one_prop_5); + + ex_one_prop_t ex_one_prop_12(std::nothrow, std::move(ex_one_prop_7)); + + ASIO_CHECK(ex_one_prop_12.target<void>() != 0); + ASIO_CHECK(ex_one_prop_12 != null_ptr); + ASIO_CHECK(ex_one_prop_7.target<void>() == 0); + ASIO_CHECK(ex_one_prop_7 == null_ptr); + ASIO_CHECK(ex_one_prop_12 == ex_one_prop_6); + ASIO_CHECK(ex_one_prop_12 != ex_one_prop_8); + + ex_one_prop_t ex_one_prop_13(std::nothrow, ex_two_props_1); + + ASIO_CHECK(ex_one_prop_13.target<void>() == 0); + ASIO_CHECK(ex_one_prop_13 == null_ptr); + + ex_one_prop_t ex_one_prop_14(std::nothrow, ex_two_props_5); + + ASIO_CHECK(ex_one_prop_14.target<void>() != 0); + ASIO_CHECK(ex_one_prop_14 != null_ptr); + + ex_one_prop_t ex_one_prop_15(std::nothrow, ex_two_props_9); + + ASIO_CHECK(ex_one_prop_15.target<void>() != 0); + ASIO_CHECK(ex_one_prop_15 != null_ptr); + + next_nothrow_new_fails = true; + ex_one_prop_t ex_one_prop_16(std::nothrow, fat_executor(3)); + + ASIO_CHECK(ex_one_prop_16.target<void>() == 0); + ASIO_CHECK(ex_one_prop_16 == null_ptr); + ASIO_CHECK(ex_one_prop_16 == ex_one_prop_1); + + ex_no_props_t ex_no_props_1; + + ASIO_CHECK(ex_no_props_1.target<void>() == 0); + ASIO_CHECK(ex_no_props_1 == null_ptr); + + ex_no_props_t ex_no_props_2(null_ptr); + + ASIO_CHECK(ex_no_props_2.target<void>() == 0); + ASIO_CHECK(ex_no_props_2 == null_ptr); + ASIO_CHECK(ex_no_props_2 == ex_no_props_1); + + ex_no_props_t ex_no_props_3(std::nothrow, pool.executor()); + + ASIO_CHECK(ex_no_props_3.target<void>() != 0); + ASIO_CHECK(ex_no_props_3 != null_ptr); + ASIO_CHECK(ex_no_props_3 != ex_no_props_1); + + ex_no_props_t ex_no_props_4(std::nothrow, ex_no_props_1); + + ASIO_CHECK(ex_no_props_4.target<void>() == 0); + ASIO_CHECK(ex_no_props_4 == null_ptr); + ASIO_CHECK(ex_no_props_4 == ex_no_props_1); + + ex_no_props_t ex_no_props_5(std::nothrow, ex_no_props_3); + + ASIO_CHECK(ex_no_props_5.target<void>() != 0); + ASIO_CHECK(ex_no_props_5 != null_ptr); + ASIO_CHECK(ex_no_props_5 == ex_no_props_3); + + ex_no_props_t ex_no_props_6(std::nothrow, fat_executor(1)); + + ASIO_CHECK(ex_no_props_6.target<void>() != 0); + ASIO_CHECK(ex_no_props_6 != null_ptr); + ASIO_CHECK(ex_no_props_6 != ex_no_props_1); + + ex_no_props_t ex_no_props_7(std::nothrow, fat_executor(1)); + + ASIO_CHECK(ex_no_props_7.target<void>() != 0); + ASIO_CHECK(ex_no_props_7 != null_ptr); + ASIO_CHECK(ex_no_props_7 != ex_no_props_1); + ASIO_CHECK(ex_no_props_7 == ex_no_props_6); + + ex_no_props_t ex_no_props_8(std::nothrow, fat_executor(2)); + + ASIO_CHECK(ex_no_props_8.target<void>() != 0); + ASIO_CHECK(ex_no_props_8 != null_ptr); + ASIO_CHECK(ex_no_props_8 != ex_no_props_1); + ASIO_CHECK(ex_no_props_8 != ex_no_props_6); + ASIO_CHECK(ex_no_props_8 != ex_no_props_7); + + ex_no_props_t ex_no_props_9(std::nothrow, ex_no_props_6); + + ASIO_CHECK(ex_no_props_9.target<void>() != 0); + ASIO_CHECK(ex_no_props_9 != null_ptr); + ASIO_CHECK(ex_no_props_9 != ex_no_props_1); + ASIO_CHECK(ex_no_props_9 == ex_no_props_6); + ASIO_CHECK(ex_no_props_9 == ex_no_props_7); + ASIO_CHECK(ex_no_props_9 != ex_no_props_8); + + ex_no_props_t ex_no_props_10(std::nothrow, std::move(ex_no_props_1)); + + ASIO_CHECK(ex_no_props_10.target<void>() == 0); + ASIO_CHECK(ex_no_props_10 == null_ptr); + ASIO_CHECK(ex_no_props_1.target<void>() == 0); + ASIO_CHECK(ex_no_props_1 == null_ptr); + + ex_no_props_t ex_no_props_11(std::nothrow, std::move(ex_no_props_3)); + + ASIO_CHECK(ex_no_props_11.target<void>() != 0); + ASIO_CHECK(ex_no_props_11 != null_ptr); + ASIO_CHECK(ex_no_props_3.target<void>() == 0); + ASIO_CHECK(ex_no_props_3 == null_ptr); + ASIO_CHECK(ex_no_props_11 == ex_no_props_5); + + ex_no_props_t ex_no_props_12(std::nothrow, std::move(ex_no_props_7)); + + ASIO_CHECK(ex_no_props_12.target<void>() != 0); + ASIO_CHECK(ex_no_props_12 != null_ptr); + ASIO_CHECK(ex_no_props_7.target<void>() == 0); + ASIO_CHECK(ex_no_props_7 == null_ptr); + ASIO_CHECK(ex_no_props_12 == ex_no_props_6); + ASIO_CHECK(ex_no_props_12 != ex_no_props_8); + + ex_no_props_t ex_no_props_13(std::nothrow, ex_two_props_1); + + ASIO_CHECK(ex_no_props_13.target<void>() == 0); + ASIO_CHECK(ex_no_props_13 == null_ptr); + + ex_no_props_t ex_no_props_14(std::nothrow, ex_two_props_5); + + ASIO_CHECK(ex_no_props_14.target<void>() != 0); + ASIO_CHECK(ex_no_props_14 != null_ptr); + + ex_no_props_t ex_no_props_15(std::nothrow, ex_two_props_9); + + ASIO_CHECK(ex_no_props_15.target<void>() != 0); + ASIO_CHECK(ex_no_props_15 != null_ptr); + + ex_no_props_t ex_no_props_16(std::nothrow, ex_one_prop_1); + + ASIO_CHECK(ex_no_props_16.target<void>() == 0); + ASIO_CHECK(ex_no_props_16 == null_ptr); + + ex_no_props_t ex_no_props_17(std::nothrow, ex_one_prop_5); + + ASIO_CHECK(ex_no_props_17.target<void>() != 0); + ASIO_CHECK(ex_no_props_17 != null_ptr); + + ex_no_props_t ex_no_props_18(std::nothrow, ex_one_prop_9); + + ASIO_CHECK(ex_no_props_18.target<void>() != 0); + ASIO_CHECK(ex_no_props_18 != null_ptr); + + next_nothrow_new_fails = true; + ex_no_props_t ex_no_props_19(std::nothrow, fat_executor(3)); + + ASIO_CHECK(ex_no_props_19.target<void>() == 0); + ASIO_CHECK(ex_no_props_19 == null_ptr); + ASIO_CHECK(ex_no_props_19 == ex_no_props_1); +} + +void any_executor_assignment_test() +{ + typedef execution::any_executor<> ex_no_props_t; + + typedef execution::any_executor< + execution::blocking_t + > ex_one_prop_t; + + typedef execution::any_executor< + execution::blocking_t, + execution::occupancy_t + > ex_two_props_t; + + thread_pool pool(1); + asio::nullptr_t null_ptr = asio::nullptr_t(); + + ex_two_props_t ex_two_props_1; + + ex_two_props_t ex_two_props_2; + ex_two_props_2 = null_ptr; + + ASIO_CHECK(ex_two_props_2.target<void>() == 0); + + ex_two_props_t ex_two_props_3; + ex_two_props_3 = pool.executor(); + + ASIO_CHECK(ex_two_props_3.target<void>() != 0); + + ex_two_props_t ex_two_props_4; + ex_two_props_4 = ex_two_props_1; + + ASIO_CHECK(ex_two_props_4.target<void>() == 0); + ASIO_CHECK(ex_two_props_4 == ex_two_props_1); + + ex_two_props_4 = ex_two_props_3; + + ASIO_CHECK(ex_two_props_4.target<void>() != 0); + ASIO_CHECK(ex_two_props_4 == ex_two_props_3); + + ex_two_props_t ex_two_props_5; + ex_two_props_5 = fat_executor(1); + + ASIO_CHECK(ex_two_props_5.target<void>() != 0); + ASIO_CHECK(ex_two_props_5 != null_ptr); + ASIO_CHECK(ex_two_props_5 != ex_two_props_1); + + ex_two_props_t ex_two_props_6; + ex_two_props_6 = fat_executor(1); + + ASIO_CHECK(ex_two_props_6.target<void>() != 0); + ASIO_CHECK(ex_two_props_6 != null_ptr); + ASIO_CHECK(ex_two_props_6 != ex_two_props_1); + ASIO_CHECK(ex_two_props_6 == ex_two_props_5); + + ex_two_props_6 = fat_executor(2); + + ASIO_CHECK(ex_two_props_6.target<void>() != 0); + ASIO_CHECK(ex_two_props_6 != null_ptr); + ASIO_CHECK(ex_two_props_6 != ex_two_props_1); + ASIO_CHECK(ex_two_props_6 != ex_two_props_5); + + ex_two_props_t ex_two_props_7; + ex_two_props_7 = ex_two_props_5; + + ASIO_CHECK(ex_two_props_7.target<void>() != 0); + ASIO_CHECK(ex_two_props_7 != null_ptr); + ASIO_CHECK(ex_two_props_7 != ex_two_props_1); + ASIO_CHECK(ex_two_props_7 == ex_two_props_5); + ASIO_CHECK(ex_two_props_7 != ex_two_props_6); + + ex_two_props_t ex_two_props_8; + ex_two_props_8 = std::move(ex_two_props_1); + + ASIO_CHECK(ex_two_props_8.target<void>() == 0); + ASIO_CHECK(ex_two_props_1.target<void>() == 0); + + ex_two_props_8 = std::move(ex_two_props_3); + + ASIO_CHECK(ex_two_props_8.target<void>() != 0); + ASIO_CHECK(ex_two_props_3.target<void>() == 0); + ASIO_CHECK(ex_two_props_8 == ex_two_props_4); + + ex_two_props_8 = std::move(ex_two_props_5); + + ASIO_CHECK(ex_two_props_8.target<void>() != 0); + ASIO_CHECK(ex_two_props_5.target<void>() == 0); + ASIO_CHECK(ex_two_props_8 == ex_two_props_7); + + ex_one_prop_t ex_one_prop_1; + + ex_one_prop_t ex_one_prop_2; + ex_one_prop_2 = null_ptr; + + ASIO_CHECK(ex_one_prop_2.target<void>() == 0); + + ex_one_prop_t ex_one_prop_3; + ex_one_prop_3 = pool.executor(); + + ASIO_CHECK(ex_one_prop_3.target<void>() != 0); + + ex_one_prop_t ex_one_prop_4; + ex_one_prop_4 = ex_one_prop_1; + + ASIO_CHECK(ex_one_prop_4.target<void>() == 0); + ASIO_CHECK(ex_one_prop_4 == ex_one_prop_1); + + ex_one_prop_4 = ex_one_prop_3; + + ASIO_CHECK(ex_one_prop_4.target<void>() != 0); + ASIO_CHECK(ex_one_prop_4 == ex_one_prop_3); + + ex_one_prop_t ex_one_prop_5; + ex_one_prop_5 = fat_executor(1); + + ASIO_CHECK(ex_one_prop_5.target<void>() != 0); + ASIO_CHECK(ex_one_prop_5 != null_ptr); + ASIO_CHECK(ex_one_prop_5 != ex_one_prop_1); + + ex_one_prop_t ex_one_prop_6; + ex_one_prop_6 = fat_executor(1); + + ASIO_CHECK(ex_one_prop_6.target<void>() != 0); + ASIO_CHECK(ex_one_prop_6 != null_ptr); + ASIO_CHECK(ex_one_prop_6 != ex_one_prop_1); + ASIO_CHECK(ex_one_prop_6 == ex_one_prop_5); + + ex_one_prop_6 = fat_executor(2); + + ASIO_CHECK(ex_one_prop_6.target<void>() != 0); + ASIO_CHECK(ex_one_prop_6 != null_ptr); + ASIO_CHECK(ex_one_prop_6 != ex_one_prop_1); + ASIO_CHECK(ex_one_prop_6 != ex_one_prop_5); + + ex_one_prop_t ex_one_prop_7; + ex_one_prop_7 = ex_one_prop_5; + + ASIO_CHECK(ex_one_prop_7.target<void>() != 0); + ASIO_CHECK(ex_one_prop_7 != null_ptr); + ASIO_CHECK(ex_one_prop_7 != ex_one_prop_1); + ASIO_CHECK(ex_one_prop_7 == ex_one_prop_5); + ASIO_CHECK(ex_one_prop_7 != ex_one_prop_6); + + ex_one_prop_t ex_one_prop_8; + ex_one_prop_8 = std::move(ex_one_prop_1); + + ASIO_CHECK(ex_one_prop_8.target<void>() == 0); + ASIO_CHECK(ex_one_prop_1.target<void>() == 0); + + ex_one_prop_8 = std::move(ex_one_prop_3); + + ASIO_CHECK(ex_one_prop_8.target<void>() != 0); + ASIO_CHECK(ex_one_prop_3.target<void>() == 0); + ASIO_CHECK(ex_one_prop_8 == ex_one_prop_4); + + ex_one_prop_8 = std::move(ex_one_prop_5); + + ASIO_CHECK(ex_one_prop_8.target<void>() != 0); + ASIO_CHECK(ex_one_prop_5.target<void>() == 0); + ASIO_CHECK(ex_one_prop_8 == ex_one_prop_7); + + ex_one_prop_t ex_one_prop_9; + ex_one_prop_9 = ex_two_props_1; + + ASIO_CHECK(ex_one_prop_9.target<void>() == 0); + + ex_one_prop_9 = ex_two_props_4; + + ASIO_CHECK(ex_one_prop_9.target<void>() != 0); + + ex_one_prop_9 = ex_two_props_7; + + ASIO_CHECK(ex_one_prop_9.target<void>() != 0); + + ex_no_props_t ex_no_props_1; + + ex_no_props_t ex_no_props_2; + ex_no_props_2 = null_ptr; + + ASIO_CHECK(ex_no_props_2.target<void>() == 0); + + ex_no_props_t ex_no_props_3; + ex_no_props_3 = pool.executor(); + + ASIO_CHECK(ex_no_props_3.target<void>() != 0); + + ex_no_props_t ex_no_props_4; + ex_no_props_4 = ex_no_props_1; + + ASIO_CHECK(ex_no_props_4.target<void>() == 0); + ASIO_CHECK(ex_no_props_4 == ex_no_props_1); + + ex_no_props_4 = ex_no_props_3; + + ASIO_CHECK(ex_no_props_4.target<void>() != 0); + ASIO_CHECK(ex_no_props_4 == ex_no_props_3); + + ex_no_props_t ex_no_props_5; + ex_no_props_5 = fat_executor(1); + + ASIO_CHECK(ex_no_props_5.target<void>() != 0); + ASIO_CHECK(ex_no_props_5 != null_ptr); + ASIO_CHECK(ex_no_props_5 != ex_no_props_1); + + ex_no_props_t ex_no_props_6; + ex_no_props_6 = fat_executor(1); + + ASIO_CHECK(ex_no_props_6.target<void>() != 0); + ASIO_CHECK(ex_no_props_6 != null_ptr); + ASIO_CHECK(ex_no_props_6 != ex_no_props_1); + ASIO_CHECK(ex_no_props_6 == ex_no_props_5); + + ex_no_props_6 = fat_executor(2); + + ASIO_CHECK(ex_no_props_6.target<void>() != 0); + ASIO_CHECK(ex_no_props_6 != null_ptr); + ASIO_CHECK(ex_no_props_6 != ex_no_props_1); + ASIO_CHECK(ex_no_props_6 != ex_no_props_5); + + ex_no_props_t ex_no_props_7; + ex_no_props_7 = ex_no_props_5; + + ASIO_CHECK(ex_no_props_7.target<void>() != 0); + ASIO_CHECK(ex_no_props_7 != null_ptr); + ASIO_CHECK(ex_no_props_7 != ex_no_props_1); + ASIO_CHECK(ex_no_props_7 == ex_no_props_5); + ASIO_CHECK(ex_no_props_7 != ex_no_props_6); + + ex_no_props_t ex_no_props_8; + ex_no_props_8 = std::move(ex_no_props_1); + + ASIO_CHECK(ex_no_props_8.target<void>() == 0); + ASIO_CHECK(ex_no_props_1.target<void>() == 0); + + ex_no_props_8 = std::move(ex_no_props_3); + + ASIO_CHECK(ex_no_props_8.target<void>() != 0); + ASIO_CHECK(ex_no_props_3.target<void>() == 0); + ASIO_CHECK(ex_no_props_8 == ex_no_props_4); + + ex_no_props_8 = std::move(ex_no_props_5); + + ASIO_CHECK(ex_no_props_8.target<void>() != 0); + ASIO_CHECK(ex_no_props_5.target<void>() == 0); + ASIO_CHECK(ex_no_props_8 == ex_no_props_7); + + ex_no_props_t ex_no_props_9; + ex_no_props_9 = ex_two_props_1; + + ASIO_CHECK(ex_no_props_9.target<void>() == 0); + + ex_no_props_9 = ex_two_props_4; + + ASIO_CHECK(ex_no_props_9.target<void>() != 0); + + ex_no_props_9 = ex_two_props_7; + + ASIO_CHECK(ex_no_props_9.target<void>() != 0); + + ex_no_props_9 = ex_one_prop_1; + + ASIO_CHECK(ex_no_props_9.target<void>() == 0); + + ex_no_props_9 = ex_one_prop_4; + + ASIO_CHECK(ex_no_props_9.target<void>() != 0); + + ex_no_props_9 = ex_one_prop_7; + + ASIO_CHECK(ex_no_props_9.target<void>() != 0); +} + +void any_executor_swap_test() +{ + typedef execution::any_executor<> ex_no_props_t; + + typedef execution::any_executor< + execution::blocking_t + > ex_one_prop_t; + + typedef execution::any_executor< + execution::blocking_t, + execution::occupancy_t + > ex_two_props_t; + + thread_pool pool1(1); + thread_pool pool2(1); + + ex_no_props_t ex_no_props_1(pool1.executor()); + ex_no_props_t ex_no_props_2(pool2.executor()); + + ex_no_props_t ex_no_props_3(ex_no_props_1); + ex_no_props_t ex_no_props_4(ex_no_props_2); + + ASIO_CHECK(ex_no_props_3 == ex_no_props_1); + ASIO_CHECK(ex_no_props_4 == ex_no_props_2); + + ex_no_props_3.swap(ex_no_props_4); + + ASIO_CHECK(ex_no_props_3 == ex_no_props_2); + ASIO_CHECK(ex_no_props_4 == ex_no_props_1); + + execution::swap(ex_no_props_3, ex_no_props_4); + + ASIO_CHECK(ex_no_props_3 == ex_no_props_1); + ASIO_CHECK(ex_no_props_4 == ex_no_props_2); + + ex_one_prop_t ex_one_prop_1(pool1.executor()); + ex_one_prop_t ex_one_prop_2(pool2.executor()); + + ex_one_prop_t ex_one_prop_3(ex_one_prop_1); + ex_one_prop_t ex_one_prop_4(ex_one_prop_2); + + ASIO_CHECK(ex_one_prop_3 == ex_one_prop_1); + ASIO_CHECK(ex_one_prop_4 == ex_one_prop_2); + + ex_one_prop_3.swap(ex_one_prop_4); + + ASIO_CHECK(ex_one_prop_3 == ex_one_prop_2); + ASIO_CHECK(ex_one_prop_4 == ex_one_prop_1); + + execution::swap(ex_one_prop_3, ex_one_prop_4); + + ASIO_CHECK(ex_one_prop_3 == ex_one_prop_1); + ASIO_CHECK(ex_one_prop_4 == ex_one_prop_2); + + ex_two_props_t ex_two_props_1(pool1.executor()); + ex_two_props_t ex_two_props_2(pool2.executor()); + + ex_two_props_t ex_two_props_3(ex_two_props_1); + ex_two_props_t ex_two_props_4(ex_two_props_2); + + ASIO_CHECK(ex_two_props_3 == ex_two_props_1); + ASIO_CHECK(ex_two_props_4 == ex_two_props_2); + + ex_two_props_3.swap(ex_two_props_4); + + ASIO_CHECK(ex_two_props_3 == ex_two_props_2); + ASIO_CHECK(ex_two_props_4 == ex_two_props_1); + + execution::swap(ex_two_props_3, ex_two_props_4); + + ASIO_CHECK(ex_two_props_3 == ex_two_props_1); + ASIO_CHECK(ex_two_props_4 == ex_two_props_2); +} + +void any_executor_query_test() +{ + thread_pool pool(1); + execution::any_executor< + execution::blocking_t, + execution::outstanding_work_t, + execution::relationship_t, + execution::mapping_t::thread_t, + execution::occupancy_t> + ex(pool.executor()); + + ASIO_CHECK( + asio::query(ex, asio::execution::blocking) + == asio::execution::blocking.possibly); + + ASIO_CHECK( + asio::query(ex, asio::execution::blocking.possibly) + == asio::execution::blocking.possibly); + + ASIO_CHECK( + asio::query(ex, asio::execution::outstanding_work) + == asio::execution::outstanding_work.untracked); + + ASIO_CHECK( + asio::query(ex, asio::execution::outstanding_work.untracked) + == asio::execution::outstanding_work.untracked); + + ASIO_CHECK( + asio::query(ex, asio::execution::relationship) + == asio::execution::relationship.fork); + + ASIO_CHECK( + asio::query(ex, asio::execution::relationship.fork) + == asio::execution::relationship.fork); + + ASIO_CHECK( + asio::query(ex, asio::execution::mapping) + == asio::execution::mapping.thread); + + ASIO_CHECK( + asio::query(ex, asio::execution::occupancy) + == 1); +} + +void any_executor_execute_test() +{ + int count = 0; + thread_pool pool(1); + execution::any_executor< + execution::blocking_t::possibly_t, + execution::blocking_t::never_t, + execution::outstanding_work_t::untracked_t, + execution::outstanding_work_t::tracked_t, + execution::relationship_t::continuation_t> + ex(pool.executor()); + + ex.execute(bindns::bind(increment, &count)); + + asio::require(ex, asio::execution::blocking.possibly).execute( + bindns::bind(increment, &count)); + + asio::require(ex, asio::execution::blocking.never).execute( + bindns::bind(increment, &count)); + + asio::require(ex, + asio::execution::blocking.never, + asio::execution::outstanding_work.tracked + ).execute(bindns::bind(increment, &count)); + + asio::require(ex, + asio::execution::blocking.never, + asio::execution::outstanding_work.untracked + ).execute(bindns::bind(increment, &count)); + + asio::require(ex, + asio::execution::blocking.never, + asio::execution::outstanding_work.untracked, + asio::execution::relationship.continuation + ).execute(bindns::bind(increment, &count)); + + pool.wait(); + + ASIO_CHECK(count == 6); +} + +ASIO_TEST_SUITE +( + "any_executor", + ASIO_TEST_CASE(any_executor_construction_test) + ASIO_TEST_CASE(any_executor_nothrow_construction_test) + ASIO_TEST_CASE(any_executor_assignment_test) + ASIO_TEST_CASE(any_executor_swap_test) + ASIO_TEST_CASE(any_executor_query_test) + ASIO_TEST_CASE(any_executor_execute_test) +) diff --git a/3rdparty/asio/src/tests/unit/execution/blocking.cpp b/3rdparty/asio/src/tests/unit/execution/blocking.cpp new file mode 100644 index 00000000000..ce2ba2f8ea5 --- /dev/null +++ b/3rdparty/asio/src/tests/unit/execution/blocking.cpp @@ -0,0 +1,1921 @@ +// +// blocking.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.hpp" + +#include "asio/prefer.hpp" +#include "asio/query.hpp" +#include "asio/require.hpp" +#include "../unit_test.hpp" + +namespace exec = asio::execution; + +typedef exec::blocking_t s; +typedef exec::blocking_t::possibly_t n1; +typedef exec::blocking_t::always_t n2; +typedef exec::blocking_t::never_t n3; + +struct ex_nq_nr +{ + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <> +struct is_executor<ex_nq_nr> : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +template <typename ResultType, typename ParamType, typename Result> +struct ex_cq_nr +{ + static constexpr ResultType query(ParamType) noexcept + { + return Result(); + } + + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <typename ResultType, typename ParamType, typename Result> +struct is_executor<ex_cq_nr<ResultType, ParamType, Result> > + : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT) + +template <typename ResultType, typename ParamType, + typename Result, typename Param> +struct query_static_constexpr_member< + ex_cq_nr<ResultType, ParamType, Result>, Param, + typename asio::enable_if< + asio::is_convertible<Param, ParamType>::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 <typename ResultType, typename ParamType, typename Result> +struct ex_mq_nr +{ + ResultType query(ParamType) const noexcept + { + return Result(); + } + + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <typename ResultType, typename ParamType, typename Result> +struct is_executor<ex_mq_nr<ResultType, ParamType, Result> > + : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT) + +template <typename ResultType, typename ParamType, + typename Result, typename Param> +struct query_member< + ex_mq_nr<ResultType, ParamType, Result>, Param, + typename asio::enable_if< + asio::is_convertible<Param, ParamType>::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 <typename ResultType, typename ParamType, typename Result> +struct ex_fq_nr +{ + friend ResultType query(const ex_fq_nr&, ParamType) noexcept + { + return Result(); + } + + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <typename ResultType, typename ParamType, typename Result> +struct is_executor<ex_fq_nr<ResultType, ParamType, Result> > + : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT) + +template <typename ResultType, typename ParamType, + typename Result, typename Param> +struct query_free< + ex_fq_nr<ResultType, ParamType, Result>, Param, + typename asio::enable_if< + asio::is_convertible<Param, ParamType>::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 <typename CurrentType, typename OtherType> +struct ex_mq_mr +{ + CurrentType query(CurrentType) const noexcept + { + return CurrentType(); + } + + CurrentType query(OtherType) const noexcept + { + return CurrentType(); + } + + ex_mq_mr<CurrentType, OtherType> require( + CurrentType) const noexcept + { + return ex_mq_mr<CurrentType, OtherType>(); + } + + ex_mq_mr<OtherType, CurrentType> require( + OtherType) const noexcept + { + return ex_mq_mr<OtherType, CurrentType>(); + } + + template <typename F> + 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 <typename CurrentType> +struct ex_mq_mr<CurrentType, CurrentType> +{ + CurrentType query(CurrentType) const noexcept + { + return CurrentType(); + } + + ex_mq_mr<CurrentType, CurrentType> require( + CurrentType) const noexcept + { + return ex_mq_mr<CurrentType, CurrentType>(); + } + + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <typename CurrentType, typename OtherType> +struct is_executor<ex_mq_mr<CurrentType, OtherType> > + : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT) + +template <typename CurrentType, typename OtherType, typename Param> +struct query_member< + ex_mq_mr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + || asio::is_convertible<Param, OtherType>::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 <typename CurrentType, typename OtherType, typename Param> +struct require_member< + ex_mq_mr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_mq_mr<CurrentType, OtherType> result_type; +}; + +template <typename CurrentType, typename OtherType, typename Param> +struct require_member< + ex_mq_mr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, OtherType>::value + && !asio::is_same<CurrentType, OtherType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_mq_mr<OtherType, CurrentType> result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT) + +} // namespace traits +} // namespace asio + +template <typename CurrentType, typename OtherType> +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<CurrentType, OtherType> require( + const ex_fq_fr&, CurrentType) noexcept + { + return ex_fq_fr<CurrentType, OtherType>(); + } + + friend ex_fq_fr<OtherType, CurrentType> require( + const ex_fq_fr&, OtherType) noexcept + { + return ex_fq_fr<OtherType, CurrentType>(); + } + + friend ex_fq_fr<CurrentType, OtherType> prefer( + const ex_fq_fr&, CurrentType) noexcept + { + return ex_fq_fr<CurrentType, OtherType>(); + } + + friend ex_fq_fr<OtherType, CurrentType> prefer( + const ex_fq_fr&, OtherType) noexcept + { + return ex_fq_fr<OtherType, CurrentType>(); + } + + template <typename F> + 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 <typename CurrentType> +struct ex_fq_fr<CurrentType, CurrentType> +{ + friend CurrentType query(const ex_fq_fr&, CurrentType) noexcept + { + return CurrentType(); + } + + friend ex_fq_fr<CurrentType, CurrentType> require( + const ex_fq_fr&, CurrentType) noexcept + { + return ex_fq_fr<CurrentType, CurrentType>(); + } + + friend ex_fq_fr<CurrentType, CurrentType> prefer( + const ex_fq_fr&, CurrentType) noexcept + { + return ex_fq_fr<CurrentType, CurrentType>(); + } + + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <typename CurrentType, typename OtherType> +struct is_executor<ex_fq_fr<CurrentType, OtherType> > + : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT) + +template <typename CurrentType, typename OtherType, typename Param> +struct query_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + || asio::is_convertible<Param, OtherType>::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 <typename CurrentType, typename OtherType, typename Param> +struct require_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_fq_fr<CurrentType, OtherType> result_type; +}; + +template <typename CurrentType, typename OtherType, typename Param> +struct require_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, OtherType>::value + && !asio::is_same<CurrentType, OtherType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_fq_fr<OtherType, CurrentType> result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT) + +#if !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT) + +template <typename CurrentType, typename OtherType, typename Param> +struct prefer_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_fq_fr<CurrentType, OtherType> result_type; +}; + +template <typename CurrentType, typename OtherType, typename Param> +struct prefer_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, OtherType>::value + && !asio::is_same<CurrentType, OtherType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_fq_fr<OtherType, CurrentType> result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT) + +} // namespace traits +} // namespace asio + +template <typename Executor, typename Param, bool ExpectedResult> +void test_can_query() +{ + constexpr bool b1 = + asio::can_query<Executor, Param>::value; + ASIO_CHECK(b1 == ExpectedResult); + + constexpr bool b2 = + asio::can_query<const Executor, Param>::value; + ASIO_CHECK(b2 == ExpectedResult); + + constexpr bool b3 = + asio::can_query<Executor&, Param>::value; + ASIO_CHECK(b3 == ExpectedResult); + + constexpr bool b4 = + asio::can_query<const Executor&, Param>::value; + ASIO_CHECK(b4 == ExpectedResult); +} + +template <typename Executor, typename Param, typename ExpectedResult> +void test_query() +{ + exec::blocking_t result1 = asio::query(Executor(), Param()); + ASIO_CHECK(result1 == ExpectedResult()); + + Executor ex1 = {}; + exec::blocking_t result2 = asio::query(ex1, Param()); + ASIO_CHECK(result2 == ExpectedResult()); + + const Executor ex2 = {}; + exec::blocking_t result3 = asio::query(ex2, Param()); + ASIO_CHECK(result3 == ExpectedResult()); +} + +template <typename Executor, typename Param, typename ExpectedResult> +void test_constexpr_query() +{ + constexpr Executor ex1 = {}; + constexpr exec::blocking_t result1 = asio::query(ex1, Param()); + ASIO_CHECK(result1 == ExpectedResult()); +} + +template <typename Executor, typename Param, bool ExpectedResult> +void test_can_require() +{ + constexpr bool b1 = + asio::can_require<Executor, Param>::value; + ASIO_CHECK(b1 == ExpectedResult); + + constexpr bool b2 = + asio::can_require<const Executor, Param>::value; + ASIO_CHECK(b2 == ExpectedResult); + + constexpr bool b3 = + asio::can_require<Executor&, Param>::value; + ASIO_CHECK(b3 == ExpectedResult); + + constexpr bool b4 = + asio::can_require<const Executor&, Param>::value; + ASIO_CHECK(b4 == ExpectedResult); +} + +template <typename Executor, typename Param, typename ExpectedResult> +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()); + + const Executor ex2 = {}; + ASIO_CHECK( + asio::query( + asio::require(ex2, Param()), + Param()) == ExpectedResult()); +} + +template <typename Executor, typename Param, bool ExpectedResult> +void test_can_prefer() +{ + constexpr bool b1 = + asio::can_prefer<Executor, Param>::value; + ASIO_CHECK(b1 == ExpectedResult); + + constexpr bool b2 = + asio::can_prefer<const Executor, Param>::value; + ASIO_CHECK(b2 == ExpectedResult); + + constexpr bool b3 = + asio::can_prefer<Executor&, Param>::value; + ASIO_CHECK(b3 == ExpectedResult); + + constexpr bool b4 = + asio::can_prefer<const Executor&, Param>::value; + ASIO_CHECK(b4 == ExpectedResult); +} + +template <typename Executor, typename Param, typename ExpectedResult> +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); + ASIO_CHECK(s() != exec::blocking.possibly); + ASIO_CHECK(s() != exec::blocking.always); + ASIO_CHECK(s() != exec::blocking.never); + ASIO_CHECK(n1() == exec::blocking.possibly); + ASIO_CHECK(n1() != exec::blocking.always); + ASIO_CHECK(n1() != exec::blocking.never); + ASIO_CHECK(n2() == exec::blocking.always); + ASIO_CHECK(n2() != exec::blocking.possibly); + ASIO_CHECK(n2() != exec::blocking.never); + ASIO_CHECK(n3() == exec::blocking.never); + ASIO_CHECK(n3() != exec::blocking.possibly); + ASIO_CHECK(n3() != exec::blocking.always); +} + +ASIO_TEST_SUITE +( + "blocking", + + ASIO_TEST_CASE3(test_can_query<ex_nq_nr, s, true>) + ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n1, true>) + ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n2, false>) + ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n3, false>) + + ASIO_TEST_CASE3(test_query<ex_nq_nr, s, n1>) + ASIO_TEST_CASE3(test_query<ex_nq_nr, n1, n1>) + + ASIO_TEST_CASE3(test_constexpr_query<ex_nq_nr, s, n1>) + ASIO_TEST_CASE3(test_constexpr_query<ex_nq_nr, n1, n1>) + + ASIO_TEST_CASE3(test_can_require<ex_nq_nr, s, false>) + ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n1, true>) + ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n2, false>) + ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n3, false>) + + ASIO_TEST_CASE3(test_require<ex_nq_nr, n1, n1>) + + ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, s, false>) + ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n1, true>) + ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n2, false>) + ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n3, true>) + + ASIO_TEST_CASE3(test_prefer<ex_nq_nr, n1, n1>) + ASIO_TEST_CASE3(test_prefer<ex_nq_nr, n3, n1>) + + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n3, s, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n3, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n3, s, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n3, s, n3>, n3, true>) + + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n3>, n2, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n3>, n3, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n3>, n1, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n3>, n2, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n1>, n3, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n2>, n3, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n3>, n3, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n3, s, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n3, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n3, s, n3>, n2, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n3, s, n3>, n3, n3>) + + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n3>, s, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n3>, n2, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n3>, n3, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n1>, s, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n2>, s, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n3>, s, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n3>, n1, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n1>, s, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n2>, s, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n3>, s, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n3>, n2, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n1>, s, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n1>, n3, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n2>, s, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n2>, n3, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n3>, s, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n3>, n3, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n3, s, n3>, s, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n3, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n3, s, n3>, n2, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n3, s, n3>, n3, n3>) + + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n3, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n3, s, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n3, s, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n3, s, n3>, n3, true>) + + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n3>, n3, n3>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n3, n3>, n3, n3>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<n2, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<n3, s, n3>, n3, n3>) + + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n3, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n3, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n3, s, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n3, s, n3>, n3, true>) + + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n1, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n2, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n3, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n3, s, n3>, n3, n3>) + + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n3, s, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n3, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n3, s, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n3, s, n3>, n3, true>) + + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n3>, n2, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n3>, n3, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n3>, n1, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n3>, n2, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n1>, n3, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n2>, n3, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n3>, n3, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n3, s, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n3, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n3, s, n3>, n2, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n3, s, n3>, n3, n3>) + + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n3, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n3, s, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n3, s, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n3, s, n3>, n3, false>) + + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n3, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n3, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n3, s, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n3, s, n3>, n3, true>) + + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n1, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n2, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n3, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n3, s, n3>, n3, n3>) + + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n3, s, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n3, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n3, s, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n3, s, n3>, n3, true>) + + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n3>, n2, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n3>, n3, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n3>, n1, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n3>, n2, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n1>, n3, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n2>, n3, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n3>, n3, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n3, s, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n3, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n3, s, n3>, n2, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n3, s, n3>, n3, n3>) + + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n3, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n3, s, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n3, s, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n3, s, n3>, n3, false>) + + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n3, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n3, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n3, s, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n3, s, n3>, n3, true>) + + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n1, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n2, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n3, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n3, s, n3>, n3, n3>) + + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n3, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n3, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n3>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n3>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n3>, n2, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n3, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n3, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n3>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n3>, n1, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n3>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n1>, n3, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n2>, n3, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n3>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n3>, n1, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n3>, n2, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n3>, n3, true>) + + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n1>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n2>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n3>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n3>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n1>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n2>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n2>, n2, n2>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n3>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n3>, n2, n2>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n1>, s, n3>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n1>, n3, n3>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n2>, s, n3>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n2>, n3, n3>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n3>, s, n3>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n3>, n3, n3>) + + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n3, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n3, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n3>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n3>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n3>, n2, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n3, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n3, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n3>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n3>, n1, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n3>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n1>, n3, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n2>, n3, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n3>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n3>, n1, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n3>, n2, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n3>, n3, true>) + + ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n2>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n3>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n3>, n3, n3>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n2>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n3>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n3>, n3, n3>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n3, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n3, n1>, n3, n3>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n3, n2>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n3, n2>, n3, n3>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n3, n3>, n3, n3>) + + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n3>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n3>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n3>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n3>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n3>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n3>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n1>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n2>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n2>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n3>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n3>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n3>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n3>, n3, true>) + + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n1>, n3, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n2>, n3, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n3>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n3>, n3, n3>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n1>, n3, n2>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n2>, n1, n2>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n2>, n3, n2>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n3>, n1, n2>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n3>, n3, n3>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n1>, n3, n3>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n2>, n1, n3>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n2>, n3, n3>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n3>, n1, n3>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n3>, n3, n3>) + + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n3, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n3, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n3>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n3>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n3>, n2, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n3, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n3, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n3>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n3>, n1, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n3>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n1>, n3, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n2>, n3, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n3>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n3>, n1, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n3>, n2, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n3>, n3, true>) + + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n1>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n2>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n3>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n3>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n1>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n2>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n2>, n2, n2>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n3>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n3>, n2, n2>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n1>, s, n3>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n1>, n3, n3>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n2>, s, n3>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n2>, n3, n3>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n3>, s, n3>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n3>, n3, n3>) + + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n3, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n3, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n3>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n3>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n3>, n2, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n3, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n3, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n3>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n3>, n1, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n3>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n1>, n3, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n2>, n3, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n3>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n3>, n1, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n3>, n2, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n3>, n3, true>) + + ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n2>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n3>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n3>, n3, n3>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n2>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n3>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n3>, n3, n3>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n3, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n3, n1>, n3, n3>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n3, n2>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n3, n2>, n3, n3>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n3, n3>, n3, n3>) + + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n3>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n3>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n3>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n3>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n3>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n3>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n1>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n2>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n2>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n3>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n3>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n3>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n3>, n3, true>) + + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n1>, n3, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n2>, n3, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n3>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n3>, n3, n3>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n1>, n3, n2>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n2>, n1, n2>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n2>, n3, n2>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n3>, n1, n2>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n3>, n3, n3>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n1>, n3, n3>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n2>, n1, n3>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n2>, n3, n3>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n3>, n1, n3>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n3>, n3, n3>) + + ASIO_TEST_CASE(test_vars) +) diff --git a/3rdparty/asio/src/tests/unit/execution/blocking_adaptation.cpp b/3rdparty/asio/src/tests/unit/execution/blocking_adaptation.cpp new file mode 100644 index 00000000000..b6e77dd31a9 --- /dev/null +++ b/3rdparty/asio/src/tests/unit/execution/blocking_adaptation.cpp @@ -0,0 +1,1323 @@ +// +// 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 <typename F> + 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<ex_nq_nr> +{ + 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 <typename Function> +struct execute_member<ex_nq_nr, 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) + +} // namespace traits +} // namespace asio + +template <typename ResultType, typename ParamType, typename Result> +struct ex_cq_nr +{ + static constexpr ResultType query(ParamType) noexcept + { + return Result(); + } + + template <typename F> + 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 <typename ResultType, typename ParamType, typename Result> +struct equality_comparable<ex_cq_nr<ResultType, ParamType, Result> > +{ + 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 <typename ResultType, typename ParamType, + typename Result, typename Function> +struct execute_member<ex_cq_nr<ResultType, ParamType, Result>, 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 <typename ResultType, typename ParamType, + typename Result, typename Param> +struct query_static_constexpr_member< + ex_cq_nr<ResultType, ParamType, Result>, Param, + typename asio::enable_if< + asio::is_convertible<Param, ParamType>::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 <typename ResultType, typename ParamType, typename Result> +struct ex_mq_nr +{ + ResultType query(ParamType) const noexcept + { + return Result(); + } + + template <typename F> + 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 <typename ResultType, typename ParamType, typename Result> +struct equality_comparable<ex_mq_nr<ResultType, ParamType, Result> > +{ + 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 <typename ResultType, typename ParamType, + typename Result, typename Function> +struct execute_member<ex_mq_nr<ResultType, ParamType, Result>, 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 <typename ResultType, typename ParamType, + typename Result, typename Param> +struct query_member< + ex_mq_nr<ResultType, ParamType, Result>, Param, + typename asio::enable_if< + asio::is_convertible<Param, ParamType>::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 <typename ResultType, typename ParamType, typename Result> +struct ex_fq_nr +{ + friend ResultType query(const ex_fq_nr&, ParamType) noexcept + { + return Result(); + } + + template <typename F> + 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 <typename ResultType, typename ParamType, typename Result> +struct equality_comparable<ex_fq_nr<ResultType, ParamType, Result> > +{ + 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 <typename ResultType, typename ParamType, + typename Result, typename Function> +struct execute_member<ex_fq_nr<ResultType, ParamType, Result>, 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 <typename ResultType, typename ParamType, + typename Result, typename Param> +struct query_free< + ex_fq_nr<ResultType, ParamType, Result>, Param, + typename asio::enable_if< + asio::is_convertible<Param, ParamType>::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 <typename CurrentType, typename OtherType> +struct ex_mq_mr +{ + CurrentType query(CurrentType) const noexcept + { + return CurrentType(); + } + + CurrentType query(OtherType) const noexcept + { + return CurrentType(); + } + + ex_mq_mr<CurrentType, OtherType> require( + CurrentType) const noexcept + { + return ex_mq_mr<CurrentType, OtherType>(); + } + + ex_mq_mr<OtherType, CurrentType> require( + OtherType) const noexcept + { + return ex_mq_mr<OtherType, CurrentType>(); + } + + template <typename F> + 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 <typename CurrentType> +struct ex_mq_mr<CurrentType, CurrentType> +{ + CurrentType query(CurrentType) const noexcept + { + return CurrentType(); + } + + ex_mq_mr<CurrentType, CurrentType> require( + CurrentType) const noexcept + { + return ex_mq_mr<CurrentType, CurrentType>(); + } + + template <typename F> + 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 <typename CurrentType, typename OtherType> +struct equality_comparable<ex_mq_mr<CurrentType, OtherType> > +{ + 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 <typename CurrentType, typename OtherType, typename Function> +struct execute_member<ex_mq_mr<CurrentType, OtherType>, 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 <typename CurrentType, typename OtherType, typename Param> +struct query_member< + ex_mq_mr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + || asio::is_convertible<Param, OtherType>::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 <typename CurrentType, typename OtherType, typename Param> +struct require_member< + ex_mq_mr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_mq_mr<CurrentType, OtherType> result_type; +}; + +template <typename CurrentType, typename OtherType, typename Param> +struct require_member< + ex_mq_mr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, OtherType>::value + && !asio::is_same<CurrentType, OtherType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_mq_mr<OtherType, CurrentType> result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT) + +} // namespace traits +} // namespace asio + +template <typename CurrentType, typename OtherType> +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<CurrentType, OtherType> require( + const ex_fq_fr&, CurrentType) noexcept + { + return ex_fq_fr<CurrentType, OtherType>(); + } + + friend ex_fq_fr<OtherType, CurrentType> require( + const ex_fq_fr&, OtherType) noexcept + { + return ex_fq_fr<OtherType, CurrentType>(); + } + + friend ex_fq_fr<CurrentType, OtherType> prefer( + const ex_fq_fr&, CurrentType) noexcept + { + return ex_fq_fr<CurrentType, OtherType>(); + } + + friend ex_fq_fr<OtherType, CurrentType> prefer( + const ex_fq_fr&, OtherType) noexcept + { + return ex_fq_fr<OtherType, CurrentType>(); + } + + template <typename F> + 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 <typename CurrentType> +struct ex_fq_fr<CurrentType, CurrentType> +{ + friend CurrentType query(const ex_fq_fr&, CurrentType) noexcept + { + return CurrentType(); + } + + friend ex_fq_fr<CurrentType, CurrentType> require( + const ex_fq_fr&, CurrentType) noexcept + { + return ex_fq_fr<CurrentType, CurrentType>(); + } + + friend ex_fq_fr<CurrentType, CurrentType> prefer( + const ex_fq_fr&, CurrentType) noexcept + { + return ex_fq_fr<CurrentType, CurrentType>(); + } + + template <typename F> + 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 <typename CurrentType, typename OtherType> +struct equality_comparable<ex_fq_fr<CurrentType, OtherType> > +{ + 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 <typename CurrentType, typename OtherType, typename Function> +struct execute_member<ex_fq_fr<CurrentType, OtherType>, 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 <typename CurrentType, typename OtherType, typename Param> +struct query_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + || asio::is_convertible<Param, OtherType>::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 <typename CurrentType, typename OtherType, typename Param> +struct require_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_fq_fr<CurrentType, OtherType> result_type; +}; + +template <typename CurrentType, typename OtherType, typename Param> +struct require_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, OtherType>::value + && !asio::is_same<CurrentType, OtherType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_fq_fr<OtherType, CurrentType> result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT) + +#if !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT) + +template <typename CurrentType, typename OtherType, typename Param> +struct prefer_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_fq_fr<CurrentType, OtherType> result_type; +}; + +template <typename CurrentType, typename OtherType, typename Param> +struct prefer_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, OtherType>::value + && !asio::is_same<CurrentType, OtherType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_fq_fr<OtherType, CurrentType> result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT) + +} // namespace traits +} // namespace asio + +template <typename Executor, typename Param, bool ExpectedResult> +void test_can_query() +{ + constexpr bool b1 = + asio::can_query<Executor, Param>::value; + ASIO_CHECK(b1 == ExpectedResult); + + constexpr bool b2 = + asio::can_query<const Executor, Param>::value; + ASIO_CHECK(b2 == ExpectedResult); + + constexpr bool b3 = + asio::can_query<Executor&, Param>::value; + ASIO_CHECK(b3 == ExpectedResult); + + constexpr bool b4 = + asio::can_query<const Executor&, Param>::value; + ASIO_CHECK(b4 == ExpectedResult); +} + +template <typename Executor, typename Param, typename ExpectedResult> +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 <typename Executor, typename Param, typename ExpectedResult> +void test_constexpr_query() +{ + constexpr Executor ex1 = {}; + constexpr exec::blocking_adaptation_t result1 = asio::query(ex1, Param()); + ASIO_CHECK(result1 == ExpectedResult()); +} + +template <typename Executor, typename Param, bool ExpectedResult> +void test_can_require() +{ + constexpr bool b1 = + asio::can_require<Executor, Param>::value; + ASIO_CHECK(b1 == ExpectedResult); + + constexpr bool b2 = + asio::can_require<const Executor, Param>::value; + ASIO_CHECK(b2 == ExpectedResult); + + constexpr bool b3 = + asio::can_require<Executor&, Param>::value; + ASIO_CHECK(b3 == ExpectedResult); + + constexpr bool b4 = + asio::can_require<const Executor&, Param>::value; + ASIO_CHECK(b4 == ExpectedResult); +} + +void do_nothing() +{ +} + +template <typename Executor, typename Param, typename ExpectedResult> +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<Executor&, Param>::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<const Executor&, Param>::type + >::type + >::value)); +} + +template <typename Executor, typename Param, bool ExpectedResult> +void test_can_prefer() +{ + constexpr bool b1 = + asio::can_prefer<Executor, Param>::value; + ASIO_CHECK(b1 == ExpectedResult); + + constexpr bool b2 = + asio::can_prefer<const Executor, Param>::value; + ASIO_CHECK(b2 == ExpectedResult); + + constexpr bool b3 = + asio::can_prefer<Executor&, Param>::value; + ASIO_CHECK(b3 == ExpectedResult); + + constexpr bool b4 = + asio::can_prefer<const Executor&, Param>::value; + ASIO_CHECK(b4 == ExpectedResult); +} + +template <typename Executor, typename Param, typename ExpectedResult> +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<ex_nq_nr, s, true>) + ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n1, true>) + ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n2, false>) + + ASIO_TEST_CASE3(test_query<ex_nq_nr, s, n1>) + ASIO_TEST_CASE3(test_query<ex_nq_nr, n1, n1>) + + ASIO_TEST_CASE3(test_constexpr_query<ex_nq_nr, s, n1>) + ASIO_TEST_CASE3(test_constexpr_query<ex_nq_nr, n1, n1>) + + ASIO_TEST_CASE3(test_can_require<ex_nq_nr, s, false>) + ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n1, true>) + ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n2, true>) + + ASIO_TEST_CASE3(test_require<ex_nq_nr, n1, n1>) + ASIO_TEST_CASE3(test_require<ex_nq_nr, n2, n2>) + + ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, s, false>) + ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n1, true>) + ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n2, false>) + + ASIO_TEST_CASE3(test_prefer<ex_nq_nr, n1, n1>) + + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n2, true>) + + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n1>, s, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n2>, s, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n1>, s, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n2>, s, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n2, true>) + + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n1>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n1, n1>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n1, n2>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n2, n1>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<n1, s, n1>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n2, false>) + + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n2, s, n2>, n1, n2>) + + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n2, true>) + + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n2, true>) + + ASIO_TEST_CASE5(test_require<ex_mq_nr<s, s, n1>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_mq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_mq_nr<s, n1, n1>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_mq_nr<s, n1, n2>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_mq_nr<s, n2, n1>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_mq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_mq_nr<n1, s, n1>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_mq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n2, false>) + + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n2, s, n2>, n1, n2>) + + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n2, true>) + + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n2, true>) + + ASIO_TEST_CASE5(test_require<ex_fq_nr<s, s, n1>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_fq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_fq_nr<s, n1, n1>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_fq_nr<s, n1, n2>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_fq_nr<s, n2, n1>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_fq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_fq_nr<n1, s, n1>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_fq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n2, false>) + + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n2, s, n2>, n1, n2>) + + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n2, true>) + + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n1>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n2>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n1>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n2>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n2>, n2, n2>) + + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n2, true>) + + ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n1>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n2>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n2>, n2, n2>) + + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n2, false>) + + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n2>, n1, n2>) + + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n2, true>) + + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n1>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n2>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n1>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n2>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n2>, n2, n2>) + + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n2, true>) + + ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n1>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n2>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n2>, n2, n2>) + + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n2, false>) + + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n2>, n1, n2>) + + ASIO_TEST_CASE(test_vars) +) diff --git a/3rdparty/asio/src/tests/unit/execution/context_as.cpp b/3rdparty/asio/src/tests/unit/execution/context_as.cpp new file mode 100644 index 00000000000..13311ba262b --- /dev/null +++ b/3rdparty/asio/src/tests/unit/execution/context_as.cpp @@ -0,0 +1,147 @@ +// +// context_as.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/context_as.hpp" + +#include <functional> +#include "asio/execution/any_executor.hpp" +#include "asio/io_context.hpp" +#include "asio/static_thread_pool.hpp" +#include "../unit_test.hpp" + +using namespace asio; +namespace bindns = std; + +void context_as_executor_query_test() +{ + static_thread_pool pool(1); + + ASIO_CHECK( + &asio::query(pool.executor(), + execution::context_as_t<static_thread_pool&>()) + == &pool); + + execution::any_executor< + execution::context_as_t<static_thread_pool&> + > ex1 = pool.executor(); + + ASIO_CHECK( + &asio::query(ex1, + execution::context_as_t<static_thread_pool&>()) + == &pool); + + ASIO_CHECK( + &asio::query(ex1, execution::context) + == &pool); + + ASIO_CHECK( + &asio::query(pool.executor(), + execution::context_as_t<const static_thread_pool&>()) + == &pool); + + execution::any_executor< + execution::context_as_t<const static_thread_pool&> + > ex2 = pool.executor(); + + ASIO_CHECK( + &asio::query(ex2, + execution::context_as_t<const static_thread_pool&>()) + == &pool); + + ASIO_CHECK( + &asio::query(ex2, execution::context) + == &pool); + + io_context io_ctx; + + ASIO_CHECK( + &asio::query(io_ctx.get_executor(), + execution::context_as_t<io_context&>()) + == &io_ctx); + + execution::any_executor< + execution::context_as_t<io_context&> + > ex3 = io_ctx.get_executor(); + + ASIO_CHECK( + &asio::query(ex3, + execution::context_as_t<io_context&>()) + == &io_ctx); + + ASIO_CHECK( + &asio::query(ex3, execution::context) + == &io_ctx); + + ASIO_CHECK( + &asio::query(io_ctx.get_executor(), + execution::context_as_t<const io_context&>()) + == &io_ctx); + + execution::any_executor< + execution::context_as_t<const io_context&> + > ex4 = io_ctx.get_executor(); + + ASIO_CHECK( + &asio::query(ex4, + execution::context_as_t<const io_context&>()) + == &io_ctx); + + ASIO_CHECK( + &asio::query(ex4, execution::context) + == &io_ctx); + + ASIO_CHECK( + &asio::query(io_ctx.get_executor(), + execution::context_as_t<execution_context&>()) + == &io_ctx); + + execution::any_executor< + execution::context_as_t<execution_context&> + > ex5 = io_ctx.get_executor(); + + ASIO_CHECK( + &asio::query(ex5, + execution::context_as_t<execution_context&>()) + == &io_ctx); + + ASIO_CHECK( + &asio::query(ex5, execution::context) + == &io_ctx); + + ASIO_CHECK( + &asio::query(io_ctx.get_executor(), + execution::context_as_t<const execution_context&>()) + == &io_ctx); + + execution::any_executor< + execution::context_as_t<const execution_context&> + > ex6 = io_ctx.get_executor(); + + ASIO_CHECK( + &asio::query(ex6, + execution::context_as_t<const execution_context&>()) + == &io_ctx); + + ASIO_CHECK( + &asio::query(ex6, execution::context) + == &io_ctx); +} + +ASIO_TEST_SUITE +( + "context_as", + ASIO_TEST_CASE(context_as_executor_query_test) +) diff --git a/3rdparty/asio/src/tests/unit/execution/executor.cpp b/3rdparty/asio/src/tests/unit/execution/executor.cpp new file mode 100644 index 00000000000..8b02622bdca --- /dev/null +++ b/3rdparty/asio/src/tests/unit/execution/executor.cpp @@ -0,0 +1,106 @@ +// +// executor.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/executor.hpp" + +#include "../unit_test.hpp" + +struct not_an_executor +{ +}; + +struct executor +{ + executor() + { + } + + executor(const executor&) noexcept + { + } + + executor(executor&&) noexcept + { + } + + template <typename F> + void execute(F&& f) const noexcept + { + (void)f; + } + + bool operator==(const executor&) const noexcept + { + return true; + } + + bool operator!=(const executor&) const noexcept + { + return false; + } +}; + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) + +template <typename F> +struct execute_member<executor, F> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + typedef void result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT) +#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) + +template <> +struct equality_comparable<executor> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) + +} // namespace traits +} // namespace asio + +void is_executor_test() +{ + ASIO_CHECK(( + !asio::execution::is_executor< + void + >::value)); + + ASIO_CHECK(( + !asio::execution::is_executor< + not_an_executor + >::value)); + + ASIO_CHECK(( + asio::execution::is_executor< + executor + >::value)); +} + +ASIO_TEST_SUITE +( + "executor", + ASIO_TEST_CASE(is_executor_test) +) diff --git a/3rdparty/asio/src/tests/unit/execution/invocable_archetype.cpp b/3rdparty/asio/src/tests/unit/execution/invocable_archetype.cpp new file mode 100644 index 00000000000..5dbfb94d9f4 --- /dev/null +++ b/3rdparty/asio/src/tests/unit/execution/invocable_archetype.cpp @@ -0,0 +1,25 @@ +// +// invocable_archetype.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/invocable_archetype.hpp" + +#include "../unit_test.hpp" + +ASIO_TEST_SUITE +( + "invocable_archetype", + ASIO_TEST_CASE(null_test) +) diff --git a/3rdparty/asio/src/tests/unit/execution/mapping.cpp b/3rdparty/asio/src/tests/unit/execution/mapping.cpp new file mode 100644 index 00000000000..399aae3ea90 --- /dev/null +++ b/3rdparty/asio/src/tests/unit/execution/mapping.cpp @@ -0,0 +1,1985 @@ +// +// mapping.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/mapping.hpp" + +#include "asio/prefer.hpp" +#include "asio/query.hpp" +#include "asio/require.hpp" +#include "../unit_test.hpp" + +namespace exec = asio::execution; + +typedef exec::mapping_t s; +typedef exec::mapping_t::thread_t n1; +typedef exec::mapping_t::new_thread_t n2; +typedef exec::mapping_t::other_t n3; + +struct ex_nq_nr +{ + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <> +struct is_executor<ex_nq_nr> : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +template <typename ResultType, typename ParamType, typename Result> +struct ex_cq_nr +{ + static constexpr ResultType query(ParamType) noexcept + { + return Result(); + } + + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <typename ResultType, typename ParamType, typename Result> +struct is_executor<ex_cq_nr<ResultType, ParamType, Result> > + : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT) + +template <typename ResultType, typename ParamType, + typename Result, typename Param> +struct query_static_constexpr_member< + ex_cq_nr<ResultType, ParamType, Result>, Param, + typename asio::enable_if< + asio::is_convertible<Param, ParamType>::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 <typename ResultType, typename ParamType, typename Result> +struct ex_mq_nr +{ + ResultType query(ParamType) const noexcept + { + return Result(); + } + + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <typename ResultType, typename ParamType, typename Result> +struct is_executor<ex_mq_nr<ResultType, ParamType, Result> > + : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT) + +template <typename ResultType, typename ParamType, + typename Result, typename Param> +struct query_member< + ex_mq_nr<ResultType, ParamType, Result>, Param, + typename asio::enable_if< + asio::is_convertible<Param, ParamType>::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 <typename ResultType, typename ParamType, typename Result> +struct ex_fq_nr +{ + friend ResultType query(const ex_fq_nr&, ParamType) noexcept + { + return Result(); + } + + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <typename ResultType, typename ParamType, typename Result> +struct is_executor<ex_fq_nr<ResultType, ParamType, Result> > + : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT) + +template <typename ResultType, typename ParamType, + typename Result, typename Param> +struct query_free< + ex_fq_nr<ResultType, ParamType, Result>, Param, + typename asio::enable_if< + asio::is_convertible<Param, ParamType>::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 <typename CurrentType, typename OtherType> +struct ex_mq_mr +{ + CurrentType query(CurrentType) const noexcept + { + return CurrentType(); + } + + CurrentType query(OtherType) const noexcept + { + return CurrentType(); + } + + ex_mq_mr<CurrentType, OtherType> require( + CurrentType) const noexcept + { + return ex_mq_mr<CurrentType, OtherType>(); + } + + ex_mq_mr<OtherType, CurrentType> require( + OtherType) const noexcept + { + return ex_mq_mr<OtherType, CurrentType>(); + } + + template <typename F> + 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 <typename CurrentType> +struct ex_mq_mr<CurrentType, CurrentType> +{ + CurrentType query(CurrentType) const noexcept + { + return CurrentType(); + } + + ex_mq_mr<CurrentType, CurrentType> require( + CurrentType) const noexcept + { + return ex_mq_mr<CurrentType, CurrentType>(); + } + + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <typename CurrentType, typename OtherType> +struct is_executor<ex_mq_mr<CurrentType, OtherType> > + : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT) + +template <typename CurrentType, typename OtherType, typename Param> +struct query_member< + ex_mq_mr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + || asio::is_convertible<Param, OtherType>::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 <typename CurrentType, typename OtherType, typename Param> +struct require_member< + ex_mq_mr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_mq_mr<CurrentType, OtherType> result_type; +}; + +template <typename CurrentType, typename OtherType, typename Param> +struct require_member< + ex_mq_mr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, OtherType>::value + && !asio::is_same<CurrentType, OtherType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_mq_mr<OtherType, CurrentType> result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT) + +} // namespace traits +} // namespace asio + +template <typename CurrentType, typename OtherType> +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<CurrentType, OtherType> require( + const ex_fq_fr&, CurrentType) noexcept + { + return ex_fq_fr<CurrentType, OtherType>(); + } + + friend ex_fq_fr<OtherType, CurrentType> require( + const ex_fq_fr&, OtherType) noexcept + { + return ex_fq_fr<OtherType, CurrentType>(); + } + + friend ex_fq_fr<CurrentType, OtherType> prefer( + const ex_fq_fr&, CurrentType) noexcept + { + return ex_fq_fr<CurrentType, OtherType>(); + } + + friend ex_fq_fr<OtherType, CurrentType> prefer( + const ex_fq_fr&, OtherType) noexcept + { + return ex_fq_fr<OtherType, CurrentType>(); + } + + template <typename F> + 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 <typename CurrentType> +struct ex_fq_fr<CurrentType, CurrentType> +{ + friend CurrentType query(const ex_fq_fr&, CurrentType) noexcept + { + return CurrentType(); + } + + friend ex_fq_fr<CurrentType, CurrentType> require( + const ex_fq_fr&, CurrentType) noexcept + { + return ex_fq_fr<CurrentType, CurrentType>(); + } + + friend ex_fq_fr<CurrentType, CurrentType> prefer( + const ex_fq_fr&, CurrentType) noexcept + { + return ex_fq_fr<CurrentType, CurrentType>(); + } + + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <typename CurrentType, typename OtherType> +struct is_executor<ex_fq_fr<CurrentType, OtherType> > + : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT) + +template <typename CurrentType, typename OtherType, typename Param> +struct query_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + || asio::is_convertible<Param, OtherType>::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 <typename CurrentType, typename OtherType, typename Param> +struct require_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_fq_fr<CurrentType, OtherType> result_type; +}; + +template <typename CurrentType, typename OtherType, typename Param> +struct require_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, OtherType>::value + && !asio::is_same<CurrentType, OtherType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_fq_fr<OtherType, CurrentType> result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT) + +#if !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT) + +template <typename CurrentType, typename OtherType, typename Param> +struct prefer_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_fq_fr<CurrentType, OtherType> result_type; +}; + +template <typename CurrentType, typename OtherType, typename Param> +struct prefer_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, OtherType>::value + && !asio::is_same<CurrentType, OtherType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_fq_fr<OtherType, CurrentType> result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT) + +} // namespace traits +} // namespace asio + +template <typename Executor, typename Param, bool ExpectedResult> +void test_can_query() +{ + constexpr bool b1 = + asio::can_query<Executor, Param>::value; + ASIO_CHECK(b1 == ExpectedResult); + + constexpr bool b2 = + asio::can_query<const Executor, Param>::value; + ASIO_CHECK(b2 == ExpectedResult); + + constexpr bool b3 = + asio::can_query<Executor&, Param>::value; + ASIO_CHECK(b3 == ExpectedResult); + + constexpr bool b4 = + asio::can_query<const Executor&, Param>::value; + ASIO_CHECK(b4 == ExpectedResult); +} + +template <typename Executor, typename Param, typename ExpectedResult> +void test_query() +{ + exec::mapping_t result1 = asio::query(Executor(), Param()); + ASIO_CHECK(result1 == ExpectedResult()); + + Executor ex1 = {}; + exec::mapping_t result2 = asio::query(ex1, Param()); + ASIO_CHECK(result2 == ExpectedResult()); + + const Executor ex2 = {}; + exec::mapping_t result3 = asio::query(ex2, Param()); + ASIO_CHECK(result3 == ExpectedResult()); +} + +template <typename Executor, typename Param, typename ExpectedResult> +void test_constexpr_query() +{ + constexpr Executor ex1 = {}; + constexpr exec::mapping_t result1 = asio::query(ex1, Param()); + ASIO_CHECK(result1 == ExpectedResult()); +} + +template <typename Executor, typename Param, bool ExpectedResult> +void test_can_require() +{ + constexpr bool b1 = + asio::can_require<Executor, Param>::value; + ASIO_CHECK(b1 == ExpectedResult); + + constexpr bool b2 = + asio::can_require<const Executor, Param>::value; + ASIO_CHECK(b2 == ExpectedResult); + + constexpr bool b3 = + asio::can_require<Executor&, Param>::value; + ASIO_CHECK(b3 == ExpectedResult); + + constexpr bool b4 = + asio::can_require<const Executor&, Param>::value; + ASIO_CHECK(b4 == ExpectedResult); +} + +template <typename Executor, typename Param, typename ExpectedResult> +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()); + + const Executor ex2 = {}; + ASIO_CHECK( + asio::query( + asio::require(ex2, Param()), + Param()) == ExpectedResult()); +} + +template <typename Executor, typename Param, bool ExpectedResult> +void test_can_prefer() +{ + constexpr bool b1 = + asio::can_prefer<Executor, Param>::value; + ASIO_CHECK(b1 == ExpectedResult); + + constexpr bool b2 = + asio::can_prefer<const Executor, Param>::value; + ASIO_CHECK(b2 == ExpectedResult); + + constexpr bool b3 = + asio::can_prefer<Executor&, Param>::value; + ASIO_CHECK(b3 == ExpectedResult); + + constexpr bool b4 = + asio::can_prefer<const Executor&, Param>::value; + ASIO_CHECK(b4 == ExpectedResult); +} + +template <typename Executor, typename Param, typename ExpectedResult> +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::mapping); + ASIO_CHECK(s() != exec::mapping.thread); + ASIO_CHECK(s() != exec::mapping.new_thread); + ASIO_CHECK(s() != exec::mapping.other); + ASIO_CHECK(n1() == exec::mapping.thread); + ASIO_CHECK(n1() != exec::mapping.new_thread); + ASIO_CHECK(n1() != exec::mapping.other); + ASIO_CHECK(n2() == exec::mapping.new_thread); + ASIO_CHECK(n2() != exec::mapping.thread); + ASIO_CHECK(n2() != exec::mapping.other); + ASIO_CHECK(n3() == exec::mapping.other); + ASIO_CHECK(n3() != exec::mapping.thread); + ASIO_CHECK(n3() != exec::mapping.new_thread); +} + +ASIO_TEST_SUITE +( + "mapping", + + ASIO_TEST_CASE3(test_can_query<ex_nq_nr, s, true>) + ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n1, true>) + ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n2, false>) + ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n3, false>) + + ASIO_TEST_CASE3(test_query<ex_nq_nr, s, n1>) + ASIO_TEST_CASE3(test_query<ex_nq_nr, n1, n1>) + + ASIO_TEST_CASE3(test_constexpr_query<ex_nq_nr, s, n1>) + ASIO_TEST_CASE3(test_constexpr_query<ex_nq_nr, n1, n1>) + + ASIO_TEST_CASE3(test_can_require<ex_nq_nr, s, false>) + ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n1, true>) + ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n2, false>) + ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n3, false>) + + ASIO_TEST_CASE3(test_require<ex_nq_nr, n1, n1>) + + ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, s, false>) + ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n1, true>) + ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n2, true>) + ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n3, true>) + + ASIO_TEST_CASE3(test_prefer<ex_nq_nr, n1, n1>) + ASIO_TEST_CASE3(test_prefer<ex_nq_nr, n2, n1>) + ASIO_TEST_CASE3(test_prefer<ex_nq_nr, n3, n1>) + + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n3, s, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n3, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n3, s, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n3, s, n3>, n3, true>) + + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n3>, n2, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n3>, n3, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n3>, n1, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n3>, n2, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n1>, n3, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n2>, n3, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n3>, n3, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n3, s, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n3, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n3, s, n3>, n2, n3>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n3, s, n3>, n3, n3>) + + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n3>, s, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n3>, n2, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n3>, n3, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n1>, s, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n2>, s, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n3>, s, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n3>, n1, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n1>, s, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n2>, s, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n3>, s, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n3>, n2, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n1>, s, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n1>, n3, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n2>, s, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n2>, n3, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n3>, s, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n3>, n3, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n3, s, n3>, s, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n3, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n3, s, n3>, n2, n3>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n3, s, n3>, n3, n3>) + + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n3, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n3, s, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n3, s, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n3, s, n3>, n3, true>) + + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n3>, n3, n3>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n3, n3>, n3, n3>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<n2, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<n3, s, n3>, n3, n3>) + + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n3, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n3, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n3, s, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n3, s, n3>, n3, true>) + + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n3>, n2, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n3>, n2, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n3>, n2, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n3>, n2, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n1, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n2, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n2, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n3, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n3, s, n3>, n2, n3>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n3, s, n3>, n3, n3>) + + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n3, s, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n3, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n3, s, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n3, s, n3>, n3, true>) + + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n3>, n2, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n3>, n3, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n3>, n1, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n3>, n2, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n1>, n3, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n2>, n3, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n3>, n3, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n3, s, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n3, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n3, s, n3>, n2, n3>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n3, s, n3>, n3, n3>) + + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n3, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n3, s, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n3, s, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n3, s, n3>, n3, false>) + + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n3, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n3, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n3, s, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n3, s, n3>, n3, true>) + + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n3>, n2, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n3>, n2, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n3>, n2, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n3>, n2, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n1, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n2, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n2, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n3, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n3, s, n3>, n2, n3>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n3, s, n3>, n3, n3>) + + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n3, s, n3>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n3, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n3, s, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n3, s, n3>, n3, true>) + + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n3>, n2, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n3>, n3, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n3>, n1, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n3>, n2, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n1>, n3, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n2>, n3, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n3>, n3, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n3, s, n3>, s, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n3, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n3, s, n3>, n2, n3>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n3, s, n3>, n3, n3>) + + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n3>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n3, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n3, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n3, s, n3>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n3, s, n3>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n3, s, n3>, n3, false>) + + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n3>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n3, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n3, s, n3>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n3, s, n3>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n3, s, n3>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n3, s, n3>, n3, true>) + + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n3>, n2, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n3>, n2, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n3>, n2, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n3>, n2, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n3>, n3, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n1, s, n1>, n3, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n2, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n2, s, n2>, n3, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n3, s, n3>, n1, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n3, s, n3>, n2, n3>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n3, s, n3>, n3, n3>) + + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n3, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n3, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n3>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n3>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n3>, n2, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n3, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n3, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n3>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n3>, n1, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n3>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n1>, n3, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n2>, n3, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n3>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n3>, n1, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n3>, n2, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n3>, n3, true>) + + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n1>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n2>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n3>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n3>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n1>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n2>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n2>, n2, n2>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n3>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n3>, n2, n2>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n1>, s, n3>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n1>, n3, n3>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n2>, s, n3>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n2>, n3, n3>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n3>, s, n3>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n3>, n3, n3>) + + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n3, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n3, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n3>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n3>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n3>, n2, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n3, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n3, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n3>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n3>, n1, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n3>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n1>, n3, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n2>, n3, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n3>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n3>, n1, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n3>, n2, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n3>, n3, true>) + + ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n2>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n3>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n3>, n3, n3>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n2>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n3>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n3>, n3, n3>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n3, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n3, n1>, n3, n3>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n3, n2>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n3, n2>, n3, n3>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n3, n3>, n3, n3>) + + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n3>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n3>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n3>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n3>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n3>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n3>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n1>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n2>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n3>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n3>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n3>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n3>, n3, true>) + + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n1>, n2, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n1>, n3, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n2>, n2, n2>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n2>, n3, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n3>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n3>, n2, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n3>, n3, n3>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n1>, n3, n2>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n2>, n1, n2>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n2>, n2, n2>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n2>, n3, n2>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n3>, n1, n2>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n3>, n2, n2>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n3>, n3, n3>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n1>, n2, n3>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n1>, n3, n3>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n2>, n1, n3>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n2>, n2, n2>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n2>, n3, n3>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n3>, n1, n3>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n3>, n2, n3>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n3>, n3, n3>) + + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n3, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n3, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n3>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n3>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n3>, n2, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n3, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n3, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n3>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n3>, n1, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n3>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n1>, n3, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n2>, n3, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n3>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n3>, n1, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n3>, n2, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n3>, n3, true>) + + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n1>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n2>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n3>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n3>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n1>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n2>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n2>, n2, n2>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n3>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n3>, n2, n2>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n1>, s, n3>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n1>, n3, n3>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n2>, s, n3>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n2>, n3, n3>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n3>, s, n3>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n3>, n3, n3>) + + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n3, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n3, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n3>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n3>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n3>, n2, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n3, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n3, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n3>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n3>, n1, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n3>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n1>, n3, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n2>, n3, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n3>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n3>, n1, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n3>, n2, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n3>, n3, true>) + + ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n2>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n3>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n3>, n3, n3>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n2>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n3>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n3>, n3, n3>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n3, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n3, n1>, n3, n3>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n3, n2>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n3, n2>, n3, n3>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n3, n3>, n3, n3>) + + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n3>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n3>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n3>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n3>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n3>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n3>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n3>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n1>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n2>, n3, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n3>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n3>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n3>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n3>, n3, true>) + + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n1>, n2, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n1>, n3, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n2>, n2, n2>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n2>, n3, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n3>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n3>, n2, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n3>, n3, n3>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n1>, n3, n2>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n2>, n1, n2>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n2>, n2, n2>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n2>, n3, n2>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n3>, n1, n2>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n3>, n2, n2>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n3>, n3, n3>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n1>, n2, n3>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n1>, n3, n3>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n2>, n1, n3>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n2>, n2, n2>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n2>, n3, n3>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n3>, n1, n3>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n3>, n2, n3>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n3>, n3, n3>) + + ASIO_TEST_CASE(test_vars) +) diff --git a/3rdparty/asio/src/tests/unit/execution/outstanding_work.cpp b/3rdparty/asio/src/tests/unit/execution/outstanding_work.cpp new file mode 100644 index 00000000000..cddd0b52c23 --- /dev/null +++ b/3rdparty/asio/src/tests/unit/execution/outstanding_work.cpp @@ -0,0 +1,1252 @@ +// +// outstanding_work.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/outstanding_work.hpp" + +#include "asio/prefer.hpp" +#include "asio/query.hpp" +#include "asio/require.hpp" +#include "../unit_test.hpp" + +namespace exec = asio::execution; + +typedef exec::outstanding_work_t s; +typedef exec::outstanding_work_t::untracked_t n1; +typedef exec::outstanding_work_t::tracked_t n2; + +struct ex_nq_nr +{ + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <> +struct is_executor<ex_nq_nr> : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +template <typename ResultType, typename ParamType, typename Result> +struct ex_cq_nr +{ + static constexpr ResultType query(ParamType) noexcept + { + return Result(); + } + + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <typename ResultType, typename ParamType, typename Result> +struct is_executor<ex_cq_nr<ResultType, ParamType, Result> > + : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT) + +template <typename ResultType, typename ParamType, + typename Result, typename Param> +struct query_static_constexpr_member< + ex_cq_nr<ResultType, ParamType, Result>, Param, + typename asio::enable_if< + asio::is_convertible<Param, ParamType>::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 <typename ResultType, typename ParamType, typename Result> +struct ex_mq_nr +{ + ResultType query(ParamType) const noexcept + { + return Result(); + } + + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <typename ResultType, typename ParamType, typename Result> +struct is_executor<ex_mq_nr<ResultType, ParamType, Result> > + : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT) + +template <typename ResultType, typename ParamType, + typename Result, typename Param> +struct query_member< + ex_mq_nr<ResultType, ParamType, Result>, Param, + typename asio::enable_if< + asio::is_convertible<Param, ParamType>::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 <typename ResultType, typename ParamType, typename Result> +struct ex_fq_nr +{ + friend ResultType query(const ex_fq_nr&, ParamType) noexcept + { + return Result(); + } + + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <typename ResultType, typename ParamType, typename Result> +struct is_executor<ex_fq_nr<ResultType, ParamType, Result> > + : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT) + +template <typename ResultType, typename ParamType, + typename Result, typename Param> +struct query_free< + ex_fq_nr<ResultType, ParamType, Result>, Param, + typename asio::enable_if< + asio::is_convertible<Param, ParamType>::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 <typename CurrentType, typename OtherType> +struct ex_mq_mr +{ + CurrentType query(CurrentType) const noexcept + { + return CurrentType(); + } + + CurrentType query(OtherType) const noexcept + { + return CurrentType(); + } + + ex_mq_mr<CurrentType, OtherType> require( + CurrentType) const noexcept + { + return ex_mq_mr<CurrentType, OtherType>(); + } + + ex_mq_mr<OtherType, CurrentType> require( + OtherType) const noexcept + { + return ex_mq_mr<OtherType, CurrentType>(); + } + + template <typename F> + 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 <typename CurrentType> +struct ex_mq_mr<CurrentType, CurrentType> +{ + CurrentType query(CurrentType) const noexcept + { + return CurrentType(); + } + + ex_mq_mr<CurrentType, CurrentType> require( + CurrentType) const noexcept + { + return ex_mq_mr<CurrentType, CurrentType>(); + } + + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <typename CurrentType, typename OtherType> +struct is_executor<ex_mq_mr<CurrentType, OtherType> > + : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT) + +template <typename CurrentType, typename OtherType, typename Param> +struct query_member< + ex_mq_mr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + || asio::is_convertible<Param, OtherType>::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 <typename CurrentType, typename OtherType, typename Param> +struct require_member< + ex_mq_mr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_mq_mr<CurrentType, OtherType> result_type; +}; + +template <typename CurrentType, typename OtherType, typename Param> +struct require_member< + ex_mq_mr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, OtherType>::value + && !asio::is_same<CurrentType, OtherType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_mq_mr<OtherType, CurrentType> result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT) + +} // namespace traits +} // namespace asio + +template <typename CurrentType, typename OtherType> +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<CurrentType, OtherType> require( + const ex_fq_fr&, CurrentType) noexcept + { + return ex_fq_fr<CurrentType, OtherType>(); + } + + friend ex_fq_fr<OtherType, CurrentType> require( + const ex_fq_fr&, OtherType) noexcept + { + return ex_fq_fr<OtherType, CurrentType>(); + } + + friend ex_fq_fr<CurrentType, OtherType> prefer( + const ex_fq_fr&, CurrentType) noexcept + { + return ex_fq_fr<CurrentType, OtherType>(); + } + + friend ex_fq_fr<OtherType, CurrentType> prefer( + const ex_fq_fr&, OtherType) noexcept + { + return ex_fq_fr<OtherType, CurrentType>(); + } + + template <typename F> + 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 <typename CurrentType> +struct ex_fq_fr<CurrentType, CurrentType> +{ + friend CurrentType query(const ex_fq_fr&, CurrentType) noexcept + { + return CurrentType(); + } + + friend ex_fq_fr<CurrentType, CurrentType> require( + const ex_fq_fr&, CurrentType) noexcept + { + return ex_fq_fr<CurrentType, CurrentType>(); + } + + friend ex_fq_fr<CurrentType, CurrentType> prefer( + const ex_fq_fr&, CurrentType) noexcept + { + return ex_fq_fr<CurrentType, CurrentType>(); + } + + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <typename CurrentType, typename OtherType> +struct is_executor<ex_fq_fr<CurrentType, OtherType> > + : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT) + +template <typename CurrentType, typename OtherType, typename Param> +struct query_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + || asio::is_convertible<Param, OtherType>::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 <typename CurrentType, typename OtherType, typename Param> +struct require_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_fq_fr<CurrentType, OtherType> result_type; +}; + +template <typename CurrentType, typename OtherType, typename Param> +struct require_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, OtherType>::value + && !asio::is_same<CurrentType, OtherType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_fq_fr<OtherType, CurrentType> result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT) + +#if !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT) + +template <typename CurrentType, typename OtherType, typename Param> +struct prefer_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_fq_fr<CurrentType, OtherType> result_type; +}; + +template <typename CurrentType, typename OtherType, typename Param> +struct prefer_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, OtherType>::value + && !asio::is_same<CurrentType, OtherType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_fq_fr<OtherType, CurrentType> result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT) + +} // namespace traits +} // namespace asio + +template <typename Executor, typename Param, bool ExpectedResult> +void test_can_query() +{ + constexpr bool b1 = + asio::can_query<Executor, Param>::value; + ASIO_CHECK(b1 == ExpectedResult); + + constexpr bool b2 = + asio::can_query<const Executor, Param>::value; + ASIO_CHECK(b2 == ExpectedResult); + + constexpr bool b3 = + asio::can_query<Executor&, Param>::value; + ASIO_CHECK(b3 == ExpectedResult); + + constexpr bool b4 = + asio::can_query<const Executor&, Param>::value; + ASIO_CHECK(b4 == ExpectedResult); +} + +template <typename Executor, typename Param, typename ExpectedResult> +void test_query() +{ + exec::outstanding_work_t result1 = asio::query(Executor(), Param()); + ASIO_CHECK(result1 == ExpectedResult()); + + Executor ex1 = {}; + exec::outstanding_work_t result2 = asio::query(ex1, Param()); + ASIO_CHECK(result2 == ExpectedResult()); + + const Executor ex2 = {}; + exec::outstanding_work_t result3 = asio::query(ex2, Param()); + ASIO_CHECK(result3 == ExpectedResult()); +} + +template <typename Executor, typename Param, typename ExpectedResult> +void test_constexpr_query() +{ + constexpr Executor ex1 = {}; + constexpr exec::outstanding_work_t result1 = asio::query(ex1, Param()); + ASIO_CHECK(result1 == ExpectedResult()); +} + +template <typename Executor, typename Param, bool ExpectedResult> +void test_can_require() +{ + constexpr bool b1 = + asio::can_require<Executor, Param>::value; + ASIO_CHECK(b1 == ExpectedResult); + + constexpr bool b2 = + asio::can_require<const Executor, Param>::value; + ASIO_CHECK(b2 == ExpectedResult); + + constexpr bool b3 = + asio::can_require<Executor&, Param>::value; + ASIO_CHECK(b3 == ExpectedResult); + + constexpr bool b4 = + asio::can_require<const Executor&, Param>::value; + ASIO_CHECK(b4 == ExpectedResult); +} + +template <typename Executor, typename Param, typename ExpectedResult> +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()); + + const Executor ex2 = {}; + ASIO_CHECK( + asio::query( + asio::require(ex2, Param()), + Param()) == ExpectedResult()); +} + +template <typename Executor, typename Param, bool ExpectedResult> +void test_can_prefer() +{ + constexpr bool b1 = + asio::can_prefer<Executor, Param>::value; + ASIO_CHECK(b1 == ExpectedResult); + + constexpr bool b2 = + asio::can_prefer<const Executor, Param>::value; + ASIO_CHECK(b2 == ExpectedResult); + + constexpr bool b3 = + asio::can_prefer<Executor&, Param>::value; + ASIO_CHECK(b3 == ExpectedResult); + + constexpr bool b4 = + asio::can_prefer<const Executor&, Param>::value; + ASIO_CHECK(b4 == ExpectedResult); +} + +template <typename Executor, typename Param, typename ExpectedResult> +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::outstanding_work); + ASIO_CHECK(s() != exec::outstanding_work.untracked); + ASIO_CHECK(s() != exec::outstanding_work.tracked); + ASIO_CHECK(n1() == exec::outstanding_work.untracked); + ASIO_CHECK(n1() != exec::outstanding_work.tracked); + ASIO_CHECK(n2() == exec::outstanding_work.tracked); + ASIO_CHECK(n2() != exec::outstanding_work.untracked); +} + +ASIO_TEST_SUITE +( + "outstanding_work", + + ASIO_TEST_CASE3(test_can_query<ex_nq_nr, s, true>) + ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n1, true>) + ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n2, false>) + + ASIO_TEST_CASE3(test_query<ex_nq_nr, s, n1>) + ASIO_TEST_CASE3(test_query<ex_nq_nr, n1, n1>) + + ASIO_TEST_CASE3(test_constexpr_query<ex_nq_nr, s, n1>) + ASIO_TEST_CASE3(test_constexpr_query<ex_nq_nr, n1, n1>) + + ASIO_TEST_CASE3(test_can_require<ex_nq_nr, s, false>) + ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n1, true>) + ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n2, false>) + + ASIO_TEST_CASE3(test_require<ex_nq_nr, n1, n1>) + + ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, s, false>) + ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n1, true>) + ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n2, true>) + + ASIO_TEST_CASE3(test_prefer<ex_nq_nr, n1, n1>) + ASIO_TEST_CASE3(test_prefer<ex_nq_nr, n2, n1>) + + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n2, true>) + + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n1>, s, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n2>, s, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n1>, s, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n2>, s, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n2, true>) + + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n2, true>) + + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n2, true>) + + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n2, false>) + + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n2, true>) + + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n2, true>) + + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n2, false>) + + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n2, true>) + + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n2, true>) + + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n1>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n2>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n1>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n2>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n2>, n2, n2>) + + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n2, true>) + + ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n2>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n2>, n2, n2>) + + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n2, true>) + + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n1>, n2, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n2>, n2, n2>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n2>, n1, n2>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n2>, n2, n2>) + + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n2, true>) + + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n1>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n2>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n1>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n2>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n2>, n2, n2>) + + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n2, true>) + + ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n2>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n2>, n2, n2>) + + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n2, true>) + + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n1>, n2, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n2>, n2, n2>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n2>, n1, n2>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n2>, n2, n2>) + + ASIO_TEST_CASE(test_vars) +) diff --git a/3rdparty/asio/src/tests/unit/execution/prefer_only.cpp b/3rdparty/asio/src/tests/unit/execution/prefer_only.cpp new file mode 100644 index 00000000000..60500002475 --- /dev/null +++ b/3rdparty/asio/src/tests/unit/execution/prefer_only.cpp @@ -0,0 +1,533 @@ +// +// prefer_only.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/prefer_only.hpp" + +#include <functional> +#include "asio/execution/any_executor.hpp" +#include "../unit_test.hpp" + +using namespace asio; +namespace bindns = std; + +static int possibly_blocking_count = 0; +static int never_blocking_count = 0; + +struct possibly_blocking_executor +{ + template <typename F> + void execute(const F&) const + { + ++possibly_blocking_count; + } + + friend bool operator==(const possibly_blocking_executor&, + const possibly_blocking_executor&) noexcept + { + return true; + } + + friend bool operator!=(const possibly_blocking_executor&, + const possibly_blocking_executor&) noexcept + { + return false; + } +}; + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) + +template <typename F> +struct execute_member<possibly_blocking_executor, F> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + typedef void result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) + +#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) + +template <> +struct equality_comparable<possibly_blocking_executor> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) + +} // namespace traits +} // namespace asio + +struct never_blocking_executor +{ + static constexpr execution::blocking_t::never_t + query(execution::blocking_t) noexcept + { + return execution::blocking_t::never_t(); + } + + template <typename F> + void execute(const F&) const + { + ++never_blocking_count; + } + + friend bool operator==(const never_blocking_executor&, + const never_blocking_executor&) noexcept + { + return true; + } + + friend bool operator!=(const never_blocking_executor&, + const never_blocking_executor&) noexcept + { + return false; + } +}; + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) + +template <typename F> +struct execute_member<never_blocking_executor, F> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + typedef void result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) + +#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) + +template <> +struct equality_comparable<never_blocking_executor> +{ + 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_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT) + +template <typename Param> +struct query_static_constexpr_member< + never_blocking_executor, Param, + typename asio::enable_if< + asio::is_convertible<Param, execution::blocking_t>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef execution::blocking_t::never_t result_type; + + static constexpr result_type value() + { + return result_type(); + } +}; + +#endif // !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT) + +} // namespace traits +} // namespace asio + +struct either_blocking_executor +{ + execution::blocking_t blocking_; + + explicit either_blocking_executor(execution::blocking_t b) + : blocking_(b) + { + } + + execution::blocking_t query(execution::blocking_t) const noexcept + { + return blocking_; + } + + either_blocking_executor require(execution::blocking_t::possibly_t) const + { + return either_blocking_executor(execution::blocking.possibly); + } + + either_blocking_executor require(execution::blocking_t::never_t) const + { + return either_blocking_executor(execution::blocking.never); + } + + template <typename F> + void execute(const F&) const + { + if (blocking_ == execution::blocking.never) + ++never_blocking_count; + else + ++possibly_blocking_count; + } + + friend bool operator==(const either_blocking_executor& a, + const either_blocking_executor& b) noexcept + { + return a.blocking_ == b.blocking_; + } + + friend bool operator!=(const either_blocking_executor& a, + const either_blocking_executor& b) noexcept + { + return a.blocking_ != b.blocking_; + } +}; + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) + +template <typename F> +struct execute_member<either_blocking_executor, F> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + typedef void result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) + +#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) + +template <> +struct equality_comparable<either_blocking_executor> +{ + 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_QUERY_MEMBER_TRAIT) + +template <typename Param> +struct query_member< + either_blocking_executor, Param, + typename asio::enable_if< + asio::is_convertible<Param, execution::blocking_t>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef execution::blocking_t result_type; +}; + +#if !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT) + +#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT) + +template <typename Param> +struct require_member< + either_blocking_executor, Param, + typename asio::enable_if< + asio::is_convertible<Param, execution::blocking_t>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = false; + + typedef either_blocking_executor result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT) + +} // namespace traits +} // namespace asio + +void prefer_only_executor_query_test() +{ + typedef execution::any_executor< + execution::blocking_t, + execution::prefer_only<execution::blocking_t::possibly_t>, + execution::prefer_only<execution::blocking_t::never_t> + > executor_type; + + executor_type ex1 = possibly_blocking_executor(); + + ASIO_CHECK( + asio::query(ex1, execution::blocking) + == execution::blocking.possibly); + + ASIO_CHECK( + asio::query(ex1, execution::blocking.possibly) + == execution::blocking.possibly); + + ASIO_CHECK( + asio::query(ex1, execution::blocking.never) + == execution::blocking.possibly); + + executor_type ex2 = asio::prefer(ex1, execution::blocking.possibly); + + ASIO_CHECK( + asio::query(ex2, execution::blocking) + == execution::blocking.possibly); + + ASIO_CHECK( + asio::query(ex2, execution::blocking.possibly) + == execution::blocking.possibly); + + ASIO_CHECK( + asio::query(ex2, execution::blocking.never) + == execution::blocking.possibly); + + executor_type ex3 = asio::prefer(ex1, execution::blocking.never); + + ASIO_CHECK( + asio::query(ex3, execution::blocking) + == execution::blocking.possibly); + + ASIO_CHECK( + asio::query(ex3, execution::blocking.possibly) + == execution::blocking.possibly); + + ASIO_CHECK( + asio::query(ex3, execution::blocking.never) + == execution::blocking.possibly); + + executor_type ex4 = never_blocking_executor(); + + ASIO_CHECK( + asio::query(ex4, execution::blocking) + == execution::blocking.never); + + ASIO_CHECK( + asio::query(ex4, execution::blocking.possibly) + == execution::blocking.never); + + ASIO_CHECK( + asio::query(ex4, execution::blocking.never) + == execution::blocking.never); + + executor_type ex5 = asio::prefer(ex4, execution::blocking.possibly); + + ASIO_CHECK( + asio::query(ex5, execution::blocking) + == execution::blocking.never); + + ASIO_CHECK( + asio::query(ex5, execution::blocking.possibly) + == execution::blocking.never); + + ASIO_CHECK( + asio::query(ex5, execution::blocking.never) + == execution::blocking.never); + + executor_type ex6 = asio::prefer(ex4, execution::blocking.never); + + ASIO_CHECK( + asio::query(ex6, execution::blocking) + == execution::blocking.never); + + ASIO_CHECK( + asio::query(ex6, execution::blocking.possibly) + == execution::blocking.never); + + ASIO_CHECK( + asio::query(ex6, execution::blocking.never) + == execution::blocking.never); + + executor_type ex7 = either_blocking_executor(execution::blocking.possibly); + + ASIO_CHECK( + asio::query(ex7, execution::blocking) + == execution::blocking.possibly); + + ASIO_CHECK( + asio::query(ex7, execution::blocking.possibly) + == execution::blocking.possibly); + + ASIO_CHECK( + asio::query(ex7, execution::blocking.never) + == execution::blocking.possibly); + + executor_type ex8 = asio::prefer(ex7, execution::blocking.possibly); + + ASIO_CHECK( + asio::query(ex8, execution::blocking) + == execution::blocking.possibly); + + ASIO_CHECK( + asio::query(ex8, execution::blocking.possibly) + == execution::blocking.possibly); + + ASIO_CHECK( + asio::query(ex8, execution::blocking.never) + == execution::blocking.possibly); + + executor_type ex9 = asio::prefer(ex7, execution::blocking.never); + + ASIO_CHECK( + asio::query(ex9, execution::blocking) + == execution::blocking.never); + + ASIO_CHECK( + asio::query(ex9, execution::blocking.possibly) + == execution::blocking.never); + + ASIO_CHECK( + asio::query(ex9, execution::blocking.never) + == execution::blocking.never); + + executor_type ex10 = either_blocking_executor(execution::blocking.never); + + ASIO_CHECK( + asio::query(ex10, execution::blocking) + == execution::blocking.never); + + ASIO_CHECK( + asio::query(ex10, execution::blocking.possibly) + == execution::blocking.never); + + ASIO_CHECK( + asio::query(ex10, execution::blocking.never) + == execution::blocking.never); + + executor_type ex11 = asio::prefer(ex7, execution::blocking.possibly); + + ASIO_CHECK( + asio::query(ex11, execution::blocking) + == execution::blocking.possibly); + + ASIO_CHECK( + asio::query(ex11, execution::blocking.possibly) + == execution::blocking.possibly); + + ASIO_CHECK( + asio::query(ex11, execution::blocking.never) + == execution::blocking.possibly); + + executor_type ex12 = asio::prefer(ex7, execution::blocking.never); + + ASIO_CHECK( + asio::query(ex12, execution::blocking) + == execution::blocking.never); + + ASIO_CHECK( + asio::query(ex12, execution::blocking.possibly) + == execution::blocking.never); + + ASIO_CHECK( + asio::query(ex12, execution::blocking.never) + == execution::blocking.never); +} + +void do_nothing() +{ +} + +void prefer_only_executor_execute_test() +{ + typedef execution::any_executor< + execution::blocking_t, + execution::prefer_only<execution::blocking_t::possibly_t>, + execution::prefer_only<execution::blocking_t::never_t> + > executor_type; + + executor_type ex1 = possibly_blocking_executor(); + + ex1.execute(&do_nothing); + ASIO_CHECK(possibly_blocking_count == 1); + ASIO_CHECK(never_blocking_count == 0); + + executor_type ex2 = asio::prefer(ex1, execution::blocking.possibly); + + ex2.execute(&do_nothing); + ASIO_CHECK(possibly_blocking_count == 2); + ASIO_CHECK(never_blocking_count == 0); + + executor_type ex3 = asio::prefer(ex1, execution::blocking.never); + + ex3.execute(&do_nothing); + ASIO_CHECK(possibly_blocking_count == 3); + ASIO_CHECK(never_blocking_count == 0); + + executor_type ex4 = never_blocking_executor(); + + ex4.execute(&do_nothing); + ASIO_CHECK(possibly_blocking_count == 3); + ASIO_CHECK(never_blocking_count == 1); + + executor_type ex5 = asio::prefer(ex4, execution::blocking.possibly); + + ex5.execute(&do_nothing); + ASIO_CHECK(possibly_blocking_count == 3); + ASIO_CHECK(never_blocking_count == 2); + + executor_type ex6 = asio::prefer(ex4, execution::blocking.never); + + ex6.execute(&do_nothing); + ASIO_CHECK(possibly_blocking_count == 3); + ASIO_CHECK(never_blocking_count == 3); + + executor_type ex7 = either_blocking_executor(execution::blocking.possibly); + + ex7.execute(&do_nothing); + ASIO_CHECK(possibly_blocking_count == 4); + ASIO_CHECK(never_blocking_count == 3); + + executor_type ex8 = asio::prefer(ex7, execution::blocking.possibly); + + ex8.execute(&do_nothing); + ASIO_CHECK(possibly_blocking_count == 5); + ASIO_CHECK(never_blocking_count == 3); + + executor_type ex9 = asio::prefer(ex7, execution::blocking.never); + + ex9.execute(&do_nothing); + ASIO_CHECK(possibly_blocking_count == 5); + ASIO_CHECK(never_blocking_count == 4); + + executor_type ex10 = either_blocking_executor(execution::blocking.never); + + ex10.execute(&do_nothing); + ASIO_CHECK(possibly_blocking_count == 5); + ASIO_CHECK(never_blocking_count == 5); + + executor_type ex11 = asio::prefer(ex7, execution::blocking.possibly); + + ex11.execute(&do_nothing); + ASIO_CHECK(possibly_blocking_count == 6); + ASIO_CHECK(never_blocking_count == 5); + + executor_type ex12 = asio::prefer(ex7, execution::blocking.never); + + ex12.execute(&do_nothing); + ASIO_CHECK(possibly_blocking_count == 6); + ASIO_CHECK(never_blocking_count == 6); +} + +ASIO_TEST_SUITE +( + "prefer_only", + ASIO_TEST_CASE(prefer_only_executor_query_test) + ASIO_TEST_CASE(prefer_only_executor_execute_test) +) diff --git a/3rdparty/asio/src/tests/unit/execution/relationship.cpp b/3rdparty/asio/src/tests/unit/execution/relationship.cpp new file mode 100644 index 00000000000..a91144e8125 --- /dev/null +++ b/3rdparty/asio/src/tests/unit/execution/relationship.cpp @@ -0,0 +1,1252 @@ +// +// relationship.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/relationship.hpp" + +#include "asio/prefer.hpp" +#include "asio/query.hpp" +#include "asio/require.hpp" +#include "../unit_test.hpp" + +namespace exec = asio::execution; + +typedef exec::relationship_t s; +typedef exec::relationship_t::fork_t n1; +typedef exec::relationship_t::continuation_t n2; + +struct ex_nq_nr +{ + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <> +struct is_executor<ex_nq_nr> : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +template <typename ResultType, typename ParamType, typename Result> +struct ex_cq_nr +{ + static constexpr ResultType query(ParamType) noexcept + { + return Result(); + } + + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <typename ResultType, typename ParamType, typename Result> +struct is_executor<ex_cq_nr<ResultType, ParamType, Result> > + : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT) + +template <typename ResultType, typename ParamType, + typename Result, typename Param> +struct query_static_constexpr_member< + ex_cq_nr<ResultType, ParamType, Result>, Param, + typename asio::enable_if< + asio::is_convertible<Param, ParamType>::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 <typename ResultType, typename ParamType, typename Result> +struct ex_mq_nr +{ + ResultType query(ParamType) const noexcept + { + return Result(); + } + + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <typename ResultType, typename ParamType, typename Result> +struct is_executor<ex_mq_nr<ResultType, ParamType, Result> > + : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT) + +template <typename ResultType, typename ParamType, + typename Result, typename Param> +struct query_member< + ex_mq_nr<ResultType, ParamType, Result>, Param, + typename asio::enable_if< + asio::is_convertible<Param, ParamType>::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 <typename ResultType, typename ParamType, typename Result> +struct ex_fq_nr +{ + friend ResultType query(const ex_fq_nr&, ParamType) noexcept + { + return Result(); + } + + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <typename ResultType, typename ParamType, typename Result> +struct is_executor<ex_fq_nr<ResultType, ParamType, Result> > + : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT) + +template <typename ResultType, typename ParamType, + typename Result, typename Param> +struct query_free< + ex_fq_nr<ResultType, ParamType, Result>, Param, + typename asio::enable_if< + asio::is_convertible<Param, ParamType>::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 <typename CurrentType, typename OtherType> +struct ex_mq_mr +{ + CurrentType query(CurrentType) const noexcept + { + return CurrentType(); + } + + CurrentType query(OtherType) const noexcept + { + return CurrentType(); + } + + ex_mq_mr<CurrentType, OtherType> require( + CurrentType) const noexcept + { + return ex_mq_mr<CurrentType, OtherType>(); + } + + ex_mq_mr<OtherType, CurrentType> require( + OtherType) const noexcept + { + return ex_mq_mr<OtherType, CurrentType>(); + } + + template <typename F> + 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 <typename CurrentType> +struct ex_mq_mr<CurrentType, CurrentType> +{ + CurrentType query(CurrentType) const noexcept + { + return CurrentType(); + } + + ex_mq_mr<CurrentType, CurrentType> require( + CurrentType) const noexcept + { + return ex_mq_mr<CurrentType, CurrentType>(); + } + + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <typename CurrentType, typename OtherType> +struct is_executor<ex_mq_mr<CurrentType, OtherType> > + : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT) + +template <typename CurrentType, typename OtherType, typename Param> +struct query_member< + ex_mq_mr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + || asio::is_convertible<Param, OtherType>::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 <typename CurrentType, typename OtherType, typename Param> +struct require_member< + ex_mq_mr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_mq_mr<CurrentType, OtherType> result_type; +}; + +template <typename CurrentType, typename OtherType, typename Param> +struct require_member< + ex_mq_mr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, OtherType>::value + && !asio::is_same<CurrentType, OtherType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_mq_mr<OtherType, CurrentType> result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT) + +} // namespace traits +} // namespace asio + +template <typename CurrentType, typename OtherType> +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<CurrentType, OtherType> require( + const ex_fq_fr&, CurrentType) noexcept + { + return ex_fq_fr<CurrentType, OtherType>(); + } + + friend ex_fq_fr<OtherType, CurrentType> require( + const ex_fq_fr&, OtherType) noexcept + { + return ex_fq_fr<OtherType, CurrentType>(); + } + + friend ex_fq_fr<CurrentType, OtherType> prefer( + const ex_fq_fr&, CurrentType) noexcept + { + return ex_fq_fr<CurrentType, OtherType>(); + } + + friend ex_fq_fr<OtherType, CurrentType> prefer( + const ex_fq_fr&, OtherType) noexcept + { + return ex_fq_fr<OtherType, CurrentType>(); + } + + template <typename F> + 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 <typename CurrentType> +struct ex_fq_fr<CurrentType, CurrentType> +{ + friend CurrentType query(const ex_fq_fr&, CurrentType) noexcept + { + return CurrentType(); + } + + friend ex_fq_fr<CurrentType, CurrentType> require( + const ex_fq_fr&, CurrentType) noexcept + { + return ex_fq_fr<CurrentType, CurrentType>(); + } + + friend ex_fq_fr<CurrentType, CurrentType> prefer( + const ex_fq_fr&, CurrentType) noexcept + { + return ex_fq_fr<CurrentType, CurrentType>(); + } + + template <typename F> + 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; + } +}; + +#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace execution { + +template <typename CurrentType, typename OtherType> +struct is_executor<ex_fq_fr<CurrentType, OtherType> > + : asio::true_type +{ +}; + +} // namespace execution +} // namespace asio + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT) + +namespace asio { +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT) + +template <typename CurrentType, typename OtherType, typename Param> +struct query_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + || asio::is_convertible<Param, OtherType>::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 <typename CurrentType, typename OtherType, typename Param> +struct require_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_fq_fr<CurrentType, OtherType> result_type; +}; + +template <typename CurrentType, typename OtherType, typename Param> +struct require_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, OtherType>::value + && !asio::is_same<CurrentType, OtherType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_fq_fr<OtherType, CurrentType> result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT) + +#if !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT) + +template <typename CurrentType, typename OtherType, typename Param> +struct prefer_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, CurrentType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_fq_fr<CurrentType, OtherType> result_type; +}; + +template <typename CurrentType, typename OtherType, typename Param> +struct prefer_free< + ex_fq_fr<CurrentType, OtherType>, Param, + typename asio::enable_if< + asio::is_convertible<Param, OtherType>::value + && !asio::is_same<CurrentType, OtherType>::value + >::type> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef ex_fq_fr<OtherType, CurrentType> result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT) + +} // namespace traits +} // namespace asio + +template <typename Executor, typename Param, bool ExpectedResult> +void test_can_query() +{ + constexpr bool b1 = + asio::can_query<Executor, Param>::value; + ASIO_CHECK(b1 == ExpectedResult); + + constexpr bool b2 = + asio::can_query<const Executor, Param>::value; + ASIO_CHECK(b2 == ExpectedResult); + + constexpr bool b3 = + asio::can_query<Executor&, Param>::value; + ASIO_CHECK(b3 == ExpectedResult); + + constexpr bool b4 = + asio::can_query<const Executor&, Param>::value; + ASIO_CHECK(b4 == ExpectedResult); +} + +template <typename Executor, typename Param, typename ExpectedResult> +void test_query() +{ + exec::relationship_t result1 = asio::query(Executor(), Param()); + ASIO_CHECK(result1 == ExpectedResult()); + + Executor ex1 = {}; + exec::relationship_t result2 = asio::query(ex1, Param()); + ASIO_CHECK(result2 == ExpectedResult()); + + const Executor ex2 = {}; + exec::relationship_t result3 = asio::query(ex2, Param()); + ASIO_CHECK(result3 == ExpectedResult()); +} + +template <typename Executor, typename Param, typename ExpectedResult> +void test_constexpr_query() +{ + constexpr Executor ex1 = {}; + constexpr exec::relationship_t result1 = asio::query(ex1, Param()); + ASIO_CHECK(result1 == ExpectedResult()); +} + +template <typename Executor, typename Param, bool ExpectedResult> +void test_can_require() +{ + constexpr bool b1 = + asio::can_require<Executor, Param>::value; + ASIO_CHECK(b1 == ExpectedResult); + + constexpr bool b2 = + asio::can_require<const Executor, Param>::value; + ASIO_CHECK(b2 == ExpectedResult); + + constexpr bool b3 = + asio::can_require<Executor&, Param>::value; + ASIO_CHECK(b3 == ExpectedResult); + + constexpr bool b4 = + asio::can_require<const Executor&, Param>::value; + ASIO_CHECK(b4 == ExpectedResult); +} + +template <typename Executor, typename Param, typename ExpectedResult> +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()); + + const Executor ex2 = {}; + ASIO_CHECK( + asio::query( + asio::require(ex2, Param()), + Param()) == ExpectedResult()); +} + +template <typename Executor, typename Param, bool ExpectedResult> +void test_can_prefer() +{ + constexpr bool b1 = + asio::can_prefer<Executor, Param>::value; + ASIO_CHECK(b1 == ExpectedResult); + + constexpr bool b2 = + asio::can_prefer<const Executor, Param>::value; + ASIO_CHECK(b2 == ExpectedResult); + + constexpr bool b3 = + asio::can_prefer<Executor&, Param>::value; + ASIO_CHECK(b3 == ExpectedResult); + + constexpr bool b4 = + asio::can_prefer<const Executor&, Param>::value; + ASIO_CHECK(b4 == ExpectedResult); +} + +template <typename Executor, typename Param, typename ExpectedResult> +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::relationship); + ASIO_CHECK(s() != exec::relationship.fork); + ASIO_CHECK(s() != exec::relationship.continuation); + ASIO_CHECK(n1() == exec::relationship.fork); + ASIO_CHECK(n1() != exec::relationship.continuation); + ASIO_CHECK(n2() == exec::relationship.continuation); + ASIO_CHECK(n2() != exec::relationship.fork); +} + +ASIO_TEST_SUITE +( + "relationship", + + ASIO_TEST_CASE3(test_can_query<ex_nq_nr, s, true>) + ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n1, true>) + ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n2, false>) + + ASIO_TEST_CASE3(test_query<ex_nq_nr, s, n1>) + ASIO_TEST_CASE3(test_query<ex_nq_nr, n1, n1>) + + ASIO_TEST_CASE3(test_constexpr_query<ex_nq_nr, s, n1>) + ASIO_TEST_CASE3(test_constexpr_query<ex_nq_nr, n1, n1>) + + ASIO_TEST_CASE3(test_can_require<ex_nq_nr, s, false>) + ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n1, true>) + ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n2, false>) + + ASIO_TEST_CASE3(test_require<ex_nq_nr, n1, n1>) + + ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, s, false>) + ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n1, true>) + ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n2, true>) + + ASIO_TEST_CASE3(test_prefer<ex_nq_nr, n1, n1>) + ASIO_TEST_CASE3(test_prefer<ex_nq_nr, n2, n1>) + + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n2, true>) + + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n1>, s, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n2>, s, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n1>, s, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n2>, s, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n2, true>) + + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_require<ex_cq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n2, true>) + + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n2, true>) + + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n2, false>) + + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n2, true>) + + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, s, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n2, true>) + + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, s, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, s, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n2, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n1, false>) + ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n2, false>) + + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n2, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, s, false>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n1, true>) + ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n2, true>) + + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n2>, n2, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n1, s, n1>, n1, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n1, s, n1>, n2, n1>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n2, s, n2>, n1, n2>) + ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n2, s, n2>, n2, n2>) + + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n2, true>) + + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n1>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n2>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n1>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n2>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n2>, n2, n2>) + + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n2, true>) + + ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n2>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n2>, n2, n2>) + + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n2, true>) + + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n1>, n2, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n2>, n2, n2>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n2>, n1, n2>) + ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n2>, n2, n2>) + + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, s, true>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n2, true>) + + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n1>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n2>, s, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n1>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n2>, s, n2>) + ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n2>, n2, n2>) + + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n2, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, s, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n1, false>) + ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n2, true>) + + ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n2>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n1>, n1, n1>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n2>, n2, n2>) + + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n2, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, s, false>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n1, true>) + ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n2, true>) + + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n1>, n2, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n2>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n2>, n2, n2>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n1>, n1, n1>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n1>, n2, n2>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n2>, n1, n2>) + ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n2>, n2, n2>) + + ASIO_TEST_CASE(test_vars) +) |