xref: /netbsd-src/external/gpl3/gcc.old/dist/libstdc++-v3/include/pstl/execution_impl.h (revision 4c3eb207d36f67d31994830c0a694161fc1ca39b)
1627f7eb2Smrg // -*- C++ -*-
2627f7eb2Smrg //===-- execution_impl.h --------------------------------------------------===//
3627f7eb2Smrg //
4627f7eb2Smrg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5627f7eb2Smrg // See https://llvm.org/LICENSE.txt for license information.
6627f7eb2Smrg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7627f7eb2Smrg //
8627f7eb2Smrg //===----------------------------------------------------------------------===//
9627f7eb2Smrg 
10*4c3eb207Smrg #ifndef _PSTL_EXECUTION_IMPL_H
11*4c3eb207Smrg #define _PSTL_EXECUTION_IMPL_H
12627f7eb2Smrg 
13627f7eb2Smrg #include <iterator>
14627f7eb2Smrg #include <type_traits>
15627f7eb2Smrg 
16627f7eb2Smrg #include "execution_defs.h"
17627f7eb2Smrg 
18627f7eb2Smrg namespace __pstl
19627f7eb2Smrg {
20627f7eb2Smrg namespace __internal
21627f7eb2Smrg {
22627f7eb2Smrg 
23627f7eb2Smrg using namespace __pstl::execution;
24627f7eb2Smrg 
25627f7eb2Smrg /* predicate */
26627f7eb2Smrg 
27627f7eb2Smrg template <typename _Tp>
__lazy_and(_Tp,std::false_type)28627f7eb2Smrg std::false_type __lazy_and(_Tp, std::false_type)
29627f7eb2Smrg {
30627f7eb2Smrg     return std::false_type{};
31627f7eb2Smrg };
32627f7eb2Smrg 
33627f7eb2Smrg template <typename _Tp>
34627f7eb2Smrg inline _Tp
__lazy_and(_Tp __a,std::true_type)35627f7eb2Smrg __lazy_and(_Tp __a, std::true_type)
36627f7eb2Smrg {
37627f7eb2Smrg     return __a;
38627f7eb2Smrg }
39627f7eb2Smrg 
40627f7eb2Smrg template <typename _Tp>
__lazy_or(_Tp,std::true_type)41627f7eb2Smrg std::true_type __lazy_or(_Tp, std::true_type)
42627f7eb2Smrg {
43627f7eb2Smrg     return std::true_type{};
44627f7eb2Smrg };
45627f7eb2Smrg 
46627f7eb2Smrg template <typename _Tp>
47627f7eb2Smrg inline _Tp
__lazy_or(_Tp __a,std::false_type)48627f7eb2Smrg __lazy_or(_Tp __a, std::false_type)
49627f7eb2Smrg {
50627f7eb2Smrg     return __a;
51627f7eb2Smrg }
52627f7eb2Smrg 
53627f7eb2Smrg /* iterator */
54627f7eb2Smrg template <typename _IteratorType, typename... _OtherIteratorTypes>
55627f7eb2Smrg struct __is_random_access_iterator
56627f7eb2Smrg {
57*4c3eb207Smrg     static constexpr bool value = __internal::__is_random_access_iterator<_IteratorType>::value &&
58*4c3eb207Smrg                                   __internal::__is_random_access_iterator<_OtherIteratorTypes...>::value;
59627f7eb2Smrg     typedef std::integral_constant<bool, value> type;
60627f7eb2Smrg };
61627f7eb2Smrg 
62627f7eb2Smrg template <typename _IteratorType>
63627f7eb2Smrg struct __is_random_access_iterator<_IteratorType>
64627f7eb2Smrg     : std::is_same<typename std::iterator_traits<_IteratorType>::iterator_category, std::random_access_iterator_tag>
65627f7eb2Smrg {
66627f7eb2Smrg };
67627f7eb2Smrg 
68627f7eb2Smrg /* policy */
69627f7eb2Smrg template <typename _Policy>
70627f7eb2Smrg struct __policy_traits
71627f7eb2Smrg {
72627f7eb2Smrg };
73627f7eb2Smrg 
74627f7eb2Smrg template <>
75627f7eb2Smrg struct __policy_traits<sequenced_policy>
76627f7eb2Smrg {
77627f7eb2Smrg     typedef std::false_type allow_parallel;
78627f7eb2Smrg     typedef std::false_type allow_unsequenced;
79627f7eb2Smrg     typedef std::false_type allow_vector;
80627f7eb2Smrg };
81627f7eb2Smrg 
82627f7eb2Smrg template <>
83627f7eb2Smrg struct __policy_traits<unsequenced_policy>
84627f7eb2Smrg {
85627f7eb2Smrg     typedef std::false_type allow_parallel;
86627f7eb2Smrg     typedef std::true_type allow_unsequenced;
87627f7eb2Smrg     typedef std::true_type allow_vector;
88627f7eb2Smrg };
89627f7eb2Smrg 
90627f7eb2Smrg template <>
91627f7eb2Smrg struct __policy_traits<parallel_policy>
92627f7eb2Smrg {
93627f7eb2Smrg     typedef std::true_type allow_parallel;
94627f7eb2Smrg     typedef std::false_type allow_unsequenced;
95627f7eb2Smrg     typedef std::false_type allow_vector;
96627f7eb2Smrg };
97627f7eb2Smrg 
98627f7eb2Smrg template <>
99627f7eb2Smrg struct __policy_traits<parallel_unsequenced_policy>
100627f7eb2Smrg {
101627f7eb2Smrg     typedef std::true_type allow_parallel;
102627f7eb2Smrg     typedef std::true_type allow_unsequenced;
103627f7eb2Smrg     typedef std::true_type allow_vector;
104627f7eb2Smrg };
105627f7eb2Smrg 
106627f7eb2Smrg template <typename _ExecutionPolicy>
107*4c3eb207Smrg using __collector_t =
108*4c3eb207Smrg     typename __internal::__policy_traits<typename std::decay<_ExecutionPolicy>::type>::__collector_type;
109627f7eb2Smrg 
110627f7eb2Smrg template <typename _ExecutionPolicy>
111*4c3eb207Smrg using __allow_vector =
112*4c3eb207Smrg     typename __internal::__policy_traits<typename std::decay<_ExecutionPolicy>::type>::__allow_vector;
113627f7eb2Smrg 
114627f7eb2Smrg template <typename _ExecutionPolicy>
115*4c3eb207Smrg using __allow_unsequenced =
116*4c3eb207Smrg     typename __internal::__policy_traits<typename std::decay<_ExecutionPolicy>::type>::__allow_unsequenced;
117627f7eb2Smrg 
118627f7eb2Smrg template <typename _ExecutionPolicy>
119*4c3eb207Smrg using __allow_parallel =
120*4c3eb207Smrg     typename __internal::__policy_traits<typename std::decay<_ExecutionPolicy>::type>::__allow_parallel;
121627f7eb2Smrg 
122627f7eb2Smrg template <typename _ExecutionPolicy, typename... _IteratorTypes>
123627f7eb2Smrg auto
124627f7eb2Smrg __is_vectorization_preferred(_ExecutionPolicy&& __exec)
125*4c3eb207Smrg     -> decltype(__internal::__lazy_and(__exec.__allow_vector(),
126*4c3eb207Smrg                                        typename __internal::__is_random_access_iterator<_IteratorTypes...>::type()))
127627f7eb2Smrg {
128*4c3eb207Smrg     return __internal::__lazy_and(__exec.__allow_vector(),
129*4c3eb207Smrg                                   typename __internal::__is_random_access_iterator<_IteratorTypes...>::type());
130627f7eb2Smrg }
131627f7eb2Smrg 
132627f7eb2Smrg template <typename _ExecutionPolicy, typename... _IteratorTypes>
133627f7eb2Smrg auto
134627f7eb2Smrg __is_parallelization_preferred(_ExecutionPolicy&& __exec)
135*4c3eb207Smrg     -> decltype(__internal::__lazy_and(__exec.__allow_parallel(),
136*4c3eb207Smrg                                        typename __internal::__is_random_access_iterator<_IteratorTypes...>::type()))
137627f7eb2Smrg {
138*4c3eb207Smrg     return __internal::__lazy_and(__exec.__allow_parallel(),
139*4c3eb207Smrg                                   typename __internal::__is_random_access_iterator<_IteratorTypes...>::type());
140627f7eb2Smrg }
141627f7eb2Smrg 
142627f7eb2Smrg template <typename policy, typename... _IteratorTypes>
143627f7eb2Smrg struct __prefer_unsequenced_tag
144627f7eb2Smrg {
145*4c3eb207Smrg     static constexpr bool value = __internal::__allow_unsequenced<policy>::value &&
146*4c3eb207Smrg                                   __internal::__is_random_access_iterator<_IteratorTypes...>::value;
147627f7eb2Smrg     typedef std::integral_constant<bool, value> type;
148627f7eb2Smrg };
149627f7eb2Smrg 
150627f7eb2Smrg template <typename policy, typename... _IteratorTypes>
151627f7eb2Smrg struct __prefer_parallel_tag
152627f7eb2Smrg {
153*4c3eb207Smrg     static constexpr bool value = __internal::__allow_parallel<policy>::value &&
154*4c3eb207Smrg                                   __internal::__is_random_access_iterator<_IteratorTypes...>::value;
155627f7eb2Smrg     typedef std::integral_constant<bool, value> type;
156627f7eb2Smrg };
157627f7eb2Smrg 
158627f7eb2Smrg } // namespace __internal
159627f7eb2Smrg } // namespace __pstl
160627f7eb2Smrg 
161*4c3eb207Smrg #endif /* _PSTL_EXECUTION_IMPL_H */
162