Home | History | Annotate | Line # | Download | only in pstl
      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