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