1// -*- C++ -*-
2//===-- execution_defs.h --------------------------------------------------===//
3//
4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef __PSTL_execution_policy_defs_H
11#define __PSTL_execution_policy_defs_H
12
13#include <type_traits>
14
15namespace __pstl
16{
17namespace execution
18{
19inline namespace v1
20{
21
22// 2.4, Sequential execution policy
23class sequenced_policy
24{
25 public:
26 // For internal use only
27 static constexpr std::false_type
28 __allow_unsequenced()
29 {
30 return std::false_type{};
31 }
32 static constexpr std::false_type
33 __allow_vector()
34 {
35 return std::false_type{};
36 }
37 static constexpr std::false_type
38 __allow_parallel()
39 {
40 return std::false_type{};
41 }
42};
43
44#if __PSTL_USE_PAR_POLICIES
45// 2.5, Parallel execution policy
46class parallel_policy
47{
48 public:
49 // For internal use only
50 static constexpr std::false_type
51 __allow_unsequenced()
52 {
53 return std::false_type{};
54 }
55 static constexpr std::false_type
56 __allow_vector()
57 {
58 return std::false_type{};
59 }
60 static constexpr std::true_type
61 __allow_parallel()
62 {
63 return std::true_type{};
64 }
65};
66
67// 2.6, Parallel+Vector execution policy
68class parallel_unsequenced_policy
69{
70 public:
71 // For internal use only
72 static constexpr std::true_type
73 __allow_unsequenced()
74 {
75 return std::true_type{};
76 }
77 static constexpr std::true_type
78 __allow_vector()
79 {
80 return std::true_type{};
81 }
82 static constexpr std::true_type
83 __allow_parallel()
84 {
85 return std::true_type{};
86 }
87};
88#endif
89
90class unsequenced_policy
91{
92 public:
93 // For internal use only
94 static constexpr std::true_type
95 __allow_unsequenced()
96 {
97 return std::true_type{};
98 }
99 static constexpr std::true_type
100 __allow_vector()
101 {
102 return std::true_type{};
103 }
104 static constexpr std::false_type
105 __allow_parallel()
106 {
107 return std::false_type{};
108 }
109};
110
111// 2.8, Execution policy objects
112constexpr sequenced_policy seq{};
113#if __PSTL_USE_PAR_POLICIES
114constexpr parallel_policy par{};
115constexpr parallel_unsequenced_policy par_unseq{};
116#endif
117constexpr unsequenced_policy unseq{};
118
119// 2.3, Execution policy type trait
120template <class _Tp>
121struct is_execution_policy : std::false_type
122{
123};
124
125template <>
126struct is_execution_policy<__pstl::execution::sequenced_policy> : std::true_type
127{
128};
129#if __PSTL_USE_PAR_POLICIES
130template <>
131struct is_execution_policy<__pstl::execution::parallel_policy> : std::true_type
132{
133};
134template <>
135struct is_execution_policy<__pstl::execution::parallel_unsequenced_policy> : std::true_type
136{
137};
138#endif
139template <>
140struct is_execution_policy<__pstl::execution::unsequenced_policy> : std::true_type
141{
142};
143
144#if __PSTL_CPP14_VARIABLE_TEMPLATES_PRESENT
145template <class _Tp>
146constexpr bool is_execution_policy_v = __pstl::execution::is_execution_policy<_Tp>::value;
147#endif
148
149} // namespace v1
150} // namespace execution
151
152namespace __internal
153{
154template <class _ExecPolicy, class _Tp>
155using __enable_if_execution_policy =
156 typename std::enable_if<__pstl::execution::is_execution_policy<typename std::decay<_ExecPolicy>::type>::value,
157 _Tp>::type;
158} // namespace __internal
159
160} // namespace __pstl
161
162#endif /* __PSTL_execution_policy_defs_H */
163