Home | History | Annotate | Download | only in alg.is_permutation
      1 //===----------------------------------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 // <algorithm>
     11 
     12 // template<class ForwardIterator1, class ForwardIterator2>
     13 //   constexpr bool   // constexpr after C++17
     14 //   is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
     15 //                  ForwardIterator2 first2);
     16 
     17 #include <algorithm>
     18 #include <cassert>
     19 
     20 #include "test_iterators.h"
     21 
     22 #include "test_macros.h"
     23 
     24 #if TEST_STD_VER > 17
     25 TEST_CONSTEXPR bool test_constexpr() {
     26     int ia[] = {0, 0, 0};
     27     int ib[] = {1, 1, 0};
     28     int ic[] = {1, 0, 1};
     29     int id[] = {1};
     30     return !std::is_permutation(std::begin(ia), std::end(ia), std::begin(ib))
     31         && !std::is_permutation(std::begin(ia), std::end(ia), std::begin(ib), std::end(ib))
     32         &&  std::is_permutation(std::begin(ib), std::end(ib), std::begin(ic))
     33         &&  std::is_permutation(std::begin(ib), std::end(ib), std::begin(ic), std::end(ic))
     34         && !std::is_permutation(std::begin(ic), std::end(ic), std::begin(id), std::end(id))
     35         ;
     36     }
     37 #endif
     38 
     39 int main()
     40 {
     41     {
     42         const int ia[] = {0};
     43         const int ib[] = {0};
     44         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
     45         assert(std::is_permutation(forward_iterator<const int*>(ia),
     46                                    forward_iterator<const int*>(ia + 0),
     47                                    forward_iterator<const int*>(ib)) == true);
     48 #if TEST_STD_VER >= 14
     49         assert(std::is_permutation(forward_iterator<const int*>(ia),
     50                                    forward_iterator<const int*>(ia + 0),
     51                                    forward_iterator<const int*>(ib),
     52                                    forward_iterator<const int*>(ib + 0)) == true);
     53 #endif
     54         assert(std::is_permutation(forward_iterator<const int*>(ia),
     55                                    forward_iterator<const int*>(ia + sa),
     56                                    forward_iterator<const int*>(ib)) == true);
     57 #if TEST_STD_VER >= 14
     58         assert(std::is_permutation(forward_iterator<const int*>(ia),
     59                                    forward_iterator<const int*>(ia + sa),
     60                                    forward_iterator<const int*>(ib),
     61                                    forward_iterator<const int*>(ib + sa)) == true);
     62         assert(std::is_permutation(forward_iterator<const int*>(ia),
     63                                    forward_iterator<const int*>(ia + sa),
     64                                    forward_iterator<const int*>(ib),
     65                                    forward_iterator<const int*>(ib + sa - 1)) == false);
     66 #endif
     67     }
     68     {
     69         const int ia[] = {0};
     70         const int ib[] = {1};
     71         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
     72         assert(std::is_permutation(forward_iterator<const int*>(ia),
     73                                    forward_iterator<const int*>(ia + sa),
     74                                    forward_iterator<const int*>(ib)) == false);
     75 #if TEST_STD_VER >= 14
     76         assert(std::is_permutation(forward_iterator<const int*>(ia),
     77                                    forward_iterator<const int*>(ia + sa),
     78                                    forward_iterator<const int*>(ib),
     79                                    forward_iterator<const int*>(ib + sa)) == false);
     80 #endif
     81     }
     82 
     83     {
     84         const int ia[] = {0, 0};
     85         const int ib[] = {0, 0};
     86         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
     87         assert(std::is_permutation(forward_iterator<const int*>(ia),
     88                                    forward_iterator<const int*>(ia + sa),
     89                                    forward_iterator<const int*>(ib)) == true);
     90 #if TEST_STD_VER >= 14
     91         assert(std::is_permutation(forward_iterator<const int*>(ia),
     92                                    forward_iterator<const int*>(ia + sa),
     93                                    forward_iterator<const int*>(ib),
     94                                    forward_iterator<const int*>(ib + sa)) == true);
     95         assert(std::is_permutation(forward_iterator<const int*>(ia),
     96                                    forward_iterator<const int*>(ia + sa),
     97                                    forward_iterator<const int*>(ib),
     98                                    forward_iterator<const int*>(ib + sa - 1)) == false);
     99 #endif
    100     }
    101     {
    102         const int ia[] = {0, 0};
    103         const int ib[] = {0, 1};
    104         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    105         assert(std::is_permutation(forward_iterator<const int*>(ia),
    106                                    forward_iterator<const int*>(ia + sa),
    107                                    forward_iterator<const int*>(ib)) == false);
    108 #if TEST_STD_VER >= 14
    109         assert(std::is_permutation(forward_iterator<const int*>(ia),
    110                                    forward_iterator<const int*>(ia + sa),
    111                                    forward_iterator<const int*>(ib),
    112                                    forward_iterator<const int*>(ib + sa)) == false);
    113 #endif
    114     }
    115     {
    116         const int ia[] = {0, 0};
    117         const int ib[] = {1, 0};
    118         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    119         assert(std::is_permutation(forward_iterator<const int*>(ia),
    120                                    forward_iterator<const int*>(ia + sa),
    121                                    forward_iterator<const int*>(ib)) == false);
    122 #if TEST_STD_VER >= 14
    123         assert(std::is_permutation(forward_iterator<const int*>(ia),
    124                                    forward_iterator<const int*>(ia + sa),
    125                                    forward_iterator<const int*>(ib),
    126                                    forward_iterator<const int*>(ib + sa)) == false);
    127 #endif
    128     }
    129     {
    130         const int ia[] = {0, 0};
    131         const int ib[] = {1, 1};
    132         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    133         assert(std::is_permutation(forward_iterator<const int*>(ia),
    134                                    forward_iterator<const int*>(ia + sa),
    135                                    forward_iterator<const int*>(ib)) == false);
    136 #if TEST_STD_VER >= 14
    137         assert(std::is_permutation(forward_iterator<const int*>(ia),
    138                                    forward_iterator<const int*>(ia + sa),
    139                                    forward_iterator<const int*>(ib),
    140                                    forward_iterator<const int*>(ib + sa)) == false);
    141 #endif
    142     }
    143     {
    144         const int ia[] = {0, 1};
    145         const int ib[] = {0, 0};
    146         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    147         assert(std::is_permutation(forward_iterator<const int*>(ia),
    148                                    forward_iterator<const int*>(ia + sa),
    149                                    forward_iterator<const int*>(ib)) == false);
    150 #if TEST_STD_VER >= 14
    151         assert(std::is_permutation(forward_iterator<const int*>(ia),
    152                                    forward_iterator<const int*>(ia + sa),
    153                                    forward_iterator<const int*>(ib),
    154                                    forward_iterator<const int*>(ib + sa)) == false);
    155 #endif
    156     }
    157     {
    158         const int ia[] = {0, 1};
    159         const int ib[] = {0, 1};
    160         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    161         assert(std::is_permutation(forward_iterator<const int*>(ia),
    162                                    forward_iterator<const int*>(ia + sa),
    163                                    forward_iterator<const int*>(ib)) == true);
    164 #if TEST_STD_VER >= 14
    165         assert(std::is_permutation(forward_iterator<const int*>(ia),
    166                                    forward_iterator<const int*>(ia + sa),
    167                                    forward_iterator<const int*>(ib),
    168                                    forward_iterator<const int*>(ib + sa)) == true);
    169         assert(std::is_permutation(forward_iterator<const int*>(ia),
    170                                    forward_iterator<const int*>(ia + sa),
    171                                    forward_iterator<const int*>(ib),
    172                                    forward_iterator<const int*>(ib + sa - 1)) == false);
    173 #endif
    174     }
    175     {
    176         const int ia[] = {0, 1};
    177         const int ib[] = {1, 0};
    178         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    179         assert(std::is_permutation(forward_iterator<const int*>(ia),
    180                                    forward_iterator<const int*>(ia + sa),
    181                                    forward_iterator<const int*>(ib)) == true);
    182 #if TEST_STD_VER >= 14
    183         assert(std::is_permutation(forward_iterator<const int*>(ia),
    184                                    forward_iterator<const int*>(ia + sa),
    185                                    forward_iterator<const int*>(ib),
    186                                    forward_iterator<const int*>(ib + sa)) == true);
    187 #endif
    188     }
    189     {
    190         const int ia[] = {0, 1};
    191         const int ib[] = {1, 1};
    192         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    193         assert(std::is_permutation(forward_iterator<const int*>(ia),
    194                                    forward_iterator<const int*>(ia + sa),
    195                                    forward_iterator<const int*>(ib)) == false);
    196 #if TEST_STD_VER >= 14
    197         assert(std::is_permutation(forward_iterator<const int*>(ia),
    198                                    forward_iterator<const int*>(ia + sa),
    199                                    forward_iterator<const int*>(ib),
    200                                    forward_iterator<const int*>(ib + sa)) == false);
    201 #endif
    202     }
    203     {
    204         const int ia[] = {1, 0};
    205         const int ib[] = {0, 0};
    206         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    207         assert(std::is_permutation(forward_iterator<const int*>(ia),
    208                                    forward_iterator<const int*>(ia + sa),
    209                                    forward_iterator<const int*>(ib)) == false);
    210 #if TEST_STD_VER >= 14
    211         assert(std::is_permutation(forward_iterator<const int*>(ia),
    212                                    forward_iterator<const int*>(ia + sa),
    213                                    forward_iterator<const int*>(ib),
    214                                    forward_iterator<const int*>(ib + sa)) == false);
    215 #endif
    216     }
    217     {
    218         const int ia[] = {1, 0};
    219         const int ib[] = {0, 1};
    220         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    221         assert(std::is_permutation(forward_iterator<const int*>(ia),
    222                                    forward_iterator<const int*>(ia + sa),
    223                                    forward_iterator<const int*>(ib)) == true);
    224 #if TEST_STD_VER >= 14
    225         assert(std::is_permutation(forward_iterator<const int*>(ia),
    226                                    forward_iterator<const int*>(ia + sa),
    227                                    forward_iterator<const int*>(ib),
    228                                    forward_iterator<const int*>(ib + sa)) == true);
    229 #endif
    230     }
    231     {
    232         const int ia[] = {1, 0};
    233         const int ib[] = {1, 0};
    234         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    235         assert(std::is_permutation(forward_iterator<const int*>(ia),
    236                                    forward_iterator<const int*>(ia + sa),
    237                                    forward_iterator<const int*>(ib)) == true);
    238 #if TEST_STD_VER >= 14
    239         assert(std::is_permutation(forward_iterator<const int*>(ia),
    240                                    forward_iterator<const int*>(ia + sa),
    241                                    forward_iterator<const int*>(ib),
    242                                    forward_iterator<const int*>(ib + sa)) == true);
    243 #endif
    244     }
    245     {
    246         const int ia[] = {1, 0};
    247         const int ib[] = {1, 1};
    248         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    249         assert(std::is_permutation(forward_iterator<const int*>(ia),
    250                                    forward_iterator<const int*>(ia + sa),
    251                                    forward_iterator<const int*>(ib)) == false);
    252 #if TEST_STD_VER >= 14
    253         assert(std::is_permutation(forward_iterator<const int*>(ia),
    254                                    forward_iterator<const int*>(ia + sa),
    255                                    forward_iterator<const int*>(ib),
    256                                    forward_iterator<const int*>(ib + sa)) == false);
    257 #endif
    258     }
    259     {
    260         const int ia[] = {1, 1};
    261         const int ib[] = {0, 0};
    262         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    263         assert(std::is_permutation(forward_iterator<const int*>(ia),
    264                                    forward_iterator<const int*>(ia + sa),
    265                                    forward_iterator<const int*>(ib)) == false);
    266 #if TEST_STD_VER >= 14
    267         assert(std::is_permutation(forward_iterator<const int*>(ia),
    268                                    forward_iterator<const int*>(ia + sa),
    269                                    forward_iterator<const int*>(ib),
    270                                    forward_iterator<const int*>(ib + sa)) == false);
    271 #endif
    272     }
    273     {
    274         const int ia[] = {1, 1};
    275         const int ib[] = {0, 1};
    276         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    277         assert(std::is_permutation(forward_iterator<const int*>(ia),
    278                                    forward_iterator<const int*>(ia + sa),
    279                                    forward_iterator<const int*>(ib)) == false);
    280 #if TEST_STD_VER >= 14
    281         assert(std::is_permutation(forward_iterator<const int*>(ia),
    282                                    forward_iterator<const int*>(ia + sa),
    283                                    forward_iterator<const int*>(ib),
    284                                    forward_iterator<const int*>(ib + sa)) == false);
    285 #endif
    286     }
    287     {
    288         const int ia[] = {1, 1};
    289         const int ib[] = {1, 0};
    290         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    291         assert(std::is_permutation(forward_iterator<const int*>(ia),
    292                                    forward_iterator<const int*>(ia + sa),
    293                                    forward_iterator<const int*>(ib)) == false);
    294 #if TEST_STD_VER >= 14
    295         assert(std::is_permutation(forward_iterator<const int*>(ia),
    296                                    forward_iterator<const int*>(ia + sa),
    297                                    forward_iterator<const int*>(ib),
    298                                    forward_iterator<const int*>(ib + sa)) == false);
    299 #endif
    300     }
    301     {
    302         const int ia[] = {1, 1};
    303         const int ib[] = {1, 1};
    304         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    305         assert(std::is_permutation(forward_iterator<const int*>(ia),
    306                                    forward_iterator<const int*>(ia + sa),
    307                                    forward_iterator<const int*>(ib)) == true);
    308 #if TEST_STD_VER >= 14
    309         assert(std::is_permutation(forward_iterator<const int*>(ia),
    310                                    forward_iterator<const int*>(ia + sa),
    311                                    forward_iterator<const int*>(ib),
    312                                    forward_iterator<const int*>(ib + sa)) == true);
    313 #endif
    314     }
    315 
    316     {
    317         const int ia[] = {0, 0, 0};
    318         const int ib[] = {1, 0, 0};
    319         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    320         assert(std::is_permutation(forward_iterator<const int*>(ia),
    321                                    forward_iterator<const int*>(ia + sa),
    322                                    forward_iterator<const int*>(ib)) == false);
    323 #if TEST_STD_VER >= 14
    324         assert(std::is_permutation(forward_iterator<const int*>(ia),
    325                                    forward_iterator<const int*>(ia + sa),
    326                                    forward_iterator<const int*>(ib),
    327                                    forward_iterator<const int*>(ib + sa)) == false);
    328 #endif
    329     }
    330     {
    331         const int ia[] = {0, 0, 0};
    332         const int ib[] = {1, 0, 1};
    333         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    334         assert(std::is_permutation(forward_iterator<const int*>(ia),
    335                                    forward_iterator<const int*>(ia + sa),
    336                                    forward_iterator<const int*>(ib)) == false);
    337 #if TEST_STD_VER >= 14
    338         assert(std::is_permutation(forward_iterator<const int*>(ia),
    339                                    forward_iterator<const int*>(ia + sa),
    340                                    forward_iterator<const int*>(ib),
    341                                    forward_iterator<const int*>(ib + sa)) == false);
    342 #endif
    343     }
    344     {
    345         const int ia[] = {0, 0, 0};
    346         const int ib[] = {1, 0, 2};
    347         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    348         assert(std::is_permutation(forward_iterator<const int*>(ia),
    349                                    forward_iterator<const int*>(ia + sa),
    350                                    forward_iterator<const int*>(ib)) == false);
    351 #if TEST_STD_VER >= 14
    352         assert(std::is_permutation(forward_iterator<const int*>(ia),
    353                                    forward_iterator<const int*>(ia + sa),
    354                                    forward_iterator<const int*>(ib),
    355                                    forward_iterator<const int*>(ib + sa)) == false);
    356 #endif
    357     }
    358     {
    359         const int ia[] = {0, 0, 0};
    360         const int ib[] = {1, 1, 0};
    361         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    362         assert(std::is_permutation(forward_iterator<const int*>(ia),
    363                                    forward_iterator<const int*>(ia + sa),
    364                                    forward_iterator<const int*>(ib)) == false);
    365 #if TEST_STD_VER >= 14
    366         assert(std::is_permutation(forward_iterator<const int*>(ia),
    367                                    forward_iterator<const int*>(ia + sa),
    368                                    forward_iterator<const int*>(ib),
    369                                    forward_iterator<const int*>(ib + sa)) == false);
    370 #endif
    371     }
    372     {
    373         const int ia[] = {0, 0, 0};
    374         const int ib[] = {1, 1, 1};
    375         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    376         assert(std::is_permutation(forward_iterator<const int*>(ia),
    377                                    forward_iterator<const int*>(ia + sa),
    378                                    forward_iterator<const int*>(ib)) == false);
    379 #if TEST_STD_VER >= 14
    380         assert(std::is_permutation(forward_iterator<const int*>(ia),
    381                                    forward_iterator<const int*>(ia + sa),
    382                                    forward_iterator<const int*>(ib),
    383                                    forward_iterator<const int*>(ib + sa)) == false);
    384 #endif
    385     }
    386     {
    387         const int ia[] = {0, 0, 0};
    388         const int ib[] = {1, 1, 2};
    389         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    390         assert(std::is_permutation(forward_iterator<const int*>(ia),
    391                                    forward_iterator<const int*>(ia + sa),
    392                                    forward_iterator<const int*>(ib)) == false);
    393 #if TEST_STD_VER >= 14
    394         assert(std::is_permutation(forward_iterator<const int*>(ia),
    395                                    forward_iterator<const int*>(ia + sa),
    396                                    forward_iterator<const int*>(ib),
    397                                    forward_iterator<const int*>(ib + sa)) == false);
    398 #endif
    399     }
    400     {
    401         const int ia[] = {0, 0, 0};
    402         const int ib[] = {1, 2, 0};
    403         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    404         assert(std::is_permutation(forward_iterator<const int*>(ia),
    405                                    forward_iterator<const int*>(ia + sa),
    406                                    forward_iterator<const int*>(ib)) == false);
    407 #if TEST_STD_VER >= 14
    408         assert(std::is_permutation(forward_iterator<const int*>(ia),
    409                                    forward_iterator<const int*>(ia + sa),
    410                                    forward_iterator<const int*>(ib),
    411                                    forward_iterator<const int*>(ib + sa)) == false);
    412 #endif
    413     }
    414     {
    415         const int ia[] = {0, 0, 0};
    416         const int ib[] = {1, 2, 1};
    417         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    418         assert(std::is_permutation(forward_iterator<const int*>(ia),
    419                                    forward_iterator<const int*>(ia + sa),
    420                                    forward_iterator<const int*>(ib)) == false);
    421 #if TEST_STD_VER >= 14
    422         assert(std::is_permutation(forward_iterator<const int*>(ia),
    423                                    forward_iterator<const int*>(ia + sa),
    424                                    forward_iterator<const int*>(ib),
    425                                    forward_iterator<const int*>(ib + sa)) == false);
    426 #endif
    427     }
    428     {
    429         const int ia[] = {0, 0, 0};
    430         const int ib[] = {1, 2, 2};
    431         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    432         assert(std::is_permutation(forward_iterator<const int*>(ia),
    433                                    forward_iterator<const int*>(ia + sa),
    434                                    forward_iterator<const int*>(ib)) == false);
    435 #if TEST_STD_VER >= 14
    436         assert(std::is_permutation(forward_iterator<const int*>(ia),
    437                                    forward_iterator<const int*>(ia + sa),
    438                                    forward_iterator<const int*>(ib),
    439                                    forward_iterator<const int*>(ib + sa)) == false);
    440 #endif
    441     }
    442     {
    443         const int ia[] = {0, 0, 1};
    444         const int ib[] = {1, 0, 0};
    445         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    446         assert(std::is_permutation(forward_iterator<const int*>(ia),
    447                                    forward_iterator<const int*>(ia + sa),
    448                                    forward_iterator<const int*>(ib)) == true);
    449 #if TEST_STD_VER >= 14
    450         assert(std::is_permutation(forward_iterator<const int*>(ia),
    451                                    forward_iterator<const int*>(ia + sa),
    452                                    forward_iterator<const int*>(ib),
    453                                    forward_iterator<const int*>(ib + sa)) == true);
    454         assert(std::is_permutation(forward_iterator<const int*>(ia),
    455                                    forward_iterator<const int*>(ia + sa),
    456                                    forward_iterator<const int*>(ib),
    457                                    forward_iterator<const int*>(ib + sa - 1)) == false);
    458 #endif
    459     }
    460     {
    461         const int ia[] = {0, 0, 1};
    462         const int ib[] = {1, 0, 1};
    463         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    464         assert(std::is_permutation(forward_iterator<const int*>(ia),
    465                                    forward_iterator<const int*>(ia + sa),
    466                                    forward_iterator<const int*>(ib)) == false);
    467 #if TEST_STD_VER >= 14
    468         assert(std::is_permutation(forward_iterator<const int*>(ia),
    469                                    forward_iterator<const int*>(ia + sa),
    470                                    forward_iterator<const int*>(ib),
    471                                    forward_iterator<const int*>(ib + sa)) == false);
    472 #endif
    473     }
    474     {
    475         const int ia[] = {0, 1, 2};
    476         const int ib[] = {1, 0, 2};
    477         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    478         assert(std::is_permutation(forward_iterator<const int*>(ia),
    479                                    forward_iterator<const int*>(ia + sa),
    480                                    forward_iterator<const int*>(ib)) == true);
    481 #if TEST_STD_VER >= 14
    482         assert(std::is_permutation(forward_iterator<const int*>(ia),
    483                                    forward_iterator<const int*>(ia + sa),
    484                                    forward_iterator<const int*>(ib),
    485                                    forward_iterator<const int*>(ib + sa)) == true);
    486         assert(std::is_permutation(forward_iterator<const int*>(ia),
    487                                    forward_iterator<const int*>(ia + sa),
    488                                    forward_iterator<const int*>(ib),
    489                                    forward_iterator<const int*>(ib + sa - 1)) == false);
    490 #endif
    491     }
    492     {
    493         const int ia[] = {0, 1, 2};
    494         const int ib[] = {1, 2, 0};
    495         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    496         assert(std::is_permutation(forward_iterator<const int*>(ia),
    497                                    forward_iterator<const int*>(ia + sa),
    498                                    forward_iterator<const int*>(ib)) == true);
    499 #if TEST_STD_VER >= 14
    500         assert(std::is_permutation(forward_iterator<const int*>(ia),
    501                                    forward_iterator<const int*>(ia + sa),
    502                                    forward_iterator<const int*>(ib),
    503                                    forward_iterator<const int*>(ib + sa)) == true);
    504         assert(std::is_permutation(forward_iterator<const int*>(ia),
    505                                    forward_iterator<const int*>(ia + sa),
    506                                    forward_iterator<const int*>(ib),
    507                                    forward_iterator<const int*>(ib + sa - 1)) == false);
    508 #endif
    509     }
    510     {
    511         const int ia[] = {0, 1, 2};
    512         const int ib[] = {2, 1, 0};
    513         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    514         assert(std::is_permutation(forward_iterator<const int*>(ia),
    515                                    forward_iterator<const int*>(ia + sa),
    516                                    forward_iterator<const int*>(ib)) == true);
    517 #if TEST_STD_VER >= 14
    518         assert(std::is_permutation(forward_iterator<const int*>(ia),
    519                                    forward_iterator<const int*>(ia + sa),
    520                                    forward_iterator<const int*>(ib),
    521                                    forward_iterator<const int*>(ib + sa)) == true);
    522         assert(std::is_permutation(forward_iterator<const int*>(ia),
    523                                    forward_iterator<const int*>(ia + sa),
    524                                    forward_iterator<const int*>(ib),
    525                                    forward_iterator<const int*>(ib + sa - 1)) == false);
    526 #endif
    527     }
    528     {
    529         const int ia[] = {0, 1, 2};
    530         const int ib[] = {2, 0, 1};
    531         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    532         assert(std::is_permutation(forward_iterator<const int*>(ia),
    533                                    forward_iterator<const int*>(ia + sa),
    534                                    forward_iterator<const int*>(ib)) == true);
    535 #if TEST_STD_VER >= 14
    536         assert(std::is_permutation(forward_iterator<const int*>(ia),
    537                                    forward_iterator<const int*>(ia + sa),
    538                                    forward_iterator<const int*>(ib),
    539                                    forward_iterator<const int*>(ib + sa)) == true);
    540         assert(std::is_permutation(forward_iterator<const int*>(ia),
    541                                    forward_iterator<const int*>(ia + sa),
    542                                    forward_iterator<const int*>(ib),
    543                                    forward_iterator<const int*>(ib + sa - 1)) == false);
    544 #endif
    545     }
    546     {
    547         const int ia[] = {0, 0, 1};
    548         const int ib[] = {1, 0, 1};
    549         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    550         assert(std::is_permutation(forward_iterator<const int*>(ia),
    551                                    forward_iterator<const int*>(ia + sa),
    552                                    forward_iterator<const int*>(ib)) == false);
    553 #if TEST_STD_VER >= 14
    554         assert(std::is_permutation(forward_iterator<const int*>(ia),
    555                                    forward_iterator<const int*>(ia + sa),
    556                                    forward_iterator<const int*>(ib),
    557                                    forward_iterator<const int*>(ib + sa)) == false);
    558 #endif
    559     }
    560     {
    561         const int ia[] = {0, 0, 1};
    562         const int ib[] = {1, 0, 0};
    563         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    564         assert(std::is_permutation(forward_iterator<const int*>(ia),
    565                                    forward_iterator<const int*>(ia + sa),
    566                                    forward_iterator<const int*>(ib)) == true);
    567 #if TEST_STD_VER >= 14
    568         assert(std::is_permutation(forward_iterator<const int*>(ia),
    569                                    forward_iterator<const int*>(ia + sa),
    570                                    forward_iterator<const int*>(ib),
    571                                    forward_iterator<const int*>(ib + sa)) == true);
    572         assert(std::is_permutation(forward_iterator<const int*>(ia),
    573                                    forward_iterator<const int*>(ia + sa),
    574                                    forward_iterator<const int*>(ib + 1),
    575                                    forward_iterator<const int*>(ib + sa)) == false);
    576         assert(std::is_permutation(forward_iterator<const int*>(ia),
    577                                    forward_iterator<const int*>(ia + sa),
    578                                    forward_iterator<const int*>(ib),
    579                                    forward_iterator<const int*>(ib + sa - 1)) == false);
    580 #endif
    581     }
    582     {
    583         const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
    584         const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 2};
    585         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    586         assert(std::is_permutation(forward_iterator<const int*>(ia),
    587                                    forward_iterator<const int*>(ia + sa),
    588                                    forward_iterator<const int*>(ib)) == true);
    589 #if TEST_STD_VER >= 14
    590         assert(std::is_permutation(forward_iterator<const int*>(ia),
    591                                    forward_iterator<const int*>(ia + sa),
    592                                    forward_iterator<const int*>(ib),
    593                                    forward_iterator<const int*>(ib + sa)) == true);
    594         assert(std::is_permutation(forward_iterator<const int*>(ia),
    595                                    forward_iterator<const int*>(ia + sa),
    596                                    forward_iterator<const int*>(ib + 1 ),
    597                                    forward_iterator<const int*>(ib + sa)) == false);
    598         assert(std::is_permutation(forward_iterator<const int*>(ia),
    599                                    forward_iterator<const int*>(ia + sa),
    600                                    forward_iterator<const int*>(ib),
    601                                    forward_iterator<const int*>(ib + sa - 1)) == false);
    602 #endif
    603     }
    604     {
    605         const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
    606         const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 0};
    607         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    608         assert(std::is_permutation(forward_iterator<const int*>(ia),
    609                                    forward_iterator<const int*>(ia + sa),
    610                                    forward_iterator<const int*>(ib)) == false);
    611 #if TEST_STD_VER >= 14
    612         assert(std::is_permutation(forward_iterator<const int*>(ia),
    613                                    forward_iterator<const int*>(ia + sa),
    614                                    forward_iterator<const int*>(ib),
    615                                    forward_iterator<const int*>(ib + sa)) == false);
    616 #endif
    617     }
    618 
    619 #if TEST_STD_VER > 17
    620     static_assert(test_constexpr());
    621 #endif
    622 }
    623