18af259e8SNikolas Klauser //===----------------------------------------------------------------------===// 28af259e8SNikolas Klauser // 38af259e8SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 48af259e8SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 58af259e8SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 68af259e8SNikolas Klauser // 78af259e8SNikolas Klauser //===----------------------------------------------------------------------===// 88af259e8SNikolas Klauser 98af259e8SNikolas Klauser #ifndef TEST_SUPPORT_TEST_EXECUTION_POLICIES 108af259e8SNikolas Klauser #define TEST_SUPPORT_TEST_EXECUTION_POLICIES 118af259e8SNikolas Klauser 128af259e8SNikolas Klauser #include <cstdlib> 13*91121ea6SNikolas Klauser #include <exception> 148af259e8SNikolas Klauser #include <execution> 158af259e8SNikolas Klauser #include <type_traits> 168af259e8SNikolas Klauser #include <utility> 178af259e8SNikolas Klauser 188af259e8SNikolas Klauser #include "test_macros.h" 198af259e8SNikolas Klauser 208af259e8SNikolas Klauser #define EXECUTION_POLICY_SFINAE_TEST(function) \ 218af259e8SNikolas Klauser template <class, class...> \ 228af259e8SNikolas Klauser struct sfinae_test_##function##_impl : std::true_type {}; \ 238af259e8SNikolas Klauser \ 248af259e8SNikolas Klauser template <class... Args> \ 258af259e8SNikolas Klauser struct sfinae_test_##function##_impl<std::void_t<decltype(std::function(std::declval<Args>()...))>, Args...> \ 268af259e8SNikolas Klauser : std::false_type {}; \ 278af259e8SNikolas Klauser \ 288af259e8SNikolas Klauser template <class... Args> \ 298af259e8SNikolas Klauser constexpr bool sfinae_test_##function = sfinae_test_##function##_impl<void, Args...>::value; 308af259e8SNikolas Klauser 318af259e8SNikolas Klauser template <class Functor> test_execution_policies(Functor func)328af259e8SNikolas Klauserbool test_execution_policies(Functor func) { 338af259e8SNikolas Klauser func(std::execution::seq); 348af259e8SNikolas Klauser #if TEST_STD_VER >= 20 358af259e8SNikolas Klauser func(std::execution::unseq); 368af259e8SNikolas Klauser #endif 378af259e8SNikolas Klauser func(std::execution::par); 388af259e8SNikolas Klauser func(std::execution::par_unseq); 398af259e8SNikolas Klauser 408af259e8SNikolas Klauser return true; 418af259e8SNikolas Klauser } 428af259e8SNikolas Klauser 438af259e8SNikolas Klauser template <template <class Iter> class TestClass> 448af259e8SNikolas Klauser struct TestIteratorWithPolicies { 458af259e8SNikolas Klauser template <class Iter> operatorTestIteratorWithPolicies468af259e8SNikolas Klauser void operator()() { 478af259e8SNikolas Klauser test_execution_policies(TestClass<Iter>{}); 488af259e8SNikolas Klauser } 498af259e8SNikolas Klauser }; 508af259e8SNikolas Klauser 5168ee014bSNikolas Klauser struct Bool { 5268ee014bSNikolas Klauser bool b_; 5368ee014bSNikolas Klauser Bool() = default; BoolBool5468ee014bSNikolas Klauser Bool(bool b) : b_(b) {} 5568ee014bSNikolas Klauser 5668ee014bSNikolas Klauser operator bool&() { 5768ee014bSNikolas Klauser return b_; 5868ee014bSNikolas Klauser } 5968ee014bSNikolas Klauser }; 6068ee014bSNikolas Klauser 618af259e8SNikolas Klauser #endif // TEST_SUPPORT_TEST_EXECUTION_POLICIES 62