algorithm_fwd.h 67 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336
  1. // -*- C++ -*-
  2. //===-- algorithm_fwd.h --------------------------------------------------===//
  3. //
  4. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  5. // See https://llvm.org/LICENSE.txt for license information.
  6. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #ifndef __PSTL_algorithm_fwd_H
  10. #define __PSTL_algorithm_fwd_H
  11. #include <type_traits>
  12. #include <utility>
  13. namespace __pstl
  14. {
  15. namespace __internal
  16. {
  17. //------------------------------------------------------------------------
  18. // any_of
  19. //------------------------------------------------------------------------
  20. template <class _ForwardIterator, class _Pred>
  21. bool
  22. __brick_any_of(const _ForwardIterator, const _ForwardIterator, _Pred,
  23. /*__is_vector=*/std::false_type) noexcept;
  24. template <class _ForwardIterator, class _Pred>
  25. bool
  26. __brick_any_of(const _ForwardIterator, const _ForwardIterator, _Pred,
  27. /*__is_vector=*/std::true_type) noexcept;
  28. template <class _ExecutionPolicy, class _ForwardIterator, class _Pred, class _IsVector>
  29. bool
  30. __pattern_any_of(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Pred, _IsVector,
  31. /*parallel=*/std::false_type) noexcept;
  32. #if __PSTL_USE_PAR_POLICIES
  33. template <class _ExecutionPolicy, class _ForwardIterator, class _Pred, class _IsVector>
  34. bool
  35. __pattern_any_of(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Pred, _IsVector,
  36. /*parallel=*/std::true_type);
  37. #endif
  38. //------------------------------------------------------------------------
  39. // walk1 (pseudo)
  40. //
  41. // walk1 evaluates f(x) for each dereferenced value x drawn from [first,last)
  42. //------------------------------------------------------------------------
  43. template <class _ForwardIterator, class _Function>
  44. void __brick_walk1(_ForwardIterator, _ForwardIterator, _Function,
  45. /*vector=*/std::false_type) noexcept;
  46. template <class _RandomAccessIterator, class _Function>
  47. void __brick_walk1(_RandomAccessIterator, _RandomAccessIterator, _Function,
  48. /*vector=*/std::true_type) noexcept;
  49. template <class _ExecutionPolicy, class _ForwardIterator, class _Function, class _IsVector>
  50. void
  51. __pattern_walk1(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Function, _IsVector,
  52. /*parallel=*/std::false_type) noexcept;
  53. #if __PSTL_USE_PAR_POLICIES
  54. template <class _ExecutionPolicy, class _ForwardIterator, class _Function, class _IsVector>
  55. void
  56. __pattern_walk1(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Function, _IsVector,
  57. /*parallel=*/std::true_type);
  58. #endif
  59. template <class _ExecutionPolicy, class _ForwardIterator, class _Brick>
  60. void
  61. __pattern_walk_brick(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Brick,
  62. /*parallel=*/std::false_type) noexcept;
  63. #if __PSTL_USE_PAR_POLICIES
  64. template <class _ExecutionPolicy, class _ForwardIterator, class _Brick>
  65. void
  66. __pattern_walk_brick(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Brick,
  67. /*parallel=*/std::true_type);
  68. #endif
  69. //------------------------------------------------------------------------
  70. // walk1_n
  71. //------------------------------------------------------------------------
  72. template <class _ForwardIterator, class _Size, class _Function>
  73. _ForwardIterator __brick_walk1_n(_ForwardIterator, _Size, _Function,
  74. /*_IsVectorTag=*/std::false_type);
  75. template <class _RandomAccessIterator, class _DifferenceType, class _Function>
  76. _RandomAccessIterator __brick_walk1_n(_RandomAccessIterator, _DifferenceType, _Function,
  77. /*vectorTag=*/std::true_type) noexcept;
  78. template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Function, class _IsVector>
  79. _ForwardIterator
  80. __pattern_walk1_n(_ExecutionPolicy&&, _ForwardIterator, _Size, _Function, _IsVector,
  81. /*is_parallel=*/std::false_type) noexcept;
  82. #if __PSTL_USE_PAR_POLICIES
  83. template <class _ExecutionPolicy, class _RandomAccessIterator, class _Size, class _Function, class _IsVector>
  84. _RandomAccessIterator
  85. __pattern_walk1_n(_ExecutionPolicy&&, _RandomAccessIterator, _Size, _Function, _IsVector,
  86. /*is_parallel=*/std::true_type);
  87. #endif
  88. template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Brick>
  89. _ForwardIterator
  90. __pattern_walk_brick_n(_ExecutionPolicy&&, _ForwardIterator, _Size, _Brick,
  91. /*is_parallel=*/std::false_type) noexcept;
  92. #if __PSTL_USE_PAR_POLICIES
  93. template <class _ExecutionPolicy, class _RandomAccessIterator, class _Size, class _Brick>
  94. _RandomAccessIterator
  95. __pattern_walk_brick_n(_ExecutionPolicy&&, _RandomAccessIterator, _Size, _Brick,
  96. /*is_parallel=*/std::true_type);
  97. #endif
  98. //------------------------------------------------------------------------
  99. // walk2 (pseudo)
  100. //
  101. // walk2 evaluates f(x,y) for deferenced values (x,y) drawn from [first1,last1) and [first2,...)
  102. //------------------------------------------------------------------------
  103. template <class _ForwardIterator1, class _ForwardIterator2, class _Function>
  104. _ForwardIterator2 __brick_walk2(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _Function,
  105. /*vector=*/std::false_type) noexcept;
  106. template <class _ForwardIterator1, class _ForwardIterator2, class _Function>
  107. _ForwardIterator2 __brick_walk2(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _Function,
  108. /*vector=*/std::true_type) noexcept;
  109. template <class _ForwardIterator1, class _Size, class _ForwardIterator2, class _Function>
  110. _ForwardIterator2 __brick_walk2_n(_ForwardIterator1, _Size, _ForwardIterator2, _Function,
  111. /*vector=*/std::false_type) noexcept;
  112. template <class _ForwardIterator1, class _Size, class _ForwardIterator2, class _Function>
  113. _ForwardIterator2 __brick_walk2_n(_ForwardIterator1, _Size, _ForwardIterator2, _Function,
  114. /*vector=*/std::true_type) noexcept;
  115. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Function, class _IsVector>
  116. _ForwardIterator2
  117. __pattern_walk2(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _Function, _IsVector,
  118. /*parallel=*/std::false_type) noexcept;
  119. #if __PSTL_USE_PAR_POLICIES
  120. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Function, class _IsVector>
  121. _ForwardIterator2
  122. __pattern_walk2(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _Function, _IsVector,
  123. /*parallel=*/std::true_type);
  124. #endif
  125. template <class _ExecutionPolicy, class _ForwardIterator1, class _Size, class _ForwardIterator2, class _Function,
  126. class _IsVector>
  127. _ForwardIterator2
  128. __pattern_walk2_n(_ExecutionPolicy&&, _ForwardIterator1, _Size, _ForwardIterator2, _Function, _IsVector,
  129. /*parallel=*/std::false_type) noexcept;
  130. #if __PSTL_USE_PAR_POLICIES
  131. template <class _ExecutionPolicy, class _RandomAccessIterator1, class _Size, class _RandomAccessIterator2,
  132. class _Function, class _IsVector>
  133. _RandomAccessIterator2
  134. __pattern_walk2_n(_ExecutionPolicy&&, _RandomAccessIterator1, _Size, _RandomAccessIterator2, _Function, _IsVector,
  135. /*parallel=*/std::true_type);
  136. #endif
  137. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Brick>
  138. _ForwardIterator2
  139. __pattern_walk2_brick(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _Brick,
  140. /*parallel=*/std::false_type) noexcept;
  141. #if __PSTL_USE_PAR_POLICIES
  142. template <class _ExecutionPolicy, class _RandomAccessIterator1, class _RandomAccessIterator2, class _Brick>
  143. _RandomAccessIterator2
  144. __pattern_walk2_brick(_ExecutionPolicy&&, _RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2,
  145. _Brick,
  146. /*parallel=*/std::true_type);
  147. #endif
  148. template <class _ExecutionPolicy, class _ForwardIterator1, class _Size, class _ForwardIterator2, class _Brick>
  149. _ForwardIterator2
  150. __pattern_walk2_brick_n(_ExecutionPolicy&&, _ForwardIterator1, _Size, _ForwardIterator2, _Brick,
  151. /*parallel=*/std::false_type) noexcept;
  152. #if __PSTL_USE_PAR_POLICIES
  153. template <class _ExecutionPolicy, class _RandomAccessIterator1, class _Size, class _RandomAccessIterator2, class _Brick>
  154. _RandomAccessIterator2
  155. __pattern_walk2_brick_n(_ExecutionPolicy&&, _RandomAccessIterator1, _Size, _RandomAccessIterator2, _Brick,
  156. /*parallel=*/std::true_type);
  157. #endif
  158. //------------------------------------------------------------------------
  159. // walk3 (pseudo)
  160. //
  161. // walk3 evaluates f(x,y,z) for (x,y,z) drawn from [first1,last1), [first2,...), [first3,...)
  162. //------------------------------------------------------------------------
  163. template <class _ForwardIterator1, class _ForwardIterator2, class _ForwardIterator3, class _Function>
  164. _ForwardIterator3 __brick_walk3(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator3, _Function,
  165. /*vector=*/std::false_type) noexcept;
  166. template <class _RandomAccessIterator1, class _RandomAccessIterator2, class _RandomAccessIterator3, class _Function>
  167. _RandomAccessIterator3 __brick_walk3(_RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2,
  168. _RandomAccessIterator3, _Function,
  169. /*vector=*/std::true_type) noexcept;
  170. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardIterator3,
  171. class _Function, class _IsVector>
  172. _ForwardIterator3
  173. __pattern_walk3(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator3,
  174. _Function, _IsVector,
  175. /*parallel=*/std::false_type) noexcept;
  176. #if __PSTL_USE_PAR_POLICIES
  177. template <class _ExecutionPolicy, class _RandomAccessIterator1, class _RandomAccessIterator2,
  178. class _RandomAccessIterator3, class _Function, class _IsVector>
  179. _RandomAccessIterator3
  180. __pattern_walk3(_ExecutionPolicy&&, _RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2,
  181. _RandomAccessIterator3, _Function, _IsVector, /*parallel=*/std::true_type);
  182. #endif
  183. //------------------------------------------------------------------------
  184. // equal
  185. //------------------------------------------------------------------------
  186. template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
  187. bool __brick_equal(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _BinaryPredicate,
  188. /* IsVector = */ std::false_type) noexcept;
  189. template <class _RandomAccessIterator1, class _RandomAccessIterator2, class _BinaryPredicate>
  190. bool __brick_equal(_RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2, _BinaryPredicate,
  191. /* is_vector = */ std::true_type) noexcept;
  192. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate,
  193. class _IsVector>
  194. bool
  195. __pattern_equal(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _BinaryPredicate,
  196. _IsVector,
  197. /* is_parallel = */ std::false_type) noexcept;
  198. #if __PSTL_USE_PAR_POLICIES
  199. template <class _ExecutionPolicy, class _RandomAccessIterator1, class _RandomAccessIterator2, class _BinaryPredicate,
  200. class _IsVector>
  201. bool
  202. __pattern_equal(_ExecutionPolicy&&, _RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2,
  203. _BinaryPredicate, _IsVector,
  204. /*is_parallel=*/std::true_type);
  205. #endif
  206. //------------------------------------------------------------------------
  207. // find_if
  208. //------------------------------------------------------------------------
  209. template <class _ForwardIterator, class _Predicate>
  210. _ForwardIterator __brick_find_if(_ForwardIterator, _ForwardIterator, _Predicate,
  211. /*is_vector=*/std::false_type) noexcept;
  212. template <class _RandomAccessIterator, class _Predicate>
  213. _RandomAccessIterator __brick_find_if(_RandomAccessIterator, _RandomAccessIterator, _Predicate,
  214. /*is_vector=*/std::true_type) noexcept;
  215. template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate, class _IsVector>
  216. _ForwardIterator
  217. __pattern_find_if(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Predicate, _IsVector,
  218. /*is_parallel=*/std::false_type) noexcept;
  219. #if __PSTL_USE_PAR_POLICIES
  220. template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate, class _IsVector>
  221. _ForwardIterator
  222. __pattern_find_if(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Predicate, _IsVector,
  223. /*is_parallel=*/std::true_type);
  224. #endif
  225. //------------------------------------------------------------------------
  226. // find_end
  227. //------------------------------------------------------------------------
  228. template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
  229. _ForwardIterator1 __brick_find_end(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  230. _BinaryPredicate,
  231. /*__is_vector=*/std::false_type) noexcept;
  232. template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
  233. _ForwardIterator1 __brick_find_end(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  234. _BinaryPredicate,
  235. /*__is_vector=*/std::true_type) noexcept;
  236. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate,
  237. class _IsVector>
  238. _ForwardIterator1
  239. __pattern_find_end(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  240. _BinaryPredicate, _IsVector,
  241. /*is_parallel=*/std::false_type) noexcept;
  242. #if __PSTL_USE_PAR_POLICIES
  243. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate,
  244. class _IsVector>
  245. _ForwardIterator1
  246. __pattern_find_end(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  247. _BinaryPredicate, _IsVector,
  248. /*is_parallel=*/std::true_type) noexcept;
  249. #endif
  250. //------------------------------------------------------------------------
  251. // find_first_of
  252. //------------------------------------------------------------------------
  253. template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
  254. _ForwardIterator1 __brick_find_first_of(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  255. _BinaryPredicate,
  256. /*__is_vector=*/std::false_type) noexcept;
  257. template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
  258. _ForwardIterator1 __brick_find_first_of(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  259. _BinaryPredicate,
  260. /*__is_vector=*/std::true_type) noexcept;
  261. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate,
  262. class _IsVector>
  263. _ForwardIterator1
  264. __pattern_find_first_of(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  265. _BinaryPredicate, _IsVector, /*is_parallel=*/std::false_type) noexcept;
  266. #if __PSTL_USE_PAR_POLICIES
  267. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate,
  268. class _IsVector>
  269. _ForwardIterator1
  270. __pattern_find_first_of(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  271. _BinaryPredicate, _IsVector, /*is_parallel=*/std::true_type) noexcept;
  272. #endif
  273. //------------------------------------------------------------------------
  274. // search
  275. //------------------------------------------------------------------------
  276. template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
  277. _ForwardIterator1 __brick_search(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  278. _BinaryPredicate,
  279. /*vector=*/std::false_type) noexcept;
  280. template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
  281. _ForwardIterator1 __brick_search(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  282. _BinaryPredicate,
  283. /*vector=*/std::true_type) noexcept;
  284. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate,
  285. class _IsVector>
  286. _ForwardIterator1
  287. __pattern_search(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  288. _BinaryPredicate, _IsVector,
  289. /*is_parallel=*/std::false_type) noexcept;
  290. #if __PSTL_USE_PAR_POLICIES
  291. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate,
  292. class _IsVector>
  293. _ForwardIterator1
  294. __pattern_search(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  295. _BinaryPredicate, _IsVector,
  296. /*is_parallel=*/std::true_type) noexcept;
  297. #endif
  298. //------------------------------------------------------------------------
  299. // search_n
  300. //------------------------------------------------------------------------
  301. template <class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate>
  302. _ForwardIterator
  303. __brick_search_n(_ForwardIterator, _ForwardIterator, _Size, const _Tp&, _BinaryPredicate,
  304. /*vector=*/std::false_type) noexcept;
  305. template <class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate>
  306. _ForwardIterator
  307. __brick_search_n(_ForwardIterator, _ForwardIterator, _Size, const _Tp&, _BinaryPredicate,
  308. /*vector=*/std::true_type) noexcept;
  309. template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate,
  310. class IsVector>
  311. _ForwardIterator
  312. __pattern_search_n(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Size, const _Tp&, _BinaryPredicate,
  313. IsVector,
  314. /*is_parallel=*/std::false_type) noexcept;
  315. #if __PSTL_USE_PAR_POLICIES
  316. template <class _ExecutionPolicy, class _RandomAccessIterator, class _Size, class _Tp, class _BinaryPredicate,
  317. class IsVector>
  318. _RandomAccessIterator
  319. __pattern_search_n(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _Size, const _Tp&,
  320. _BinaryPredicate, IsVector,
  321. /*is_parallel=*/std::true_type) noexcept;
  322. #endif
  323. //------------------------------------------------------------------------
  324. // copy_n
  325. //------------------------------------------------------------------------
  326. template <class _ForwardIterator, class _Size, class _OutputIterator>
  327. _OutputIterator __brick_copy_n(_ForwardIterator, _Size, _OutputIterator,
  328. /*vector=*/std::false_type) noexcept;
  329. template <class _ForwardIterator, class _Size, class _OutputIterator>
  330. _OutputIterator __brick_copy_n(_ForwardIterator, _Size, _OutputIterator,
  331. /*vector=*/std::true_type) noexcept;
  332. //------------------------------------------------------------------------
  333. // copy
  334. //------------------------------------------------------------------------
  335. template <class _ForwardIterator, class _OutputIterator>
  336. _OutputIterator __brick_copy(_ForwardIterator, _ForwardIterator, _OutputIterator,
  337. /*vector=*/std::false_type) noexcept;
  338. template <class _RandomAccessIterator, class _OutputIterator>
  339. _OutputIterator __brick_copy(_RandomAccessIterator, _RandomAccessIterator, _OutputIterator,
  340. /*vector=*/std::true_type) noexcept;
  341. //------------------------------------------------------------------------
  342. // move
  343. //------------------------------------------------------------------------
  344. template <class _ForwardIterator, class _OutputIterator>
  345. _OutputIterator __brick_move(_ForwardIterator, _ForwardIterator, _OutputIterator,
  346. /*vector=*/std::false_type) noexcept;
  347. template <class _RandomAccessIterator, class _OutputIterator>
  348. _OutputIterator __brick_move(_RandomAccessIterator, _RandomAccessIterator, _OutputIterator,
  349. /*vector=*/std::true_type) noexcept;
  350. //------------------------------------------------------------------------
  351. // swap_ranges
  352. //------------------------------------------------------------------------
  353. template <class _ForwardIterator, class _OutputIterator>
  354. _OutputIterator
  355. __brick_swap_ranges(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result,
  356. /*vector=*/std::false_type) noexcept;
  357. template <class _ForwardIterator, class _OutputIterator>
  358. _OutputIterator
  359. __brick_swap_ranges(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result,
  360. /*vector=*/std::true_type) noexcept;
  361. //------------------------------------------------------------------------
  362. // copy_if
  363. //------------------------------------------------------------------------
  364. template <class _ForwardIterator, class _OutputIterator, class _UnaryPredicate>
  365. _OutputIterator __brick_copy_if(_ForwardIterator, _ForwardIterator, _OutputIterator, _UnaryPredicate,
  366. /*vector=*/std::false_type) noexcept;
  367. template <class _ForwardIterator, class _OutputIterator, class _UnaryPredicate>
  368. _OutputIterator __brick_copy_if(_ForwardIterator, _ForwardIterator, _OutputIterator, _UnaryPredicate,
  369. /*vector=*/std::true_type) noexcept;
  370. template <class _DifferenceType, class _ForwardIterator, class _UnaryPredicate>
  371. std::pair<_DifferenceType, _DifferenceType>
  372. __brick_calc_mask_1(_ForwardIterator, _ForwardIterator, bool* __restrict, _UnaryPredicate,
  373. /*vector=*/std::false_type) noexcept;
  374. template <class _DifferenceType, class _RandomAccessIterator, class _UnaryPredicate>
  375. std::pair<_DifferenceType, _DifferenceType>
  376. __brick_calc_mask_1(_RandomAccessIterator, _RandomAccessIterator, bool* __restrict, _UnaryPredicate,
  377. /*vector=*/std::true_type) noexcept;
  378. template <class _ForwardIterator, class _OutputIterator>
  379. void
  380. __brick_copy_by_mask(_ForwardIterator, _ForwardIterator, _OutputIterator, bool*,
  381. /*vector=*/std::false_type) noexcept;
  382. template <class _ForwardIterator, class _OutputIterator>
  383. void
  384. __brick_copy_by_mask(_ForwardIterator, _ForwardIterator, _OutputIterator, bool* __restrict,
  385. /*vector=*/std::true_type) noexcept;
  386. template <class _ForwardIterator, class _OutputIterator1, class _OutputIterator2>
  387. void
  388. __brick_partition_by_mask(_ForwardIterator, _ForwardIterator, _OutputIterator1, _OutputIterator2, bool*,
  389. /*vector=*/std::false_type) noexcept;
  390. template <class _RandomAccessIterator, class _OutputIterator1, class _OutputIterator2>
  391. void
  392. __brick_partition_by_mask(_RandomAccessIterator, _RandomAccessIterator, _OutputIterator1, _OutputIterator2, bool*,
  393. /*vector=*/std::true_type) noexcept;
  394. template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _UnaryPredicate, class _IsVector>
  395. _OutputIterator
  396. __pattern_copy_if(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _OutputIterator, _UnaryPredicate, _IsVector,
  397. /*parallel=*/std::false_type) noexcept;
  398. #if __PSTL_USE_PAR_POLICIES
  399. template <class _ExecutionPolicy, class _RandomAccessIterator, class _OutputIterator, class _UnaryPredicate,
  400. class _IsVector>
  401. _OutputIterator
  402. __pattern_copy_if(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _OutputIterator, _UnaryPredicate,
  403. _IsVector, /*parallel=*/std::true_type);
  404. #endif
  405. //------------------------------------------------------------------------
  406. // count
  407. //------------------------------------------------------------------------
  408. template <class _ForwardIterator, class _Predicate>
  409. typename std::iterator_traits<_ForwardIterator>::difference_type
  410. __brick_count(_ForwardIterator, _ForwardIterator, _Predicate,
  411. /* is_vector = */ std::true_type) noexcept;
  412. template <class _ForwardIterator, class _Predicate>
  413. typename std::iterator_traits<_ForwardIterator>::difference_type
  414. __brick_count(_ForwardIterator, _ForwardIterator, _Predicate,
  415. /* is_vector = */ std::false_type) noexcept;
  416. template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate, class _IsVector>
  417. typename std::iterator_traits<_ForwardIterator>::difference_type
  418. __pattern_count(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Predicate,
  419. /* is_parallel */ std::false_type, _IsVector) noexcept;
  420. #if __PSTL_USE_PAR_POLICIES
  421. template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate, class _IsVector>
  422. typename std::iterator_traits<_ForwardIterator>::difference_type
  423. __pattern_count(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Predicate,
  424. /* is_parallel */ std::true_type, _IsVector);
  425. #endif
  426. //------------------------------------------------------------------------
  427. // unique
  428. //------------------------------------------------------------------------
  429. template <class _ForwardIterator, class _BinaryPredicate>
  430. _ForwardIterator __brick_unique(_ForwardIterator, _ForwardIterator, _BinaryPredicate,
  431. /*is_vector=*/std::false_type) noexcept;
  432. template <class _ForwardIterator, class _BinaryPredicate>
  433. _ForwardIterator __brick_unique(_ForwardIterator, _ForwardIterator, _BinaryPredicate,
  434. /*is_vector=*/std::true_type) noexcept;
  435. template <class _ExecutionPolicy, class _ForwardIterator, class _BinaryPredicate, class _IsVector>
  436. _ForwardIterator
  437. __pattern_unique(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _BinaryPredicate, _IsVector,
  438. /*is_parallel=*/std::false_type) noexcept;
  439. #if __PSTL_USE_PAR_POLICIES
  440. template <class _ExecutionPolicy, class _ForwardIterator, class _BinaryPredicate, class _IsVector>
  441. _ForwardIterator
  442. __pattern_unique(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _BinaryPredicate, _IsVector,
  443. /*is_parallel=*/std::true_type) noexcept;
  444. #endif
  445. //------------------------------------------------------------------------
  446. // unique_copy
  447. //------------------------------------------------------------------------
  448. template <class _ForwardIterator, class OutputIterator, class _BinaryPredicate>
  449. OutputIterator __brick_unique_copy(_ForwardIterator, _ForwardIterator, OutputIterator, _BinaryPredicate,
  450. /*vector=*/std::false_type) noexcept;
  451. template <class _RandomAccessIterator, class _OutputIterator, class _BinaryPredicate>
  452. _OutputIterator __brick_unique_copy(_RandomAccessIterator, _RandomAccessIterator, _OutputIterator, _BinaryPredicate,
  453. /*vector=*/std::true_type) noexcept;
  454. template <class _ExecutionPolicy, class _ForwardIterator, class OutputIterator, class _BinaryPredicate, class _IsVector>
  455. OutputIterator __pattern_unique_copy(_ForwardIterator, _ForwardIterator, OutputIterator, _BinaryPredicate, _IsVector,
  456. /*parallel=*/std::false_type) noexcept;
  457. template <class _ExecutionPolicy, class _DifferenceType, class _RandomAccessIterator, class _BinaryPredicate>
  458. _DifferenceType
  459. __brick_calc_mask_2(_RandomAccessIterator, _RandomAccessIterator, bool* __restrict, _BinaryPredicate,
  460. /*vector=*/std::false_type) noexcept;
  461. template <class _DifferenceType, class _RandomAccessIterator, class _BinaryPredicate>
  462. _DifferenceType
  463. __brick_calc_mask_2(_RandomAccessIterator, _RandomAccessIterator, bool* __restrict, _BinaryPredicate,
  464. /*vector=*/std::true_type) noexcept;
  465. #if __PSTL_USE_PAR_POLICIES
  466. template <class _ExecutionPolicy, class _RandomAccessIterator, class _OutputIterator, class _BinaryPredicate,
  467. class _IsVector>
  468. _OutputIterator
  469. __pattern_unique_copy(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _OutputIterator,
  470. _BinaryPredicate, _IsVector, /*parallel=*/std::true_type);
  471. #endif
  472. //------------------------------------------------------------------------
  473. // reverse
  474. //------------------------------------------------------------------------
  475. template <class _BidirectionalIterator>
  476. void __brick_reverse(_BidirectionalIterator, _BidirectionalIterator,
  477. /*__is_vector=*/std::false_type) noexcept;
  478. template <class _BidirectionalIterator>
  479. void __brick_reverse(_BidirectionalIterator, _BidirectionalIterator,
  480. /*__is_vector=*/std::true_type) noexcept;
  481. template <class _BidirectionalIterator>
  482. void __brick_reverse(_BidirectionalIterator, _BidirectionalIterator, _BidirectionalIterator,
  483. /*is_vector=*/std::false_type) noexcept;
  484. template <class _BidirectionalIterator>
  485. void __brick_reverse(_BidirectionalIterator, _BidirectionalIterator, _BidirectionalIterator,
  486. /*is_vector=*/std::true_type) noexcept;
  487. template <class _ExecutionPolicy, class _BidirectionalIterator, class _IsVector>
  488. void
  489. __pattern_reverse(_ExecutionPolicy&&, _BidirectionalIterator, _BidirectionalIterator, _IsVector,
  490. /*is_parallel=*/std::false_type) noexcept;
  491. #if __PSTL_USE_PAR_POLICIES
  492. template <class _ExecutionPolicy, class _BidirectionalIterator, class _IsVector>
  493. void
  494. __pattern_reverse(_ExecutionPolicy&&, _BidirectionalIterator, _BidirectionalIterator, _IsVector,
  495. /*is_parallel=*/std::true_type);
  496. #endif
  497. //------------------------------------------------------------------------
  498. // reverse_copy
  499. //------------------------------------------------------------------------
  500. template <class _BidirectionalIterator, class _OutputIterator>
  501. _OutputIterator __brick_reverse_copy(_BidirectionalIterator, _BidirectionalIterator, _OutputIterator,
  502. /*is_vector=*/std::false_type) noexcept;
  503. template <class _BidirectionalIterator, class _OutputIterator>
  504. _OutputIterator __brick_reverse_copy(_BidirectionalIterator, _BidirectionalIterator, _OutputIterator,
  505. /*is_vector=*/std::true_type) noexcept;
  506. template <class _ExecutionPolicy, class _BidirectionalIterator, class _OutputIterator, class _IsVector>
  507. _OutputIterator
  508. __pattern_reverse_copy(_ExecutionPolicy&&, _BidirectionalIterator, _BidirectionalIterator, _OutputIterator, _IsVector,
  509. /*is_parallel=*/std::false_type) noexcept;
  510. #if __PSTL_USE_PAR_POLICIES
  511. template <class _ExecutionPolicy, class _BidirectionalIterator, class _OutputIterator, class _IsVector>
  512. _OutputIterator
  513. __pattern_reverse_copy(_ExecutionPolicy&&, _BidirectionalIterator, _BidirectionalIterator, _OutputIterator, _IsVector,
  514. /*is_parallel=*/std::true_type);
  515. #endif
  516. //------------------------------------------------------------------------
  517. // rotate
  518. //------------------------------------------------------------------------
  519. template <class _ForwardIterator>
  520. _ForwardIterator __brick_rotate(_ForwardIterator, _ForwardIterator, _ForwardIterator,
  521. /*is_vector=*/std::false_type) noexcept;
  522. template <class _ForwardIterator>
  523. _ForwardIterator __brick_rotate(_ForwardIterator, _ForwardIterator, _ForwardIterator,
  524. /*is_vector=*/std::true_type) noexcept;
  525. template <class _ExecutionPolicy, class _ForwardIterator, class _IsVector>
  526. _ForwardIterator
  527. __pattern_rotate(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _ForwardIterator, _IsVector,
  528. /*is_parallel=*/std::false_type) noexcept;
  529. #if __PSTL_USE_PAR_POLICIES
  530. template <class _ExecutionPolicy, class _ForwardIterator, class _IsVector>
  531. _ForwardIterator
  532. __pattern_rotate(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _ForwardIterator, _IsVector,
  533. /*is_parallel=*/std::true_type);
  534. #endif
  535. //------------------------------------------------------------------------
  536. // rotate_copy
  537. //------------------------------------------------------------------------
  538. template <class _ForwardIterator, class _OutputIterator>
  539. _OutputIterator __brick_rotate_copy(_ForwardIterator, _ForwardIterator, _ForwardIterator, _OutputIterator,
  540. /*__is_vector=*/std::false_type) noexcept;
  541. template <class _ForwardIterator, class _OutputIterator>
  542. _OutputIterator __brick_rotate_copy(_ForwardIterator, _ForwardIterator, _ForwardIterator, _OutputIterator,
  543. /*__is_vector=*/std::true_type) noexcept;
  544. template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _IsVector>
  545. _OutputIterator
  546. __pattern_rotate_copy(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _ForwardIterator, _OutputIterator,
  547. _IsVector,
  548. /*is_parallel=*/std::false_type) noexcept;
  549. #if __PSTL_USE_PAR_POLICIES
  550. template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _IsVector>
  551. _OutputIterator
  552. __pattern_rotate_copy(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _ForwardIterator, _OutputIterator,
  553. _IsVector,
  554. /*is_parallel=*/std::true_type);
  555. #endif
  556. //------------------------------------------------------------------------
  557. // is_partitioned
  558. //------------------------------------------------------------------------
  559. template <class _ForwardIterator, class _UnaryPredicate>
  560. bool __brick_is_partitioned(_ForwardIterator, _ForwardIterator, _UnaryPredicate,
  561. /*is_vector=*/std::false_type) noexcept;
  562. template <class _ForwardIterator, class _UnaryPredicate>
  563. bool __brick_is_partitioned(_ForwardIterator, _ForwardIterator, _UnaryPredicate,
  564. /*is_vector=*/std::true_type) noexcept;
  565. template <class _ExecutionPolicy, class _ForwardIterator, class _UnaryPredicate, class _IsVector>
  566. bool
  567. __pattern_is_partitioned(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _UnaryPredicate, _IsVector,
  568. /*is_parallel=*/std::false_type) noexcept;
  569. #if __PSTL_USE_PAR_POLICIES
  570. template <class _ExecutionPolicy, class _ForwardIterator, class _UnaryPredicate, class _IsVector>
  571. bool
  572. __pattern_is_partitioned(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _UnaryPredicate, _IsVector,
  573. /*is_parallel=*/std::true_type);
  574. #endif
  575. //------------------------------------------------------------------------
  576. // partition
  577. //------------------------------------------------------------------------
  578. template <class _ForwardIterator, class _UnaryPredicate>
  579. _ForwardIterator __brick_partition(_ForwardIterator, _ForwardIterator, _UnaryPredicate,
  580. /*is_vector=*/std::false_type) noexcept;
  581. template <class _ForwardIterator, class _UnaryPredicate>
  582. _ForwardIterator __brick_partition(_ForwardIterator, _ForwardIterator, _UnaryPredicate,
  583. /*is_vector=*/std::true_type) noexcept;
  584. template <class _ExecutionPolicy, class _ForwardIterator, class _UnaryPredicate, class _IsVector>
  585. _ForwardIterator
  586. __pattern_partition(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _UnaryPredicate, _IsVector,
  587. /*is_parallel=*/std::false_type) noexcept;
  588. #if __PSTL_USE_PAR_POLICIES
  589. template <class _ExecutionPolicy, class _ForwardIterator, class _UnaryPredicate, class _IsVector>
  590. _ForwardIterator
  591. __pattern_partition(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _UnaryPredicate, _IsVector,
  592. /*is_parallel=*/std::true_type);
  593. #endif
  594. //------------------------------------------------------------------------
  595. // stable_partition
  596. //------------------------------------------------------------------------
  597. template <class _BidirectionalIterator, class _UnaryPredicate>
  598. _BidirectionalIterator __brick_stable_partition(_BidirectionalIterator, _BidirectionalIterator, _UnaryPredicate,
  599. /*__is_vector=*/std::false_type) noexcept;
  600. template <class _BidirectionalIterator, class _UnaryPredicate>
  601. _BidirectionalIterator __brick_stable_partition(_BidirectionalIterator, _BidirectionalIterator, _UnaryPredicate,
  602. /*__is_vector=*/std::true_type) noexcept;
  603. template <class _ExecutionPolicy, class _BidirectionalIterator, class _UnaryPredicate, class _IsVector>
  604. _BidirectionalIterator
  605. __pattern_stable_partition(_ExecutionPolicy&&, _BidirectionalIterator, _BidirectionalIterator, _UnaryPredicate,
  606. _IsVector,
  607. /*is_parallelization=*/std::false_type) noexcept;
  608. #if __PSTL_USE_PAR_POLICIES
  609. template <class _ExecutionPolicy, class _BidirectionalIterator, class _UnaryPredicate, class _IsVector>
  610. _BidirectionalIterator
  611. __pattern_stable_partition(_ExecutionPolicy&&, _BidirectionalIterator, _BidirectionalIterator, _UnaryPredicate,
  612. _IsVector,
  613. /*is_parallelization=*/std::true_type) noexcept;
  614. #endif
  615. //------------------------------------------------------------------------
  616. // partition_copy
  617. //------------------------------------------------------------------------
  618. template <class _ForwardIterator, class _OutputIterator1, class _OutputIterator2, class _UnaryPredicate>
  619. std::pair<_OutputIterator1, _OutputIterator2>
  620. __brick_partition_copy(_ForwardIterator, _ForwardIterator, _OutputIterator1, _OutputIterator2, _UnaryPredicate,
  621. /*is_vector=*/std::false_type) noexcept;
  622. template <class _ForwardIterator, class _OutputIterator1, class _OutputIterator2, class _UnaryPredicate>
  623. std::pair<_OutputIterator1, _OutputIterator2>
  624. __brick_partition_copy(_ForwardIterator, _ForwardIterator, _OutputIterator1, _OutputIterator2, _UnaryPredicate,
  625. /*is_vector=*/std::true_type) noexcept;
  626. template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator1, class _OutputIterator2,
  627. class _UnaryPredicate, class _IsVector>
  628. std::pair<_OutputIterator1, _OutputIterator2>
  629. __pattern_partition_copy(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _OutputIterator1, _OutputIterator2,
  630. _UnaryPredicate, _IsVector,
  631. /*is_parallelization=*/std::false_type) noexcept;
  632. #if __PSTL_USE_PAR_POLICIES
  633. template <class _ExecutionPolicy, class _RandomAccessIterator, class _OutputIterator1, class _OutputIterator2,
  634. class _UnaryPredicate, class _IsVector>
  635. std::pair<_OutputIterator1, _OutputIterator2>
  636. __pattern_partition_copy(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _OutputIterator1,
  637. _OutputIterator2, _UnaryPredicate, _IsVector,
  638. /*is_parallelization=*/std::true_type);
  639. #endif
  640. //------------------------------------------------------------------------
  641. // sort
  642. //------------------------------------------------------------------------
  643. template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare, class _IsVector,
  644. class _IsMoveConstructible>
  645. void
  646. __pattern_sort(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _Compare, _IsVector /*is_vector*/,
  647. /*is_parallel=*/std::false_type, _IsMoveConstructible) noexcept;
  648. #if __PSTL_USE_PAR_POLICIES
  649. template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare, class _IsVector>
  650. void
  651. __pattern_sort(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _Compare, _IsVector /*is_vector*/,
  652. /*is_parallel=*/std::true_type,
  653. /*is_move_constructible=*/std::true_type);
  654. #endif
  655. //------------------------------------------------------------------------
  656. // stable_sort
  657. //------------------------------------------------------------------------
  658. template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare, class _IsVector>
  659. void
  660. __pattern_stable_sort(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _Compare,
  661. _IsVector /*is_vector*/,
  662. /*is_parallel=*/std::false_type) noexcept;
  663. #if __PSTL_USE_PAR_POLICIES
  664. template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare, class _IsVector>
  665. void
  666. __pattern_stable_sort(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _Compare,
  667. _IsVector /*is_vector*/,
  668. /*is_parallel=*/std::true_type);
  669. #endif
  670. //------------------------------------------------------------------------
  671. // partial_sort
  672. //------------------------------------------------------------------------
  673. template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare, class _IsVector>
  674. void
  675. __pattern_partial_sort(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator,
  676. _Compare, _IsVector,
  677. /*is_parallel=*/std::false_type) noexcept;
  678. #if __PSTL_USE_PAR_POLICIES
  679. template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare, class _IsVector>
  680. void
  681. __pattern_partial_sort(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator,
  682. _Compare, _IsVector,
  683. /*is_parallel=*/std::true_type);
  684. #endif
  685. //------------------------------------------------------------------------
  686. // partial_sort_copy
  687. //------------------------------------------------------------------------
  688. template <class _ExecutionPolicy, class _ForwardIterator, class _RandomAccessIterator, class _Compare, class _IsVector>
  689. _RandomAccessIterator
  690. __pattern_partial_sort_copy(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _RandomAccessIterator,
  691. _RandomAccessIterator, _Compare, _IsVector,
  692. /*is_parallel=*/std::false_type) noexcept;
  693. #if __PSTL_USE_PAR_POLICIES
  694. template <class _ExecutionPolicy, class _ForwardIterator, class _RandomAccessIterator, class _Compare, class _IsVector>
  695. _RandomAccessIterator
  696. __pattern_partial_sort_copy(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _RandomAccessIterator,
  697. _RandomAccessIterator, _Compare, _IsVector,
  698. /*is_parallel=*/std::true_type);
  699. #endif
  700. //------------------------------------------------------------------------
  701. // adjacent_find
  702. //------------------------------------------------------------------------
  703. template <class _ForwardIterator, class _BinaryPredicate>
  704. _ForwardIterator
  705. __brick_adjacent_find(_ForwardIterator, _ForwardIterator, _BinaryPredicate,
  706. /* IsVector = */ std::true_type, bool) noexcept;
  707. template <class _ForwardIterator, class _BinaryPredicate>
  708. _ForwardIterator
  709. __brick_adjacent_find(_ForwardIterator, _ForwardIterator, _BinaryPredicate,
  710. /* IsVector = */ std::false_type, bool) noexcept;
  711. template <class _ExecutionPolicy, class _ForwardIterator, class _BinaryPredicate, class _IsVector>
  712. _ForwardIterator
  713. __pattern_adjacent_find(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _BinaryPredicate,
  714. /* is_parallel */ std::false_type, _IsVector, bool) noexcept;
  715. #if __PSTL_USE_PAR_POLICIES
  716. template <class _ExecutionPolicy, class _RandomAccessIterator, class _BinaryPredicate, class _IsVector>
  717. _RandomAccessIterator
  718. __pattern_adjacent_find(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _BinaryPredicate,
  719. /* is_parallel */ std::true_type, _IsVector, bool);
  720. #endif
  721. //------------------------------------------------------------------------
  722. // nth_element
  723. //------------------------------------------------------------------------
  724. template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare, class _IsVector>
  725. void
  726. __pattern_nth_element(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator, _Compare,
  727. _IsVector,
  728. /*is_parallel=*/std::false_type) noexcept;
  729. #if __PSTL_USE_PAR_POLICIES
  730. template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare, class _IsVector>
  731. void
  732. __pattern_nth_element(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator, _Compare,
  733. _IsVector,
  734. /*is_parallel=*/std::true_type) noexcept;
  735. #endif
  736. //------------------------------------------------------------------------
  737. // fill, fill_n
  738. //------------------------------------------------------------------------
  739. template <class _ForwardIterator, class _Tp>
  740. void
  741. __brick_fill(_ForwardIterator, _ForwardIterator, const _Tp&,
  742. /* __is_vector = */ std::true_type) noexcept;
  743. template <class _ForwardIterator, class _Tp>
  744. void
  745. __brick_fill(_ForwardIterator, _ForwardIterator, const _Tp&,
  746. /* __is_vector = */ std::false_type) noexcept;
  747. template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _IsVector>
  748. void
  749. __pattern_fill(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, const _Tp&,
  750. /*is_parallel=*/std::false_type, _IsVector) noexcept;
  751. #if __PSTL_USE_PAR_POLICIES
  752. template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _IsVector>
  753. _ForwardIterator
  754. __pattern_fill(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, const _Tp&,
  755. /*is_parallel=*/std::true_type, _IsVector);
  756. #endif
  757. template <class _OutputIterator, class _Size, class _Tp>
  758. _OutputIterator
  759. __brick_fill_n(_OutputIterator, _Size, const _Tp&,
  760. /* __is_vector = */ std::true_type) noexcept;
  761. template <class _OutputIterator, class _Size, class _Tp>
  762. _OutputIterator
  763. __brick_fill_n(_OutputIterator, _Size, const _Tp&,
  764. /* __is_vector = */ std::false_type) noexcept;
  765. template <class _ExecutionPolicy, class _OutputIterator, class _Size, class _Tp, class _IsVector>
  766. _OutputIterator
  767. __pattern_fill_n(_ExecutionPolicy&&, _OutputIterator, _Size, const _Tp&,
  768. /*is_parallel=*/std::false_type, _IsVector) noexcept;
  769. #if __PSTL_USE_PAR_POLICIES
  770. template <class _ExecutionPolicy, class _OutputIterator, class _Size, class _Tp, class _IsVector>
  771. _OutputIterator
  772. __pattern_fill_n(_ExecutionPolicy&&, _OutputIterator, _Size, const _Tp&,
  773. /*is_parallel=*/std::true_type, _IsVector);
  774. #endif
  775. //------------------------------------------------------------------------
  776. // generate, generate_n
  777. //------------------------------------------------------------------------
  778. template <class _RandomAccessIterator, class _Generator>
  779. void __brick_generate(_RandomAccessIterator, _RandomAccessIterator, _Generator,
  780. /* is_vector = */ std::true_type) noexcept;
  781. template <class _ForwardIterator, class _Generator>
  782. void __brick_generate(_ForwardIterator, _ForwardIterator, _Generator,
  783. /* is_vector = */ std::false_type) noexcept;
  784. template <class _ExecutionPolicy, class _ForwardIterator, class _Generator, class _IsVector>
  785. void
  786. __pattern_generate(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Generator,
  787. /*is_parallel=*/std::false_type, _IsVector) noexcept;
  788. #if __PSTL_USE_PAR_POLICIES
  789. template <class _ExecutionPolicy, class _ForwardIterator, class _Generator, class _IsVector>
  790. _ForwardIterator
  791. __pattern_generate(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Generator,
  792. /*is_parallel=*/std::true_type, _IsVector);
  793. #endif
  794. template <class OutputIterator, class Size, class _Generator>
  795. OutputIterator __brick_generate_n(OutputIterator, Size, _Generator,
  796. /* is_vector = */ std::true_type) noexcept;
  797. template <class OutputIterator, class Size, class _Generator>
  798. OutputIterator __brick_generate_n(OutputIterator, Size, _Generator,
  799. /* is_vector = */ std::false_type) noexcept;
  800. template <class _ExecutionPolicy, class OutputIterator, class Size, class _Generator, class _IsVector>
  801. OutputIterator
  802. __pattern_generate_n(_ExecutionPolicy&&, OutputIterator, Size, _Generator,
  803. /*is_parallel=*/std::false_type, _IsVector) noexcept;
  804. #if __PSTL_USE_PAR_POLICIES
  805. template <class _ExecutionPolicy, class OutputIterator, class Size, class _Generator, class _IsVector>
  806. OutputIterator
  807. __pattern_generate_n(_ExecutionPolicy&&, OutputIterator, Size, _Generator,
  808. /*is_parallel=*/std::true_type, _IsVector);
  809. #endif
  810. //------------------------------------------------------------------------
  811. // remove
  812. //------------------------------------------------------------------------
  813. template <class _ForwardIterator, class _UnaryPredicate>
  814. _ForwardIterator __brick_remove_if(_ForwardIterator, _ForwardIterator, _UnaryPredicate,
  815. /* __is_vector = */ std::false_type) noexcept;
  816. template <class _RandomAccessIterator, class _UnaryPredicate>
  817. _RandomAccessIterator __brick_remove_if(_RandomAccessIterator, _RandomAccessIterator, _UnaryPredicate,
  818. /* __is_vector = */ std::true_type) noexcept;
  819. template <class _ExecutionPolicy, class _ForwardIterator, class _UnaryPredicate, class _IsVector>
  820. _ForwardIterator
  821. __pattern_remove_if(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _UnaryPredicate, _IsVector,
  822. /*is_parallel*/ std::false_type) noexcept;
  823. #if __PSTL_USE_PAR_POLICIES
  824. template <class _ExecutionPolicy, class _ForwardIterator, class _UnaryPredicate, class _IsVector>
  825. _ForwardIterator
  826. __pattern_remove_if(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _UnaryPredicate, _IsVector,
  827. /*is_parallel*/ std::true_type) noexcept;
  828. #endif
  829. //------------------------------------------------------------------------
  830. // merge
  831. //------------------------------------------------------------------------
  832. template <class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator, class _Compare>
  833. _OutputIterator __brick_merge(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  834. _OutputIterator, _Compare,
  835. /* __is_vector = */ std::false_type) noexcept;
  836. template <class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator, class _Compare>
  837. _OutputIterator __brick_merge(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  838. _OutputIterator, _Compare,
  839. /* __is_vector = */ std::true_type) noexcept;
  840. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator,
  841. class _Compare, class _IsVector>
  842. _OutputIterator
  843. __pattern_merge(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  844. _OutputIterator, _Compare, _IsVector, /* is_parallel = */ std::false_type) noexcept;
  845. #if __PSTL_USE_PAR_POLICIES
  846. template <class _ExecutionPolicy, class _RandomAccessIterator1, class _RandomAccessIterator2, class _OutputIterator,
  847. class _Compare, class _IsVector>
  848. _OutputIterator
  849. __pattern_merge(_ExecutionPolicy&&, _RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2,
  850. _RandomAccessIterator2, _OutputIterator, _Compare, _IsVector,
  851. /* is_parallel = */ std::true_type);
  852. #endif
  853. //------------------------------------------------------------------------
  854. // inplace_merge
  855. //------------------------------------------------------------------------
  856. template <class _BidirectionalIterator, class _Compare>
  857. void __brick_inplace_merge(_BidirectionalIterator, _BidirectionalIterator, _BidirectionalIterator, _Compare,
  858. /* __is_vector = */ std::false_type) noexcept;
  859. template <class _BidirectionalIterator, class _Compare>
  860. void __brick_inplace_merge(_BidirectionalIterator, _BidirectionalIterator, _BidirectionalIterator, _Compare,
  861. /* __is_vector = */ std::true_type) noexcept;
  862. template <class _ExecutionPolicy, class _BidirectionalIterator, class _Compare, class _IsVector>
  863. void
  864. __pattern_inplace_merge(_ExecutionPolicy&&, _BidirectionalIterator, _BidirectionalIterator, _BidirectionalIterator,
  865. _Compare, _IsVector,
  866. /* is_parallel = */ std::false_type) noexcept;
  867. #if __PSTL_USE_PAR_POLICIES
  868. template <class _ExecutionPolicy, class _BidirectionalIterator, class _Compare, class _IsVector>
  869. void
  870. __pattern_inplace_merge(_ExecutionPolicy&&, _BidirectionalIterator, _BidirectionalIterator, _BidirectionalIterator,
  871. _Compare, _IsVector,
  872. /*is_parallel=*/std::true_type);
  873. #endif
  874. //------------------------------------------------------------------------
  875. // includes
  876. //------------------------------------------------------------------------
  877. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Compare, class _IsVector>
  878. bool
  879. __pattern_includes(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  880. _Compare, _IsVector,
  881. /*is_parallel=*/std::false_type) noexcept;
  882. #if __PSTL_USE_PAR_POLICIES
  883. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Compare, class _IsVector>
  884. bool
  885. __pattern_includes(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  886. _Compare, _IsVector,
  887. /*is_parallel=*/std::true_type);
  888. #endif
  889. //------------------------------------------------------------------------
  890. // set_union
  891. //------------------------------------------------------------------------
  892. template <class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator, class _Compare>
  893. _OutputIterator __brick_set_union(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  894. _OutputIterator, _Compare,
  895. /*__is_vector=*/std::false_type) noexcept;
  896. template <class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator, class _Compare>
  897. _OutputIterator __brick_set_union(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  898. _OutputIterator, _Compare,
  899. /*__is_vector=*/std::true_type) noexcept;
  900. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator,
  901. class _Compare, class _IsVector>
  902. _OutputIterator
  903. __pattern_set_union(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  904. _OutputIterator, _Compare, _IsVector, /*is_parallel=*/std::false_type) noexcept;
  905. #if __PSTL_USE_PAR_POLICIES
  906. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator,
  907. class _Compare, class _IsVector>
  908. _OutputIterator
  909. __pattern_set_union(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  910. _OutputIterator, _Compare, _IsVector, /*is_parallel=*/std::true_type);
  911. #endif
  912. //------------------------------------------------------------------------
  913. // set_intersection
  914. //------------------------------------------------------------------------
  915. template <class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator, class _Compare>
  916. _OutputIterator __brick_set_intersection(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  917. _OutputIterator, _Compare,
  918. /*__is_vector=*/std::false_type) noexcept;
  919. template <class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator, class _Compare>
  920. _OutputIterator __brick_set_intersection(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  921. _OutputIterator, _Compare,
  922. /*__is_vector=*/std::true_type) noexcept;
  923. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator,
  924. class _Compare, class _IsVector>
  925. _OutputIterator
  926. __pattern_set_intersection(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2,
  927. _ForwardIterator2, _OutputIterator, _Compare, _IsVector,
  928. /*is_parallel=*/std::false_type) noexcept;
  929. #if __PSTL_USE_PAR_POLICIES
  930. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator,
  931. class _Compare, class _IsVector>
  932. _OutputIterator
  933. __pattern_set_intersection(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2,
  934. _ForwardIterator2, _OutputIterator, _Compare, _IsVector, /*is_parallel=*/std::true_type);
  935. #endif
  936. //------------------------------------------------------------------------
  937. // set_difference
  938. //------------------------------------------------------------------------
  939. template <class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator, class _Compare>
  940. _OutputIterator __brick_set_difference(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  941. _OutputIterator, _Compare,
  942. /*__is_vector=*/std::false_type) noexcept;
  943. template <class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator, class _Compare>
  944. _OutputIterator __brick_set_difference(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  945. _OutputIterator, _Compare,
  946. /*__is_vector=*/std::true_type) noexcept;
  947. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator,
  948. class _Compare, class _IsVector>
  949. _OutputIterator
  950. __pattern_set_difference(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  951. _OutputIterator, _Compare, _IsVector, /*is_parallel=*/std::false_type) noexcept;
  952. #if __PSTL_USE_PAR_POLICIES
  953. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator,
  954. class _Compare, class _IsVector>
  955. _OutputIterator
  956. __pattern_set_difference(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  957. _OutputIterator, _Compare, _IsVector, /*is_parallel=*/std::true_type);
  958. #endif
  959. //------------------------------------------------------------------------
  960. // set_symmetric_difference
  961. //------------------------------------------------------------------------
  962. template <class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator, class _Compare>
  963. _OutputIterator __brick_set_symmetric_difference(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2,
  964. _ForwardIterator2, _OutputIterator, _Compare,
  965. /*__is_vector=*/std::false_type) noexcept;
  966. template <class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator, class _Compare>
  967. _OutputIterator __brick_set_symmetric_difference(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2,
  968. _ForwardIterator2, _OutputIterator, _Compare,
  969. /*__is_vector=*/std::true_type) noexcept;
  970. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator,
  971. class _Compare, class _IsVector>
  972. _OutputIterator
  973. __pattern_set_symmetric_difference(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2,
  974. _ForwardIterator2, _OutputIterator, _Compare, _IsVector,
  975. /*is_parallel=*/std::false_type) noexcept;
  976. #if __PSTL_USE_PAR_POLICIES
  977. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator,
  978. class _Compare, class _IsVector>
  979. _OutputIterator
  980. __pattern_set_symmetric_difference(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2,
  981. _ForwardIterator2, _OutputIterator, _Compare, _IsVector,
  982. /*is_parallel=*/std::true_type);
  983. #endif
  984. //------------------------------------------------------------------------
  985. // is_heap_until
  986. //------------------------------------------------------------------------
  987. template <class _RandomAccessIterator, class _Compare>
  988. _RandomAccessIterator __brick_is_heap_until(_RandomAccessIterator, _RandomAccessIterator, _Compare,
  989. /* __is_vector = */ std::false_type) noexcept;
  990. template <class _RandomAccessIterator, class _Compare>
  991. _RandomAccessIterator __brick_is_heap_until(_RandomAccessIterator, _RandomAccessIterator, _Compare,
  992. /* __is_vector = */ std::true_type) noexcept;
  993. template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare, class _IsVector>
  994. _RandomAccessIterator
  995. __pattern_is_heap_until(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _Compare, _IsVector,
  996. /* is_parallel = */ std::false_type) noexcept;
  997. #if __PSTL_USE_PAR_POLICIES
  998. template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare, class _IsVector>
  999. _RandomAccessIterator
  1000. __pattern_is_heap_until(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _Compare, _IsVector,
  1001. /* is_parallel = */ std::true_type) noexcept;
  1002. #endif
  1003. //------------------------------------------------------------------------
  1004. // min_element
  1005. //------------------------------------------------------------------------
  1006. template <typename _ForwardIterator, typename _Compare>
  1007. _ForwardIterator __brick_min_element(_ForwardIterator, _ForwardIterator, _Compare,
  1008. /* __is_vector = */ std::false_type) noexcept;
  1009. template <typename _ForwardIterator, typename _Compare>
  1010. _ForwardIterator __brick_min_element(_ForwardIterator, _ForwardIterator, _Compare,
  1011. /* __is_vector = */ std::true_type) noexcept;
  1012. template <typename _ExecutionPolicy, typename _ForwardIterator, typename _Compare, typename _IsVector>
  1013. _ForwardIterator
  1014. __pattern_min_element(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Compare, _IsVector,
  1015. /* is_parallel = */ std::false_type) noexcept;
  1016. #if __PSTL_USE_PAR_POLICIES
  1017. template <typename _ExecutionPolicy, typename _RandomAccessIterator, typename _Compare, typename _IsVector>
  1018. _RandomAccessIterator
  1019. __pattern_min_element(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _Compare, _IsVector,
  1020. /* is_parallel = */ std::true_type);
  1021. #endif
  1022. //------------------------------------------------------------------------
  1023. // minmax_element
  1024. //------------------------------------------------------------------------
  1025. template <typename _ForwardIterator, typename _Compare>
  1026. std::pair<_ForwardIterator, _ForwardIterator> __brick_minmax_element(_ForwardIterator, _ForwardIterator, _Compare,
  1027. /* __is_vector = */ std::false_type) noexcept;
  1028. template <typename _ForwardIterator, typename _Compare>
  1029. std::pair<_ForwardIterator, _ForwardIterator> __brick_minmax_element(_ForwardIterator, _ForwardIterator, _Compare,
  1030. /* __is_vector = */ std::true_type) noexcept;
  1031. template <typename _ExecutionPolicy, typename _ForwardIterator, typename _Compare, typename _IsVector>
  1032. std::pair<_ForwardIterator, _ForwardIterator>
  1033. __pattern_minmax_element(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Compare, _IsVector,
  1034. /* is_parallel = */ std::false_type) noexcept;
  1035. #if __PSTL_USE_PAR_POLICIES
  1036. template <typename _ExecutionPolicy, typename _ForwardIterator, typename _Compare, typename _IsVector>
  1037. std::pair<_ForwardIterator, _ForwardIterator>
  1038. __pattern_minmax_element(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Compare, _IsVector,
  1039. /* is_parallel = */ std::true_type);
  1040. #endif
  1041. //------------------------------------------------------------------------
  1042. // mismatch
  1043. //------------------------------------------------------------------------
  1044. template <class _ForwardIterator1, class _ForwardIterator2, class _Predicate>
  1045. std::pair<_ForwardIterator1, _ForwardIterator2> __brick_mismatch(_ForwardIterator1, _ForwardIterator1,
  1046. _ForwardIterator2, _ForwardIterator2, _Predicate,
  1047. /* __is_vector = */ std::false_type) noexcept;
  1048. template <class _ForwardIterator1, class _ForwardIterator2, class _Predicate>
  1049. std::pair<_ForwardIterator1, _ForwardIterator2> __brick_mismatch(_ForwardIterator1, _ForwardIterator1,
  1050. _ForwardIterator2, _ForwardIterator2, _Predicate,
  1051. /* __is_vector = */ std::true_type) noexcept;
  1052. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Predicate, class _IsVector>
  1053. std::pair<_ForwardIterator1, _ForwardIterator2>
  1054. __pattern_mismatch(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  1055. _Predicate, _IsVector,
  1056. /* is_parallel = */ std::false_type) noexcept;
  1057. #if __PSTL_USE_PAR_POLICIES
  1058. template <class _ExecutionPolicy, class _RandomAccessIterator1, class _RandomAccessIterator2, class _Predicate,
  1059. class _IsVector>
  1060. std::pair<_RandomAccessIterator1, _RandomAccessIterator2>
  1061. __pattern_mismatch(_ExecutionPolicy&&, _RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2,
  1062. _RandomAccessIterator2, _Predicate, _IsVector, /* is_parallel = */ std::true_type) noexcept;
  1063. #endif
  1064. //------------------------------------------------------------------------
  1065. // lexicographical_compare
  1066. //------------------------------------------------------------------------
  1067. template <class _ForwardIterator1, class _ForwardIterator2, class _Compare>
  1068. bool __brick_lexicographical_compare(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  1069. _Compare,
  1070. /* __is_vector = */ std::false_type) noexcept;
  1071. template <class _ForwardIterator1, class _ForwardIterator2, class _Compare>
  1072. bool __brick_lexicographical_compare(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
  1073. _Compare,
  1074. /* __is_vector = */ std::true_type) noexcept;
  1075. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Compare, class _IsVector>
  1076. bool
  1077. __pattern_lexicographical_compare(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2,
  1078. _ForwardIterator2, _Compare, _IsVector, /* is_parallel = */ std::false_type) noexcept;
  1079. #if __PSTL_USE_PAR_POLICIES
  1080. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Compare, class _IsVector>
  1081. bool
  1082. __pattern_lexicographical_compare(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2,
  1083. _ForwardIterator2, _Compare, _IsVector, /* is_parallel = */ std::true_type) noexcept;
  1084. #endif
  1085. } // namespace __internal
  1086. } // namespace __pstl
  1087. #endif /* __PSTL_algorithm_fwd_H */