xref: /freebsd/contrib/llvm-project/libcxx/include/execution (revision 700637cbb5e582861067a11aaca4d053546871d2)
1e40139ffSDimitry Andric// -*- C++ -*-
2349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
3e40139ffSDimitry Andric//
4e40139ffSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5e40139ffSDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
6e40139ffSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7e40139ffSDimitry Andric//
8e40139ffSDimitry Andric//===----------------------------------------------------------------------===//
9e40139ffSDimitry Andric
10e40139ffSDimitry Andric#ifndef _LIBCPP_EXECUTION
11e40139ffSDimitry Andric#define _LIBCPP_EXECUTION
12e40139ffSDimitry Andric
1306c3fb27SDimitry Andric/*
1406c3fb27SDimitry Andricnamespace std::execution {
1506c3fb27SDimitry Andric  struct sequenced_policy;
1606c3fb27SDimitry Andric  struct parallel_policy;
1706c3fb27SDimitry Andric  struct parallel_unsequenced_policy;
1806c3fb27SDimitry Andric  struct unsequenced_policy; // since C++20
1906c3fb27SDimitry Andric
2006c3fb27SDimitry Andric  inline constexpr sequenced_policy seq = implementation-defined;
2106c3fb27SDimitry Andric  inline constexpr parallel_policy par = implementation-defined;
2206c3fb27SDimitry Andric  inline constexpr parallel_unsequenced_policy par_unseq = implementation-defined;
2306c3fb27SDimitry Andric  inline constexpr unsequenced_policy unseq = implementation-defined; // since C++20
2406c3fb27SDimitry Andric}
2506c3fb27SDimitry Andric
2606c3fb27SDimitry Andricnamespace std {
2706c3fb27SDimitry Andric  template <class T>
2806c3fb27SDimitry Andric  struct is_execution_policy;
2906c3fb27SDimitry Andric
3006c3fb27SDimitry Andric  template <class T>
3106c3fb27SDimitry Andric  inline constexpr bool is_execution_policy_v;
3206c3fb27SDimitry Andric}
3306c3fb27SDimitry Andric*/
3406c3fb27SDimitry Andric
35*700637cbSDimitry Andric#if __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
36*700637cbSDimitry Andric#  include <__cxx03/__config>
37*700637cbSDimitry Andric#else
38e40139ffSDimitry Andric#  include <__config>
3906c3fb27SDimitry Andric#  include <__type_traits/is_execution_policy.h>
4006c3fb27SDimitry Andric#  include <__type_traits/is_same.h>
4106c3fb27SDimitry Andric#  include <__type_traits/remove_cvref.h>
4204eeddc0SDimitry Andric#  include <version>
43e40139ffSDimitry Andric
440eae32dcSDimitry Andric#  if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
450eae32dcSDimitry Andric#    pragma GCC system_header
460eae32dcSDimitry Andric#  endif
470eae32dcSDimitry Andric
48*700637cbSDimitry Andric#  if _LIBCPP_HAS_EXPERIMENTAL_PSTL && _LIBCPP_STD_VER >= 17
4906c3fb27SDimitry Andric
5006c3fb27SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD
5106c3fb27SDimitry Andric
5206c3fb27SDimitry Andricnamespace execution {
5306c3fb27SDimitry Andricstruct sequenced_policy {
5406c3fb27SDimitry Andric  _LIBCPP_HIDE_FROM_ABI constexpr explicit sequenced_policy(__disable_user_instantiations_tag) {}
5506c3fb27SDimitry Andric  sequenced_policy(const sequenced_policy&)            = delete;
5606c3fb27SDimitry Andric  sequenced_policy& operator=(const sequenced_policy&) = delete;
5706c3fb27SDimitry Andric};
5806c3fb27SDimitry Andric
5906c3fb27SDimitry Andricinline constexpr sequenced_policy seq{__disable_user_instantiations_tag{}};
6006c3fb27SDimitry Andric
6106c3fb27SDimitry Andricstruct parallel_policy {
6206c3fb27SDimitry Andric  _LIBCPP_HIDE_FROM_ABI constexpr explicit parallel_policy(__disable_user_instantiations_tag) {}
6306c3fb27SDimitry Andric  parallel_policy(const parallel_policy&)            = delete;
6406c3fb27SDimitry Andric  parallel_policy& operator=(const parallel_policy&) = delete;
6506c3fb27SDimitry Andric};
6606c3fb27SDimitry Andric
6706c3fb27SDimitry Andricinline constexpr parallel_policy par{__disable_user_instantiations_tag{}};
6806c3fb27SDimitry Andric
6906c3fb27SDimitry Andricstruct parallel_unsequenced_policy {
7006c3fb27SDimitry Andric  _LIBCPP_HIDE_FROM_ABI constexpr explicit parallel_unsequenced_policy(__disable_user_instantiations_tag) {}
7106c3fb27SDimitry Andric  parallel_unsequenced_policy(const parallel_unsequenced_policy&)            = delete;
7206c3fb27SDimitry Andric  parallel_unsequenced_policy& operator=(const parallel_unsequenced_policy&) = delete;
7306c3fb27SDimitry Andric};
7406c3fb27SDimitry Andric
7506c3fb27SDimitry Andricinline constexpr parallel_unsequenced_policy par_unseq{__disable_user_instantiations_tag{}};
7606c3fb27SDimitry Andric
7706c3fb27SDimitry Andricstruct __unsequenced_policy {
7806c3fb27SDimitry Andric  _LIBCPP_HIDE_FROM_ABI constexpr explicit __unsequenced_policy(__disable_user_instantiations_tag) {}
7906c3fb27SDimitry Andric  __unsequenced_policy(const __unsequenced_policy&)            = delete;
8006c3fb27SDimitry Andric  __unsequenced_policy& operator=(const __unsequenced_policy&) = delete;
8106c3fb27SDimitry Andric};
8206c3fb27SDimitry Andric
8306c3fb27SDimitry Andricconstexpr __unsequenced_policy __unseq{__disable_user_instantiations_tag{}};
8406c3fb27SDimitry Andric
8506c3fb27SDimitry Andric#    if _LIBCPP_STD_VER >= 20
8606c3fb27SDimitry Andric
8706c3fb27SDimitry Andricstruct unsequenced_policy {
8806c3fb27SDimitry Andric  _LIBCPP_HIDE_FROM_ABI constexpr explicit unsequenced_policy(__disable_user_instantiations_tag) {}
8906c3fb27SDimitry Andric  unsequenced_policy(const unsequenced_policy&)            = delete;
9006c3fb27SDimitry Andric  unsequenced_policy& operator=(const unsequenced_policy&) = delete;
9106c3fb27SDimitry Andric};
9206c3fb27SDimitry Andric
9306c3fb27SDimitry Andricinline constexpr unsequenced_policy unseq{__disable_user_instantiations_tag{}};
9406c3fb27SDimitry Andric
9506c3fb27SDimitry Andric#    endif // _LIBCPP_STD_VER >= 20
9606c3fb27SDimitry Andric
9706c3fb27SDimitry Andric} // namespace execution
9806c3fb27SDimitry Andric
99*700637cbSDimitry Andric_LIBCPP_DIAGNOSTIC_PUSH
100*700637cbSDimitry Andric#    if __has_warning("-Winvalid-specialization")
101*700637cbSDimitry Andric_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Winvalid-specialization")
102*700637cbSDimitry Andric#    endif
10306c3fb27SDimitry Andrictemplate <>
10406c3fb27SDimitry Andricinline constexpr bool is_execution_policy_v<execution::sequenced_policy> = true;
10506c3fb27SDimitry Andric
10606c3fb27SDimitry Andrictemplate <>
10706c3fb27SDimitry Andricinline constexpr bool is_execution_policy_v<execution::parallel_policy> = true;
10806c3fb27SDimitry Andric
10906c3fb27SDimitry Andrictemplate <>
11006c3fb27SDimitry Andricinline constexpr bool is_execution_policy_v<execution::parallel_unsequenced_policy> = true;
11106c3fb27SDimitry Andric
11206c3fb27SDimitry Andrictemplate <>
11306c3fb27SDimitry Andricinline constexpr bool is_execution_policy_v<execution::__unsequenced_policy> = true;
114*700637cbSDimitry Andric_LIBCPP_DIAGNOSTIC_POP
11506c3fb27SDimitry Andric
11606c3fb27SDimitry Andrictemplate <>
11706c3fb27SDimitry Andricinline constexpr bool __is_parallel_execution_policy_impl<execution::parallel_policy> = true;
11806c3fb27SDimitry Andric
11906c3fb27SDimitry Andrictemplate <>
12006c3fb27SDimitry Andricinline constexpr bool __is_parallel_execution_policy_impl<execution::parallel_unsequenced_policy> = true;
12106c3fb27SDimitry Andric
12206c3fb27SDimitry Andrictemplate <>
12306c3fb27SDimitry Andricinline constexpr bool __is_unsequenced_execution_policy_impl<execution::__unsequenced_policy> = true;
12406c3fb27SDimitry Andric
12506c3fb27SDimitry Andrictemplate <>
12606c3fb27SDimitry Andricinline constexpr bool __is_unsequenced_execution_policy_impl<execution::parallel_unsequenced_policy> = true;
12706c3fb27SDimitry Andric
12806c3fb27SDimitry Andric#    if _LIBCPP_STD_VER >= 20
129*700637cbSDimitry Andric_LIBCPP_DIAGNOSTIC_PUSH
130*700637cbSDimitry Andric#      if __has_warning("-Winvalid-specialization")
131*700637cbSDimitry Andric_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Winvalid-specialization")
132*700637cbSDimitry Andric#      endif
13306c3fb27SDimitry Andrictemplate <>
13406c3fb27SDimitry Andricinline constexpr bool is_execution_policy_v<execution::unsequenced_policy> = true;
135*700637cbSDimitry Andric_LIBCPP_DIAGNOSTIC_POP
13606c3fb27SDimitry Andric
13706c3fb27SDimitry Andrictemplate <>
13806c3fb27SDimitry Andricinline constexpr bool __is_unsequenced_execution_policy_impl<execution::unsequenced_policy> = true;
13906c3fb27SDimitry Andric
14006c3fb27SDimitry Andric#    endif
14106c3fb27SDimitry Andric
14206c3fb27SDimitry Andrictemplate <class _Tp>
143*700637cbSDimitry Andricstruct _LIBCPP_NO_SPECIALIZATIONS is_execution_policy : bool_constant<is_execution_policy_v<_Tp>> {};
14406c3fb27SDimitry Andric
14506c3fb27SDimitry Andrictemplate <class _ExecutionPolicy>
14606c3fb27SDimitry Andric_LIBCPP_HIDE_FROM_ABI auto __remove_parallel_policy(const _ExecutionPolicy&) {
14706c3fb27SDimitry Andric  if constexpr (is_same_v<_ExecutionPolicy, execution::parallel_policy>) {
14806c3fb27SDimitry Andric    return execution::sequenced_policy(execution::__disable_user_instantiations_tag{});
14906c3fb27SDimitry Andric  } else if constexpr (is_same_v<_ExecutionPolicy, execution::parallel_unsequenced_policy>) {
15006c3fb27SDimitry Andric    return execution::__unsequenced_policy{execution::__disable_user_instantiations_tag{}};
15106c3fb27SDimitry Andric  }
15206c3fb27SDimitry Andric}
15306c3fb27SDimitry Andric
15406c3fb27SDimitry Andric_LIBCPP_END_NAMESPACE_STD
15506c3fb27SDimitry Andric
156*700637cbSDimitry Andric#  endif // _LIBCPP_HAS_EXPERIMENTAL_PSTL && _LIBCPP_STD_VER >= 17
15706c3fb27SDimitry Andric
1583ac42330SDimitry Andric#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
1593ac42330SDimitry Andric#    include <cstddef>
1603ac42330SDimitry Andric#  endif
161*700637cbSDimitry Andric#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
1623ac42330SDimitry Andric
163e40139ffSDimitry Andric#endif // _LIBCPP_EXECUTION
164