xref: /llvm-project/libcxx/test/support/test_execution_policies.h (revision aade74675c15d3bae5fdfa67f7b4b6ed9dac3d20)
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 Klauser bool 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