algorithm_fwd.h 67 KB

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