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