|
- // -*- C++ -*-
- //===-- execution_defs.h --------------------------------------------------===//
- //
- // 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 _PSTL_EXECUTION_POLICY_DEFS_H
- #define _PSTL_EXECUTION_POLICY_DEFS_H
-
- #include <type_traits>
-
- namespace __pstl
- {
- namespace execution
- {
- inline namespace v1
- {
-
- // 2.4, Sequential execution policy
- class sequenced_policy
- {
- public:
- // For internal use only
- static constexpr std::false_type
- __allow_unsequenced()
- {
- return std::false_type{};
- }
- static constexpr std::false_type
- __allow_vector()
- {
- return std::false_type{};
- }
- static constexpr std::false_type
- __allow_parallel()
- {
- return std::false_type{};
- }
- };
-
- // 2.5, Parallel execution policy
- class parallel_policy
- {
- public:
- // For internal use only
- static constexpr std::false_type
- __allow_unsequenced()
- {
- return std::false_type{};
- }
- static constexpr std::false_type
- __allow_vector()
- {
- return std::false_type{};
- }
- static constexpr std::true_type
- __allow_parallel()
- {
- return std::true_type{};
- }
- };
-
- // 2.6, Parallel+Vector execution policy
- class parallel_unsequenced_policy
- {
- public:
- // For internal use only
- static constexpr std::true_type
- __allow_unsequenced()
- {
- return std::true_type{};
- }
- static constexpr std::true_type
- __allow_vector()
- {
- return std::true_type{};
- }
- static constexpr std::true_type
- __allow_parallel()
- {
- return std::true_type{};
- }
- };
-
- class unsequenced_policy
- {
- public:
- // For internal use only
- static constexpr std::true_type
- __allow_unsequenced()
- {
- return std::true_type{};
- }
- static constexpr std::true_type
- __allow_vector()
- {
- return std::true_type{};
- }
- static constexpr std::false_type
- __allow_parallel()
- {
- return std::false_type{};
- }
- };
-
- // 2.8, Execution policy objects
- constexpr sequenced_policy seq{};
- constexpr parallel_policy par{};
- constexpr parallel_unsequenced_policy par_unseq{};
- constexpr unsequenced_policy unseq{};
-
- // 2.3, Execution policy type trait
- template <class _Tp>
- struct is_execution_policy : std::false_type
- {
- };
-
- template <>
- struct is_execution_policy<__pstl::execution::sequenced_policy> : std::true_type
- {
- };
- template <>
- struct is_execution_policy<__pstl::execution::parallel_policy> : std::true_type
- {
- };
- template <>
- struct is_execution_policy<__pstl::execution::parallel_unsequenced_policy> : std::true_type
- {
- };
- template <>
- struct is_execution_policy<__pstl::execution::unsequenced_policy> : std::true_type
- {
- };
-
- #if _PSTL_CPP14_VARIABLE_TEMPLATES_PRESENT
- template <class _Tp>
- constexpr bool is_execution_policy_v = __pstl::execution::is_execution_policy<_Tp>::value;
- #endif
-
- } // namespace v1
- } // namespace execution
-
- namespace __internal
- {
- template <class _ExecPolicy, class _Tp>
- #if _GLIBCXX_RELEASE >= 9
- using __enable_if_execution_policy =
- typename std::enable_if<__pstl::execution::is_execution_policy<std::__remove_cvref_t<_ExecPolicy>>::value,
- _Tp>::type;
- #else
- using __enable_if_execution_policy =
- typename std::enable_if<__pstl::execution::is_execution_policy<typename std::decay<_ExecPolicy>::type>::value,
- _Tp>::type;
- #endif
- } // namespace __internal
-
- } // namespace __pstl
-
- #endif /* _PSTL_EXECUTION_POLICY_DEFS_H */
|