Path: blob/main/contrib/llvm-project/libcxx/include/__pstl/backend_fwd.h
35233 views
//===----------------------------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#ifndef _LIBCPP___PSTL_BACKEND_FWD_H9#define _LIBCPP___PSTL_BACKEND_FWD_H1011#include <__config>1213#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)14# pragma GCC system_header15#endif1617_LIBCPP_PUSH_MACROS18#include <__undef_macros>1920//21// This header declares available PSTL backends and the functions that must be implemented in order for the22// PSTL algorithms to be provided.23//24// Backends often do not implement the full set of functions themselves -- a configuration of the PSTL is25// usually a set of backends "stacked" together which each implement some algorithms under some execution26// policies. It is only necessary for the "stack" of backends to implement all algorithms under all execution27// policies, but a single backend is not required to implement everything on its own.28//29// The signatures used by each backend function are documented below.30//31// Exception handling32// ==================33//34// PSTL backends are expected to report errors (i.e. failure to allocate) by returning a disengaged `optional` from35// their implementation. Exceptions shouldn't be used to report an internal failure-to-allocate, since all exceptions36// are turned into a program termination at the front-end level. When a backend returns a disengaged `optional` to the37// frontend, the frontend will turn that into a call to `std::__throw_bad_alloc();` to report the internal failure to38// the user.39//4041_LIBCPP_BEGIN_NAMESPACE_STD42namespace __pstl {4344template <class... _Backends>45struct __backend_configuration;4647struct __default_backend_tag;48struct __libdispatch_backend_tag;49struct __serial_backend_tag;50struct __std_thread_backend_tag;5152#if defined(_LIBCPP_PSTL_BACKEND_SERIAL)53using __current_configuration = __backend_configuration<__serial_backend_tag, __default_backend_tag>;54#elif defined(_LIBCPP_PSTL_BACKEND_STD_THREAD)55using __current_configuration = __backend_configuration<__std_thread_backend_tag, __default_backend_tag>;56#elif defined(_LIBCPP_PSTL_BACKEND_LIBDISPATCH)57using __current_configuration = __backend_configuration<__libdispatch_backend_tag, __default_backend_tag>;58#else5960// ...New vendors can add parallel backends here...6162# error "Invalid PSTL backend configuration"63#endif6465template <class _Backend, class _ExecutionPolicy>66struct __find_if;67// template <class _Policy, class _ForwardIterator, class _Predicate>68// optional<_ForwardIterator>69// operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) const noexcept;7071template <class _Backend, class _ExecutionPolicy>72struct __find_if_not;73// template <class _Policy, class _ForwardIterator, class _Predicate>74// optional<_ForwardIterator>75// operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) const noexcept;7677template <class _Backend, class _ExecutionPolicy>78struct __find;79// template <class _Policy, class _ForwardIterator, class _Tp>80// optional<_ForwardIterator>81// operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) const noexcept;8283template <class _Backend, class _ExecutionPolicy>84struct __any_of;85// template <class _Policy, class _ForwardIterator, class _Predicate>86// optional<bool>87// operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) const noexcept;8889template <class _Backend, class _ExecutionPolicy>90struct __all_of;91// template <class _Policy, class _ForwardIterator, class _Predicate>92// optional<bool>93// operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) const noexcept;9495template <class _Backend, class _ExecutionPolicy>96struct __none_of;97// template <class _Policy, class _ForwardIterator, class _Predicate>98// optional<bool>99// operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) const noexcept;100101template <class _Backend, class _ExecutionPolicy>102struct __is_partitioned;103// template <class _Policy, class _ForwardIterator, class _Predicate>104// optional<bool>105// operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) const noexcept;106107template <class _Backend, class _ExecutionPolicy>108struct __for_each;109// template <class _Policy, class _ForwardIterator, class _Function>110// optional<__empty>111// operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Function __func) const noexcept;112113template <class _Backend, class _ExecutionPolicy>114struct __for_each_n;115// template <class _Policy, class _ForwardIterator, class _Size, class _Function>116// optional<__empty>117// operator()(_Policy&&, _ForwardIterator __first, _Size __size, _Function __func) const noexcept;118119template <class _Backend, class _ExecutionPolicy>120struct __fill;121// template <class _Policy, class _ForwardIterator, class _Tp>122// optional<__empty>123// operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Tp const& __value) const noexcept;124125template <class _Backend, class _ExecutionPolicy>126struct __fill_n;127// template <class _Policy, class _ForwardIterator, class _Size, class _Tp>128// optional<__empty>129// operator()(_Policy&&, _ForwardIterator __first, _Size __n, _Tp const& __value) const noexcept;130131template <class _Backend, class _ExecutionPolicy>132struct __replace;133// template <class _Policy, class _ForwardIterator, class _Tp>134// optional<__empty>135// operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last,136// _Tp const& __old, _Tp const& __new) const noexcept;137138template <class _Backend, class _ExecutionPolicy>139struct __replace_if;140// template <class _Policy, class _ForwardIterator, class _Predicate, class _Tp>141// optional<__empty>142// operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last,143// _Predicate __pred, _Tp const& __new_value) const noexcept;144145template <class _Backend, class _ExecutionPolicy>146struct __generate;147// template <class _Policy, class _ForwardIterator, class _Generator>148// optional<__empty>149// operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Generator __gen) const noexcept;150151template <class _Backend, class _ExecutionPolicy>152struct __generate_n;153// template <class _Policy, class _ForwardIterator, class _Size, class _Generator>154// optional<__empty>155// operator()(_Policy&&, _ForwardIterator __first, _Size __n, _Generator __gen) const noexcept;156157template <class _Backend, class _ExecutionPolicy>158struct __merge;159// template <class _Policy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardOutIterator, class _Comp>160// optional<_ForwardOutIterator>161// operator()(_Policy&&, _ForwardIterator1 __first1, _ForwardIterator1 __last1,162// _ForwardIterator2 __first2, _ForwardIterator2 __last2,163// _ForwardOutIterator __result, _Comp __comp) const noexcept;164165template <class _Backend, class _ExecutionPolicy>166struct __stable_sort;167// template <class _Policy, class _RandomAccessIterator, class _Comp>168// optional<__empty>169// operator()(_Policy&&, _RandomAccessIterator __first, _RandomAccessIterator __last, _Comp __comp) const noexcept;170171template <class _Backend, class _ExecutionPolicy>172struct __sort;173// template <class _Policy, class _RandomAccessIterator, class _Comp>174// optional<__empty>175// operator()(_Policy&&, _RandomAccessIterator __first, _RandomAccessIterator __last, _Comp __comp) const noexcept;176177template <class _Backend, class _ExecutionPolicy>178struct __transform;179// template <class _Policy, class _ForwardIterator, class _ForwardOutIterator, class _UnaryOperation>180// optional<_ForwardOutIterator>181// operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last,182// _ForwardOutIterator __result,183// _UnaryOperation __op) const noexcept;184185template <class _Backend, class _ExecutionPolicy>186struct __transform_binary;187// template <class _Policy, class _ForwardIterator1, class _ForwardIterator2,188// class _ForwardOutIterator,189// class _BinaryOperation>190// optional<_ForwardOutIterator>191// operator()(_Policy&&, _ForwardIterator1 __first1, _ForwardIterator1 __last1,192// _ForwardIterator2 __first2,193// _ForwardOutIterator __result,194// _BinaryOperation __op) const noexcept;195196template <class _Backend, class _ExecutionPolicy>197struct __replace_copy_if;198// template <class _Policy, class _ForwardIterator, class _ForwardOutIterator, class _Predicate, class _Tp>199// optional<__empty>200// operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last,201// _ForwardOutIterator __out_it,202// _Predicate __pred,203// _Tp const& __new_value) const noexcept;204205template <class _Backend, class _ExecutionPolicy>206struct __replace_copy;207// template <class _Policy, class _ForwardIterator, class _ForwardOutIterator, class _Tp>208// optional<__empty>209// operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last,210// _ForwardOutIterator __out_it,211// _Tp const& __old_value,212// _Tp const& __new_value) const noexcept;213214template <class _Backend, class _ExecutionPolicy>215struct __move;216// template <class _Policy, class _ForwardIterator, class _ForwardOutIterator>217// optional<_ForwardOutIterator>218// operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last,219// _ForwardOutIterator __out_it) const noexcept;220221template <class _Backend, class _ExecutionPolicy>222struct __copy;223// template <class _Policy, class _ForwardIterator, class _ForwardOutIterator>224// optional<_ForwardOutIterator>225// operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last,226// _ForwardOutIterator __out_it) const noexcept;227228template <class _Backend, class _ExecutionPolicy>229struct __copy_n;230// template <class _Policy, class _ForwardIterator, class _Size, class _ForwardOutIterator>231// optional<_ForwardOutIterator>232// operator()(_Policy&&, _ForwardIterator __first, _Size __n, _ForwardOutIterator __out_it) const noexcept;233234template <class _Backend, class _ExecutionPolicy>235struct __rotate_copy;236// template <class _Policy, class _ForwardIterator, class _ForwardOutIterator>237// optional<_ForwardOutIterator>238// operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last,239// _ForwardOutIterator __out_it) const noexcept;240241template <class _Backend, class _ExecutionPolicy>242struct __transform_reduce;243// template <class _Policy, class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation>244// optional<_Tp>245// operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last,246// _Tp __init,247// _BinaryOperation __reduce,248// _UnaryOperation __transform) const noexcept;249250template <class _Backend, class _ExecutionPolicy>251struct __transform_reduce_binary;252// template <class _Policy, class _ForwardIterator1, class _ForwardIterator2,253// class _Tp, class _BinaryOperation1, class _BinaryOperation2>254// optional<_Tp> operator()(_Policy&&, _ForwardIterator1 __first1, _ForwardIterator1 __last1,255// _ForwardIterator2 __first2,256// _Tp __init,257// _BinaryOperation1 __reduce,258// _BinaryOperation2 __transform) const noexcept;259260template <class _Backend, class _ExecutionPolicy>261struct __count_if;262// template <class _Policy, class _ForwardIterator, class _Predicate>263// optional<__iter_diff_t<_ForwardIterator>>264// operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) const noexcept;265266template <class _Backend, class _ExecutionPolicy>267struct __count;268// template <class _Policy, class _ForwardIterator, class _Tp>269// optional<__iter_diff_t<_ForwardIterator>>270// operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Tp const& __value) const noexcept;271272template <class _Backend, class _ExecutionPolicy>273struct __equal_3leg;274// template <class _Policy, class _ForwardIterator1, class _ForwardIterator2, class _Predicate>275// optional<bool>276// operator()(_Policy&&, _ForwardIterator1 __first1, _ForwardIterator1 __last1,277// _ForwardIterator2 __first2,278// _Predicate __pred) const noexcept;279280template <class _Backend, class _ExecutionPolicy>281struct __equal;282// template <class _Policy, class _ForwardIterator1, class _ForwardIterator2, class _Predicate>283// optional<bool>284// operator()(_Policy&&, _ForwardIterator1 __first1, _ForwardIterator1 __last1,285// _ForwardIterator2 __first2, _ForwardIterator2 __last2,286// _Predicate __pred) const noexcept;287288template <class _Backend, class _ExecutionPolicy>289struct __reduce;290// template <class _Policy, class _ForwardIterator, class _Tp, class _BinaryOperation>291// optional<_Tp>292// operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last,293// _Tp __init, _BinaryOperation __op) const noexcept;294295} // namespace __pstl296_LIBCPP_END_NAMESPACE_STD297298_LIBCPP_POP_MACROS299300#endif // _LIBCPP___PSTL_BACKEND_FWD_H301302303