[libcxx-commits] [libcxx] 88787ac - [libc++] Granularize <execution> (#229315)

via libcxx-commits libcxx-commits at lists.llvm.org
Sat Oct 17 19:23:28 PDT 2026


Author: Emmett
Date: 2026-10-18T10:23:22+08:00
New Revision: 88787ac0a5f8a5c0dd039809d9e57ee3a03b9ae1

URL: https://github.com/llvm/llvm-project/commit/88787ac0a5f8a5c0dd039809d9e57ee3a03b9ae1
DIFF: https://github.com/llvm/llvm-project/commit/88787ac0a5f8a5c0dd039809d9e57ee3a03b9ae1.diff

LOG: [libc++] Granularize <execution> (#229315)

Move execution policies into `__execution/execution_policies.h`
to separate them from upcoming C++26 sender/receiver components.

Also move `__type_traits/is_execution_policy.h` into `__execution`
directory.

This is a prerequisite for #229095.

Added: 
    libcxx/include/__execution/execution_policies.h
    libcxx/include/__execution/is_execution_policy.h

Modified: 
    libcxx/include/CMakeLists.txt
    libcxx/include/__algorithm/pstl.h
    libcxx/include/__memory/pstl.h
    libcxx/include/__numeric/pstl.h
    libcxx/include/__pstl/cpu_algos/any_of.h
    libcxx/include/__pstl/cpu_algos/fill.h
    libcxx/include/__pstl/cpu_algos/find_end.h
    libcxx/include/__pstl/cpu_algos/find_if.h
    libcxx/include/__pstl/cpu_algos/for_each.h
    libcxx/include/__pstl/cpu_algos/is_heap_until.h
    libcxx/include/__pstl/cpu_algos/merge.h
    libcxx/include/__pstl/cpu_algos/min_element.h
    libcxx/include/__pstl/cpu_algos/minmax_element.h
    libcxx/include/__pstl/cpu_algos/mismatch.h
    libcxx/include/__pstl/cpu_algos/reverse.h
    libcxx/include/__pstl/cpu_algos/search.h
    libcxx/include/__pstl/cpu_algos/search_n.h
    libcxx/include/__pstl/cpu_algos/stable_sort.h
    libcxx/include/__pstl/cpu_algos/swap_ranges.h
    libcxx/include/__pstl/cpu_algos/transform.h
    libcxx/include/__pstl/cpu_algos/transform_reduce.h
    libcxx/include/__pstl/cpu_algos/uninitialized_algorithms.h
    libcxx/include/execution
    libcxx/include/module.modulemap.in

Removed: 
    libcxx/include/__type_traits/is_execution_policy.h


################################################################################
diff  --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt
index 9af3d00f36f7e6..fe363130dc5cd5 100644
--- a/libcxx/include/CMakeLists.txt
+++ b/libcxx/include/CMakeLists.txt
@@ -367,6 +367,8 @@ set(files
   __exception/nested_exception.h
   __exception/operations.h
   __exception/terminate.h
+  __execution/execution_policies.h
+  __execution/is_execution_policy.h
   __expected/bad_expected_access.h
   __expected/expected.h
   __expected/unexpect.h
@@ -894,7 +896,6 @@ set(files
   __type_traits/is_empty.h
   __type_traits/is_enum.h
   __type_traits/is_equality_comparable.h
-  __type_traits/is_execution_policy.h
   __type_traits/is_final.h
   __type_traits/is_floating_point.h
   __type_traits/is_function.h

diff  --git a/libcxx/include/__algorithm/pstl.h b/libcxx/include/__algorithm/pstl.h
index 9cba682df3654d..66fa8b3cdd8a00 100644
--- a/libcxx/include/__algorithm/pstl.h
+++ b/libcxx/include/__algorithm/pstl.h
@@ -20,6 +20,7 @@ _LIBCPP_PUSH_MACROS
 
 #if _LIBCPP_HAS_EXPERIMENTAL_PSTL && _LIBCPP_STD_VER >= 17
 
+#  include <__execution/is_execution_policy.h>
 #  include <__functional/operations.h>
 #  include <__iterator/cpp17_iterator_concepts.h>
 #  include <__iterator/iterator_traits.h>
@@ -27,7 +28,6 @@ _LIBCPP_PUSH_MACROS
 #  include <__pstl/dispatch.h>
 #  include <__pstl/handle_exception.h>
 #  include <__type_traits/enable_if.h>
-#  include <__type_traits/is_execution_policy.h>
 #  include <__type_traits/remove_cvref.h>
 #  include <__utility/forward.h>
 #  include <__utility/move.h>

diff  --git a/libcxx/include/__execution/execution_policies.h b/libcxx/include/__execution/execution_policies.h
new file mode 100644
index 00000000000000..e3256553f57a34
--- /dev/null
+++ b/libcxx/include/__execution/execution_policies.h
@@ -0,0 +1,131 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef _LIBCPP___EXECUTION_EXECUTION_POLICIES_H
+#define _LIBCPP___EXECUTION_EXECUTION_POLICIES_H
+
+#include <__config>
+#include <__execution/is_execution_policy.h>
+#include <__type_traits/integral_constant.h>
+#include <__type_traits/is_same.h>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+#  pragma GCC system_header
+#endif
+
+#if _LIBCPP_STD_VER >= 17 && _LIBCPP_HAS_EXPERIMENTAL_PSTL
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+namespace execution {
+struct sequenced_policy {
+  _LIBCPP_HIDE_FROM_ABI constexpr explicit sequenced_policy(__disable_user_instantiations_tag) {}
+  sequenced_policy(const sequenced_policy&)            = delete;
+  sequenced_policy& operator=(const sequenced_policy&) = delete;
+};
+
+inline constexpr sequenced_policy seq{__disable_user_instantiations_tag{}};
+
+struct parallel_policy {
+  _LIBCPP_HIDE_FROM_ABI constexpr explicit parallel_policy(__disable_user_instantiations_tag) {}
+  parallel_policy(const parallel_policy&)            = delete;
+  parallel_policy& operator=(const parallel_policy&) = delete;
+};
+
+inline constexpr parallel_policy par{__disable_user_instantiations_tag{}};
+
+struct parallel_unsequenced_policy {
+  _LIBCPP_HIDE_FROM_ABI constexpr explicit parallel_unsequenced_policy(__disable_user_instantiations_tag) {}
+  parallel_unsequenced_policy(const parallel_unsequenced_policy&)            = delete;
+  parallel_unsequenced_policy& operator=(const parallel_unsequenced_policy&) = delete;
+};
+
+inline constexpr parallel_unsequenced_policy par_unseq{__disable_user_instantiations_tag{}};
+
+struct __unsequenced_policy {
+  _LIBCPP_HIDE_FROM_ABI constexpr explicit __unsequenced_policy(__disable_user_instantiations_tag) {}
+  __unsequenced_policy(const __unsequenced_policy&)            = delete;
+  __unsequenced_policy& operator=(const __unsequenced_policy&) = delete;
+};
+
+constexpr __unsequenced_policy __unseq{__disable_user_instantiations_tag{}};
+
+#  if _LIBCPP_STD_VER >= 20
+
+struct unsequenced_policy {
+  _LIBCPP_HIDE_FROM_ABI constexpr explicit unsequenced_policy(__disable_user_instantiations_tag) {}
+  unsequenced_policy(const unsequenced_policy&)            = delete;
+  unsequenced_policy& operator=(const unsequenced_policy&) = delete;
+};
+
+inline constexpr unsequenced_policy unseq{__disable_user_instantiations_tag{}};
+
+#  endif // _LIBCPP_STD_VER >= 20
+
+} // namespace execution
+
+_LIBCPP_DIAGNOSTIC_PUSH
+#  if __has_warning("-Winvalid-specialization")
+_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Winvalid-specialization")
+#  endif
+template <>
+inline constexpr bool is_execution_policy_v<execution::sequenced_policy> = true;
+
+template <>
+inline constexpr bool is_execution_policy_v<execution::parallel_policy> = true;
+
+template <>
+inline constexpr bool is_execution_policy_v<execution::parallel_unsequenced_policy> = true;
+
+template <>
+inline constexpr bool is_execution_policy_v<execution::__unsequenced_policy> = true;
+_LIBCPP_DIAGNOSTIC_POP
+
+template <>
+inline constexpr bool __is_parallel_execution_policy_impl<execution::parallel_policy> = true;
+
+template <>
+inline constexpr bool __is_parallel_execution_policy_impl<execution::parallel_unsequenced_policy> = true;
+
+template <>
+inline constexpr bool __is_unsequenced_execution_policy_impl<execution::__unsequenced_policy> = true;
+
+template <>
+inline constexpr bool __is_unsequenced_execution_policy_impl<execution::parallel_unsequenced_policy> = true;
+
+#  if _LIBCPP_STD_VER >= 20
+_LIBCPP_DIAGNOSTIC_PUSH
+#    if __has_warning("-Winvalid-specialization")
+_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Winvalid-specialization")
+#    endif
+template <>
+inline constexpr bool is_execution_policy_v<execution::unsequenced_policy> = true;
+_LIBCPP_DIAGNOSTIC_POP
+
+template <>
+inline constexpr bool __is_unsequenced_execution_policy_impl<execution::unsequenced_policy> = true;
+
+#  endif
+
+template <class _Tp>
+struct _LIBCPP_NO_SPECIALIZATIONS is_execution_policy : bool_constant<is_execution_policy_v<_Tp>> {};
+
+template <class _ExecutionPolicy>
+_LIBCPP_HIDE_FROM_ABI auto __remove_parallel_policy(const _ExecutionPolicy&) {
+  if constexpr (is_same_v<_ExecutionPolicy, execution::parallel_policy>) {
+    return execution::sequenced_policy(execution::__disable_user_instantiations_tag{});
+  } else if constexpr (is_same_v<_ExecutionPolicy, execution::parallel_unsequenced_policy>) {
+    return execution::__unsequenced_policy{execution::__disable_user_instantiations_tag{}};
+  }
+}
+
+_LIBCPP_END_NAMESPACE_STD
+
+#endif // _LIBCPP_STD_VER >= 17 && _LIBCPP_HAS_EXPERIMENTAL_PSTL
+
+#endif // _LIBCPP___EXECUTION_EXECUTION_POLICIES_H

diff  --git a/libcxx/include/__type_traits/is_execution_policy.h b/libcxx/include/__execution/is_execution_policy.h
similarity index 92%
rename from libcxx/include/__type_traits/is_execution_policy.h
rename to libcxx/include/__execution/is_execution_policy.h
index 84393e83a8efc1..f87731e1c154ff 100644
--- a/libcxx/include/__type_traits/is_execution_policy.h
+++ b/libcxx/include/__execution/is_execution_policy.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef _LIBCPP___TYPE_TRAITS_IS_EXECUTION_POLICY_H
-#define _LIBCPP___TYPE_TRAITS_IS_EXECUTION_POLICY_H
+#ifndef _LIBCPP___EXECUTION_IS_EXECUTION_POLICY_H
+#define _LIBCPP___EXECUTION_IS_EXECUTION_POLICY_H
 
 #include <__config>
 #include <__type_traits/remove_cvref.h>
@@ -56,4 +56,4 @@ _LIBCPP_END_NAMESPACE_STD
 
 #endif // _LIBCPP_STD_VER >= 17
 
-#endif // _LIBCPP___TYPE_TRAITS_IS_EXECUTION_POLICY_H
+#endif // _LIBCPP___EXECUTION_IS_EXECUTION_POLICY_H

diff  --git a/libcxx/include/__memory/pstl.h b/libcxx/include/__memory/pstl.h
index 4f3024c8b90f68..a22b8a3ce9c721 100644
--- a/libcxx/include/__memory/pstl.h
+++ b/libcxx/include/__memory/pstl.h
@@ -20,13 +20,13 @@ _LIBCPP_PUSH_MACROS
 
 #if _LIBCPP_HAS_EXPERIMENTAL_PSTL && _LIBCPP_STD_VER >= 17
 
+#  include <__execution/is_execution_policy.h>
 #  include <__iterator/cpp17_iterator_concepts.h>
 #  include <__iterator/iterator_traits.h>
 #  include <__pstl/backend.h>
 #  include <__pstl/dispatch.h>
 #  include <__pstl/handle_exception.h>
 #  include <__type_traits/enable_if.h>
-#  include <__type_traits/is_execution_policy.h>
 #  include <__type_traits/remove_cvref.h>
 #  include <__utility/forward.h>
 #  include <__utility/move.h>

diff  --git a/libcxx/include/__numeric/pstl.h b/libcxx/include/__numeric/pstl.h
index 0b85cfb8c23276..84eab701e2282d 100644
--- a/libcxx/include/__numeric/pstl.h
+++ b/libcxx/include/__numeric/pstl.h
@@ -20,6 +20,7 @@ _LIBCPP_PUSH_MACROS
 
 #if _LIBCPP_HAS_EXPERIMENTAL_PSTL && _LIBCPP_STD_VER >= 17
 
+#  include <__execution/is_execution_policy.h>
 #  include <__functional/identity.h>
 #  include <__functional/operations.h>
 #  include <__iterator/cpp17_iterator_concepts.h>
@@ -28,7 +29,6 @@ _LIBCPP_PUSH_MACROS
 #  include <__pstl/dispatch.h>
 #  include <__pstl/handle_exception.h>
 #  include <__type_traits/enable_if.h>
-#  include <__type_traits/is_execution_policy.h>
 #  include <__type_traits/remove_cvref.h>
 #  include <__utility/forward.h>
 #  include <__utility/move.h>

diff  --git a/libcxx/include/__pstl/cpu_algos/any_of.h b/libcxx/include/__pstl/cpu_algos/any_of.h
index cb161542cbc5e1..c01a1cb2fabc9d 100644
--- a/libcxx/include/__pstl/cpu_algos/any_of.h
+++ b/libcxx/include/__pstl/cpu_algos/any_of.h
@@ -14,12 +14,12 @@
 #include <__atomic/atomic.h>
 #include <__atomic/memory_order.h>
 #include <__config>
+#include <__execution/is_execution_policy.h>
 #include <__iterator/concepts.h>
 #include <__optional/nullopt_t.h>
 #include <__optional/optional.h>
 #include <__pstl/backend_fwd.h>
 #include <__pstl/cpu_algos/cpu_traits.h>
-#include <__type_traits/is_execution_policy.h>
 #include <__utility/move.h>
 #include <__utility/pair.h>
 #include <cstdint>

diff  --git a/libcxx/include/__pstl/cpu_algos/fill.h b/libcxx/include/__pstl/cpu_algos/fill.h
index 83993669014e85..a96eedc0990998 100644
--- a/libcxx/include/__pstl/cpu_algos/fill.h
+++ b/libcxx/include/__pstl/cpu_algos/fill.h
@@ -12,11 +12,11 @@
 #include <__algorithm/fill.h>
 #include <__assert>
 #include <__config>
+#include <__execution/is_execution_policy.h>
 #include <__iterator/concepts.h>
 #include <__optional/optional.h>
 #include <__pstl/backend_fwd.h>
 #include <__pstl/cpu_algos/cpu_traits.h>
-#include <__type_traits/is_execution_policy.h>
 #include <__utility/empty.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)

diff  --git a/libcxx/include/__pstl/cpu_algos/find_end.h b/libcxx/include/__pstl/cpu_algos/find_end.h
index 5beef0fc068e91..4f170e354c38c6 100644
--- a/libcxx/include/__pstl/cpu_algos/find_end.h
+++ b/libcxx/include/__pstl/cpu_algos/find_end.h
@@ -11,6 +11,7 @@
 
 #include <__algorithm/find_end.h>
 #include <__config>
+#include <__execution/is_execution_policy.h>
 #include <__functional/operations.h>
 #include <__iterator/concepts.h>
 #include <__iterator/iterator_traits.h>
@@ -19,7 +20,6 @@
 #include <__pstl/backend_fwd.h>
 #include <__pstl/cpu_algos/cpu_traits.h>
 #include <__pstl/cpu_algos/find_if.h>
-#include <__type_traits/is_execution_policy.h>
 #include <__utility/convert_to_integral.h>
 #include <__utility/move.h>
 

diff  --git a/libcxx/include/__pstl/cpu_algos/find_if.h b/libcxx/include/__pstl/cpu_algos/find_if.h
index cf54c4b0d4f52e..9fc14118591ba4 100644
--- a/libcxx/include/__pstl/cpu_algos/find_if.h
+++ b/libcxx/include/__pstl/cpu_algos/find_if.h
@@ -13,6 +13,7 @@
 #include <__assert>
 #include <__atomic/atomic.h>
 #include <__config>
+#include <__execution/is_execution_policy.h>
 #include <__functional/operations.h>
 #include <__iterator/concepts.h>
 #include <__iterator/iterator_traits.h>
@@ -20,7 +21,6 @@
 #include <__optional/optional.h>
 #include <__pstl/backend_fwd.h>
 #include <__pstl/cpu_algos/cpu_traits.h>
-#include <__type_traits/is_execution_policy.h>
 #include <__utility/move.h>
 #include <__utility/pair.h>
 

diff  --git a/libcxx/include/__pstl/cpu_algos/for_each.h b/libcxx/include/__pstl/cpu_algos/for_each.h
index 91ec0dfdc59f3a..bbfa01a88042c6 100644
--- a/libcxx/include/__pstl/cpu_algos/for_each.h
+++ b/libcxx/include/__pstl/cpu_algos/for_each.h
@@ -12,11 +12,11 @@
 #include <__algorithm/for_each.h>
 #include <__assert>
 #include <__config>
+#include <__execution/is_execution_policy.h>
 #include <__iterator/concepts.h>
 #include <__optional/optional.h>
 #include <__pstl/backend_fwd.h>
 #include <__pstl/cpu_algos/cpu_traits.h>
-#include <__type_traits/is_execution_policy.h>
 #include <__utility/empty.h>
 #include <__utility/move.h>
 

diff  --git a/libcxx/include/__pstl/cpu_algos/is_heap_until.h b/libcxx/include/__pstl/cpu_algos/is_heap_until.h
index 0accd5b7354e28..58d0a050fb29cb 100644
--- a/libcxx/include/__pstl/cpu_algos/is_heap_until.h
+++ b/libcxx/include/__pstl/cpu_algos/is_heap_until.h
@@ -11,13 +11,13 @@
 
 #include <__algorithm/is_heap_until.h>
 #include <__config>
+#include <__execution/is_execution_policy.h>
 #include <__functional/operations.h>
 #include <__iterator/iterator_traits.h>
 #include <__optional/optional.h>
 #include <__pstl/backend_fwd.h>
 #include <__pstl/cpu_algos/cpu_traits.h>
 #include <__pstl/cpu_algos/find_if.h>
-#include <__type_traits/is_execution_policy.h>
 #include <__utility/move.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)

diff  --git a/libcxx/include/__pstl/cpu_algos/merge.h b/libcxx/include/__pstl/cpu_algos/merge.h
index 7628f47e40e045..2322319a11d4d1 100644
--- a/libcxx/include/__pstl/cpu_algos/merge.h
+++ b/libcxx/include/__pstl/cpu_algos/merge.h
@@ -12,12 +12,12 @@
 #include <__algorithm/merge.h>
 #include <__assert>
 #include <__config>
+#include <__execution/is_execution_policy.h>
 #include <__iterator/concepts.h>
 #include <__optional/nullopt_t.h>
 #include <__optional/optional.h>
 #include <__pstl/backend_fwd.h>
 #include <__pstl/cpu_algos/cpu_traits.h>
-#include <__type_traits/is_execution_policy.h>
 #include <__utility/move.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)

diff  --git a/libcxx/include/__pstl/cpu_algos/min_element.h b/libcxx/include/__pstl/cpu_algos/min_element.h
index 3f61d8c2b4b421..37a140db064187 100644
--- a/libcxx/include/__pstl/cpu_algos/min_element.h
+++ b/libcxx/include/__pstl/cpu_algos/min_element.h
@@ -11,6 +11,7 @@
 
 #include <__algorithm/min_element.h>
 #include <__config>
+#include <__execution/is_execution_policy.h>
 #include <__functional/identity.h>
 #include <__functional/operations.h>
 #include <__iterator/concepts.h>
@@ -18,7 +19,6 @@
 #include <__optional/optional.h>
 #include <__pstl/backend_fwd.h>
 #include <__pstl/cpu_algos/cpu_traits.h>
-#include <__type_traits/is_execution_policy.h>
 #include <__utility/move.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)

diff  --git a/libcxx/include/__pstl/cpu_algos/minmax_element.h b/libcxx/include/__pstl/cpu_algos/minmax_element.h
index de737ed9f33177..54935ed2c9190b 100644
--- a/libcxx/include/__pstl/cpu_algos/minmax_element.h
+++ b/libcxx/include/__pstl/cpu_algos/minmax_element.h
@@ -11,6 +11,7 @@
 
 #include <__algorithm/minmax_element.h>
 #include <__config>
+#include <__execution/is_execution_policy.h>
 #include <__functional/identity.h>
 #include <__functional/operations.h>
 #include <__iterator/concepts.h>
@@ -18,7 +19,6 @@
 #include <__optional/optional.h>
 #include <__pstl/backend_fwd.h>
 #include <__pstl/cpu_algos/cpu_traits.h>
-#include <__type_traits/is_execution_policy.h>
 #include <__utility/move.h>
 #include <__utility/pair.h>
 

diff  --git a/libcxx/include/__pstl/cpu_algos/mismatch.h b/libcxx/include/__pstl/cpu_algos/mismatch.h
index 1aaec3e047c0b9..924d83d8300c95 100644
--- a/libcxx/include/__pstl/cpu_algos/mismatch.h
+++ b/libcxx/include/__pstl/cpu_algos/mismatch.h
@@ -12,6 +12,7 @@
 #include <__algorithm/min.h>
 #include <__algorithm/mismatch.h>
 #include <__config>
+#include <__execution/is_execution_policy.h>
 #include <__functional/operations.h>
 #include <__iterator/concepts.h>
 #include <__iterator/iterator_traits.h>
@@ -20,7 +21,6 @@
 #include <__pstl/backend_fwd.h>
 #include <__pstl/cpu_algos/cpu_traits.h>
 #include <__pstl/cpu_algos/find_if.h>
-#include <__type_traits/is_execution_policy.h>
 #include <__utility/move.h>
 #include <__utility/pair.h>
 

diff  --git a/libcxx/include/__pstl/cpu_algos/reverse.h b/libcxx/include/__pstl/cpu_algos/reverse.h
index 040804bb0d4679..75d4a121b09a44 100644
--- a/libcxx/include/__pstl/cpu_algos/reverse.h
+++ b/libcxx/include/__pstl/cpu_algos/reverse.h
@@ -12,13 +12,13 @@
 #include <__algorithm/reverse.h>
 #include <__algorithm/swap_ranges.h>
 #include <__config>
+#include <__execution/is_execution_policy.h>
 #include <__iterator/concepts.h>
 #include <__iterator/iterator_traits.h>
 #include <__iterator/reverse_iterator.h>
 #include <__optional/optional.h>
 #include <__pstl/backend_fwd.h>
 #include <__pstl/cpu_algos/cpu_traits.h>
-#include <__type_traits/is_execution_policy.h>
 #include <__utility/empty.h>
 #include <__utility/move.h>
 

diff  --git a/libcxx/include/__pstl/cpu_algos/search.h b/libcxx/include/__pstl/cpu_algos/search.h
index e74f9bebbe3add..467705e573a550 100644
--- a/libcxx/include/__pstl/cpu_algos/search.h
+++ b/libcxx/include/__pstl/cpu_algos/search.h
@@ -11,6 +11,7 @@
 
 #include <__algorithm/search.h>
 #include <__config>
+#include <__execution/is_execution_policy.h>
 #include <__functional/operations.h>
 #include <__iterator/concepts.h>
 #include <__iterator/iterator_traits.h>
@@ -19,7 +20,6 @@
 #include <__pstl/backend_fwd.h>
 #include <__pstl/cpu_algos/cpu_traits.h>
 #include <__pstl/cpu_algos/find_if.h>
-#include <__type_traits/is_execution_policy.h>
 #include <__utility/convert_to_integral.h>
 #include <__utility/move.h>
 

diff  --git a/libcxx/include/__pstl/cpu_algos/search_n.h b/libcxx/include/__pstl/cpu_algos/search_n.h
index 4fd2bef73ff7fc..8a2f6629fb880d 100644
--- a/libcxx/include/__pstl/cpu_algos/search_n.h
+++ b/libcxx/include/__pstl/cpu_algos/search_n.h
@@ -11,6 +11,7 @@
 
 #include <__algorithm/search_n.h>
 #include <__config>
+#include <__execution/is_execution_policy.h>
 #include <__functional/operations.h>
 #include <__iterator/concepts.h>
 #include <__iterator/iterator_traits.h>
@@ -19,7 +20,6 @@
 #include <__pstl/backend_fwd.h>
 #include <__pstl/cpu_algos/cpu_traits.h>
 #include <__pstl/cpu_algos/find_if.h>
-#include <__type_traits/is_execution_policy.h>
 #include <__utility/convert_to_integral.h>
 #include <__utility/move.h>
 #include <__utility/pair.h>

diff  --git a/libcxx/include/__pstl/cpu_algos/stable_sort.h b/libcxx/include/__pstl/cpu_algos/stable_sort.h
index d8d08325564e48..b3e8fe39a43823 100644
--- a/libcxx/include/__pstl/cpu_algos/stable_sort.h
+++ b/libcxx/include/__pstl/cpu_algos/stable_sort.h
@@ -11,10 +11,10 @@
 
 #include <__algorithm/stable_sort.h>
 #include <__config>
+#include <__execution/is_execution_policy.h>
 #include <__optional/optional.h>
 #include <__pstl/backend_fwd.h>
 #include <__pstl/cpu_algos/cpu_traits.h>
-#include <__type_traits/is_execution_policy.h>
 #include <__utility/empty.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)

diff  --git a/libcxx/include/__pstl/cpu_algos/swap_ranges.h b/libcxx/include/__pstl/cpu_algos/swap_ranges.h
index 8e771fc02348d4..c397011a8757df 100644
--- a/libcxx/include/__pstl/cpu_algos/swap_ranges.h
+++ b/libcxx/include/__pstl/cpu_algos/swap_ranges.h
@@ -11,6 +11,7 @@
 
 #include <__algorithm/swap_ranges.h>
 #include <__config>
+#include <__execution/is_execution_policy.h>
 #include <__iterator/concepts.h>
 #include <__iterator/iterator_traits.h>
 #include <__optional/nullopt_t.h>
@@ -18,7 +19,6 @@
 #include <__pstl/backend_fwd.h>
 #include <__pstl/cpu_algos/cpu_traits.h>
 #include <__pstl/cpu_algos/for_each.h>
-#include <__type_traits/is_execution_policy.h>
 #include <__utility/move.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)

diff  --git a/libcxx/include/__pstl/cpu_algos/transform.h b/libcxx/include/__pstl/cpu_algos/transform.h
index 61630ea8f9d479..9f249581c9d4e7 100644
--- a/libcxx/include/__pstl/cpu_algos/transform.h
+++ b/libcxx/include/__pstl/cpu_algos/transform.h
@@ -12,13 +12,13 @@
 #include <__algorithm/transform.h>
 #include <__assert>
 #include <__config>
+#include <__execution/is_execution_policy.h>
 #include <__iterator/concepts.h>
 #include <__iterator/iterator_traits.h>
 #include <__optional/nullopt_t.h>
 #include <__optional/optional.h>
 #include <__pstl/backend_fwd.h>
 #include <__pstl/cpu_algos/cpu_traits.h>
-#include <__type_traits/is_execution_policy.h>
 #include <__utility/move.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)

diff  --git a/libcxx/include/__pstl/cpu_algos/transform_reduce.h b/libcxx/include/__pstl/cpu_algos/transform_reduce.h
index ecf4b0a4462511..8f790a41565ba1 100644
--- a/libcxx/include/__pstl/cpu_algos/transform_reduce.h
+++ b/libcxx/include/__pstl/cpu_algos/transform_reduce.h
@@ -12,6 +12,7 @@
 #include <__assert>
 #include <__config>
 #include <__cstddef/size_t.h>
+#include <__execution/is_execution_policy.h>
 #include <__iterator/concepts.h>
 #include <__iterator/iterator_traits.h>
 #include <__numeric/transform_reduce.h>
@@ -22,7 +23,6 @@
 #include <__type_traits/enable_if.h>
 #include <__type_traits/invoke.h>
 #include <__type_traits/is_arithmetic.h>
-#include <__type_traits/is_execution_policy.h>
 #include <__utility/move.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)

diff  --git a/libcxx/include/__pstl/cpu_algos/uninitialized_algorithms.h b/libcxx/include/__pstl/cpu_algos/uninitialized_algorithms.h
index c68e22a76758cc..a67e84ef0e6762 100644
--- a/libcxx/include/__pstl/cpu_algos/uninitialized_algorithms.h
+++ b/libcxx/include/__pstl/cpu_algos/uninitialized_algorithms.h
@@ -10,6 +10,7 @@
 #define _LIBCPP___PSTL_CPU_ALGOS_UNINITIALIZED_ALGORITHMS_H
 
 #include <__config>
+#include <__execution/is_execution_policy.h>
 #include <__iterator/concepts.h>
 #include <__iterator/iterator_traits.h>
 #include <__memory/uninitialized_algorithms.h>
@@ -18,7 +19,6 @@
 #include <__pstl/backend_fwd.h>
 #include <__pstl/cpu_algos/cpu_traits.h>
 #include <__pstl/cpu_algos/for_each.h>
-#include <__type_traits/is_execution_policy.h>
 #include <__utility/move.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)

diff  --git a/libcxx/include/execution b/libcxx/include/execution
index 49a901282fd9b7..7940d18d66882c 100644
--- a/libcxx/include/execution
+++ b/libcxx/include/execution
@@ -11,6 +11,8 @@
 #define _LIBCPP_EXECUTION
 
 /*
+    execution synopsis
+
 namespace std::execution {
   struct sequenced_policy;
   struct parallel_policy;
@@ -30,130 +32,23 @@ namespace std {
   template <class T>
   inline constexpr bool is_execution_policy_v;
 }
+
 */
 
 #if __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
 #  include <__cxx03/__config>
 #else
 #  include <__config>
-#  include <__type_traits/is_execution_policy.h>
-#  include <__type_traits/is_same.h>
-#  include <__type_traits/remove_cvref.h>
 #  include <version>
 
 #  if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #    pragma GCC system_header
 #  endif
 
-#  if _LIBCPP_HAS_EXPERIMENTAL_PSTL && _LIBCPP_STD_VER >= 17
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-namespace execution {
-struct sequenced_policy {
-  _LIBCPP_HIDE_FROM_ABI constexpr explicit sequenced_policy(__disable_user_instantiations_tag) {}
-  sequenced_policy(const sequenced_policy&)            = delete;
-  sequenced_policy& operator=(const sequenced_policy&) = delete;
-};
-
-inline constexpr sequenced_policy seq{__disable_user_instantiations_tag{}};
-
-struct parallel_policy {
-  _LIBCPP_HIDE_FROM_ABI constexpr explicit parallel_policy(__disable_user_instantiations_tag) {}
-  parallel_policy(const parallel_policy&)            = delete;
-  parallel_policy& operator=(const parallel_policy&) = delete;
-};
-
-inline constexpr parallel_policy par{__disable_user_instantiations_tag{}};
-
-struct parallel_unsequenced_policy {
-  _LIBCPP_HIDE_FROM_ABI constexpr explicit parallel_unsequenced_policy(__disable_user_instantiations_tag) {}
-  parallel_unsequenced_policy(const parallel_unsequenced_policy&)            = delete;
-  parallel_unsequenced_policy& operator=(const parallel_unsequenced_policy&) = delete;
-};
-
-inline constexpr parallel_unsequenced_policy par_unseq{__disable_user_instantiations_tag{}};
-
-struct __unsequenced_policy {
-  _LIBCPP_HIDE_FROM_ABI constexpr explicit __unsequenced_policy(__disable_user_instantiations_tag) {}
-  __unsequenced_policy(const __unsequenced_policy&)            = delete;
-  __unsequenced_policy& operator=(const __unsequenced_policy&) = delete;
-};
-
-constexpr __unsequenced_policy __unseq{__disable_user_instantiations_tag{}};
-
-#    if _LIBCPP_STD_VER >= 20
-
-struct unsequenced_policy {
-  _LIBCPP_HIDE_FROM_ABI constexpr explicit unsequenced_policy(__disable_user_instantiations_tag) {}
-  unsequenced_policy(const unsequenced_policy&)            = delete;
-  unsequenced_policy& operator=(const unsequenced_policy&) = delete;
-};
-
-inline constexpr unsequenced_policy unseq{__disable_user_instantiations_tag{}};
-
-#    endif // _LIBCPP_STD_VER >= 20
-
-} // namespace execution
-
-_LIBCPP_DIAGNOSTIC_PUSH
-#    if __has_warning("-Winvalid-specialization")
-_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Winvalid-specialization")
-#    endif
-template <>
-inline constexpr bool is_execution_policy_v<execution::sequenced_policy> = true;
-
-template <>
-inline constexpr bool is_execution_policy_v<execution::parallel_policy> = true;
-
-template <>
-inline constexpr bool is_execution_policy_v<execution::parallel_unsequenced_policy> = true;
-
-template <>
-inline constexpr bool is_execution_policy_v<execution::__unsequenced_policy> = true;
-_LIBCPP_DIAGNOSTIC_POP
-
-template <>
-inline constexpr bool __is_parallel_execution_policy_impl<execution::parallel_policy> = true;
-
-template <>
-inline constexpr bool __is_parallel_execution_policy_impl<execution::parallel_unsequenced_policy> = true;
-
-template <>
-inline constexpr bool __is_unsequenced_execution_policy_impl<execution::__unsequenced_policy> = true;
-
-template <>
-inline constexpr bool __is_unsequenced_execution_policy_impl<execution::parallel_unsequenced_policy> = true;
-
-#    if _LIBCPP_STD_VER >= 20
-_LIBCPP_DIAGNOSTIC_PUSH
-#      if __has_warning("-Winvalid-specialization")
-_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Winvalid-specialization")
-#      endif
-template <>
-inline constexpr bool is_execution_policy_v<execution::unsequenced_policy> = true;
-_LIBCPP_DIAGNOSTIC_POP
-
-template <>
-inline constexpr bool __is_unsequenced_execution_policy_impl<execution::unsequenced_policy> = true;
-
-#    endif
-
-template <class _Tp>
-struct _LIBCPP_NO_SPECIALIZATIONS is_execution_policy : bool_constant<is_execution_policy_v<_Tp>> {};
-
-template <class _ExecutionPolicy>
-_LIBCPP_HIDE_FROM_ABI auto __remove_parallel_policy(const _ExecutionPolicy&) {
-  if constexpr (is_same_v<_ExecutionPolicy, execution::parallel_policy>) {
-    return execution::sequenced_policy(execution::__disable_user_instantiations_tag{});
-  } else if constexpr (is_same_v<_ExecutionPolicy, execution::parallel_unsequenced_policy>) {
-    return execution::__unsequenced_policy{execution::__disable_user_instantiations_tag{}};
-  }
-}
-
-_LIBCPP_END_NAMESPACE_STD
-
-#  endif // _LIBCPP_HAS_EXPERIMENTAL_PSTL && _LIBCPP_STD_VER >= 17
+#  if _LIBCPP_STD_VER >= 17 && _LIBCPP_HAS_EXPERIMENTAL_PSTL
+#    include <__execution/execution_policies.h>
+#    include <__execution/is_execution_policy.h>
+#  endif
 
 #endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
 

diff  --git a/libcxx/include/module.modulemap.in b/libcxx/include/module.modulemap.in
index 2f6640f8469a5b..7c28ef1f8a9811 100644
--- a/libcxx/include/module.modulemap.in
+++ b/libcxx/include/module.modulemap.in
@@ -186,10 +186,6 @@ module std_core {
       header "__type_traits/is_equality_comparable.h"
       export std_core.type_traits.integral_constant
     }
-    module is_execution_policy {
-      header "__type_traits/is_execution_policy.h"
-      export std_core.type_traits.integral_constant
-    }
     module is_final {
       header "__type_traits/is_final.h"
       export std_core.type_traits.integral_constant
@@ -1271,6 +1267,8 @@ module std {
 
   module execution {
     header "execution"
+    header "__execution/execution_policies.h"
+    header "__execution/is_execution_policy.h"
     export *
   }
 


        


More information about the libcxx-commits mailing list