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, class BinaryPredicate>
     13 //   constexpr bool   // constexpr after C++17
     14 //   is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
     15 //                  ForwardIterator2 first2, BinaryPredicate pred);
     16 
     17 #include <algorithm>
     18 #include <functional>
     19 #include <cassert>
     20 
     21 #include "test_macros.h"
     22 #include "test_iterators.h"
     23 
     24 int comparison_count = 0;
     25 template <typename T>
     26 bool counting_equals ( const T &a, const T &b ) {
     27     ++comparison_count;
     28     return a == b;
     29     }
     30 
     31 #if TEST_STD_VER > 17
     32 constexpr bool test_constexpr() {
     33     int ia[] = {0, 0, 0};
     34     int ib[] = {1, 1, 0};
     35     int ic[] = {1, 0, 1};
     36     int id[] = {1};
     37     std::equal_to<int> c{};
     38     return !std::is_permutation(std::begin(ia), std::end(ia), std::begin(ib)              , c)
     39         && !std::is_permutation(std::begin(ia), std::end(ia), std::begin(ib), std::end(ib), c)
     40         &&  std::is_permutation(std::begin(ib), std::end(ib), std::begin(ic)              , c)
     41         &&  std::is_permutation(std::begin(ib), std::end(ib), std::begin(ic), std::end(ic), c)
     42         && !std::is_permutation(std::begin(ic), std::end(ic), std::begin(id), std::end(id), c)
     43         ;
     44     }
     45 #endif
     46 
     47 int main()
     48 {
     49     {
     50         const int ia[] = {0};
     51         const int ib[] = {0};
     52         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
     53         assert(std::is_permutation(forward_iterator<const int*>(ia),
     54                                    forward_iterator<const int*>(ia + 0),
     55                                    forward_iterator<const int*>(ib),
     56                                    std::equal_to<const int>()) == true);
     57         assert(std::is_permutation(forward_iterator<const int*>(ia),
     58                                    forward_iterator<const int*>(ia + sa),
     59                                    forward_iterator<const int*>(ib),
     60                                    std::equal_to<const int>()) == true);
     61 #if TEST_STD_VER >= 14
     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),
     66                                    std::equal_to<const int>()) == true);
     67         assert(std::is_permutation(forward_iterator<const int*>(ia),
     68                                    forward_iterator<const int*>(ia + sa),
     69                                    forward_iterator<const int*>(ib),
     70                                    forward_iterator<const int*>(ib + sa - 1),
     71                                    std::equal_to<const int>()) == false);
     72 #endif
     73     }
     74     {
     75         const int ia[] = {0};
     76         const int ib[] = {1};
     77         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
     78         assert(std::is_permutation(forward_iterator<const int*>(ia),
     79                                    forward_iterator<const int*>(ia + sa),
     80                                    forward_iterator<const int*>(ib),
     81                                    std::equal_to<const int>()) == false);
     82 #if TEST_STD_VER >= 14
     83         assert(std::is_permutation(forward_iterator<const int*>(ia),
     84                                    forward_iterator<const int*>(ia + sa),
     85                                    forward_iterator<const int*>(ib),
     86                                    forward_iterator<const int*>(ib + sa),
     87                                    std::equal_to<const int>()) == false);
     88 #endif
     89     }
     90 
     91     {
     92         const int ia[] = {0, 0};
     93         const int ib[] = {0, 0};
     94         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
     95         assert(std::is_permutation(forward_iterator<const int*>(ia),
     96                                    forward_iterator<const int*>(ia + sa),
     97                                    forward_iterator<const int*>(ib),
     98                                    std::equal_to<const int>()) == true);
     99 #if TEST_STD_VER >= 14
    100         assert(std::is_permutation(forward_iterator<const int*>(ia),
    101                                    forward_iterator<const int*>(ia + sa),
    102                                    forward_iterator<const int*>(ib),
    103                                    forward_iterator<const int*>(ib + sa),
    104                                    std::equal_to<const int>()) == true);
    105         assert(std::is_permutation(forward_iterator<const int*>(ia),
    106                                    forward_iterator<const int*>(ia + sa),
    107                                    forward_iterator<const int*>(ib),
    108                                    forward_iterator<const int*>(ib + sa - 1),
    109                                    std::equal_to<const int>()) == false);
    110 #endif
    111     }
    112     {
    113         const int ia[] = {0, 0};
    114         const int ib[] = {0, 1};
    115         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    116         assert(std::is_permutation(forward_iterator<const int*>(ia),
    117                                    forward_iterator<const int*>(ia + sa),
    118                                    forward_iterator<const int*>(ib),
    119                                    std::equal_to<const int>()) == false);
    120 #if TEST_STD_VER >= 14
    121         assert(std::is_permutation(forward_iterator<const int*>(ia),
    122                                    forward_iterator<const int*>(ia + sa),
    123                                    forward_iterator<const int*>(ib),
    124                                    forward_iterator<const int*>(ib + sa),
    125                                    std::equal_to<const int>()) == false);
    126 #endif
    127     }
    128     {
    129         const int ia[] = {0, 0};
    130         const int ib[] = {1, 0};
    131         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    132         assert(std::is_permutation(forward_iterator<const int*>(ia),
    133                                    forward_iterator<const int*>(ia + sa),
    134                                    forward_iterator<const int*>(ib),
    135                                    std::equal_to<const int>()) == 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),
    141                                    std::equal_to<const int>()) == false);
    142 #endif
    143     }
    144     {
    145         const int ia[] = {0, 0};
    146         const int ib[] = {1, 1};
    147         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    148         assert(std::is_permutation(forward_iterator<const int*>(ia),
    149                                    forward_iterator<const int*>(ia + sa),
    150                                    forward_iterator<const int*>(ib),
    151                                    std::equal_to<const int>()) == false);
    152 #if TEST_STD_VER >= 14
    153         assert(std::is_permutation(forward_iterator<const int*>(ia),
    154                                    forward_iterator<const int*>(ia + sa),
    155                                    forward_iterator<const int*>(ib),
    156                                    forward_iterator<const int*>(ib + sa),
    157                                    std::equal_to<const int>()) == false);
    158 #endif
    159     }
    160     {
    161         const int ia[] = {0, 1};
    162         const int ib[] = {0, 0};
    163         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    164         assert(std::is_permutation(forward_iterator<const int*>(ia),
    165                                    forward_iterator<const int*>(ia + sa),
    166                                    forward_iterator<const int*>(ib),
    167                                    std::equal_to<const int>()) == false);
    168 #if TEST_STD_VER >= 14
    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),
    173                                    std::equal_to<const int>()) == false);
    174 #endif
    175     }
    176     {
    177         const int ia[] = {0, 1};
    178         const int ib[] = {0, 1};
    179         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    180         assert(std::is_permutation(forward_iterator<const int*>(ia),
    181                                    forward_iterator<const int*>(ia + sa),
    182                                    forward_iterator<const int*>(ib),
    183                                    std::equal_to<const int>()) == true);
    184 #if TEST_STD_VER >= 14
    185         assert(std::is_permutation(forward_iterator<const int*>(ia),
    186                                    forward_iterator<const int*>(ia + sa),
    187                                    forward_iterator<const int*>(ib),
    188                                    forward_iterator<const int*>(ib + sa),
    189                                    std::equal_to<const int>()) == true);
    190         assert(std::is_permutation(forward_iterator<const int*>(ia),
    191                                    forward_iterator<const int*>(ia + sa),
    192                                    forward_iterator<const int*>(ib),
    193                                    forward_iterator<const int*>(ib + sa - 1),
    194                                    std::equal_to<const int>()) == false);
    195 #endif
    196     }
    197     {
    198         const int ia[] = {0, 1};
    199         const int ib[] = {1, 0};
    200         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    201         assert(std::is_permutation(forward_iterator<const int*>(ia),
    202                                    forward_iterator<const int*>(ia + sa),
    203                                    forward_iterator<const int*>(ib),
    204                                    std::equal_to<const int>()) == true);
    205 #if TEST_STD_VER >= 14
    206         assert(std::is_permutation(forward_iterator<const int*>(ia),
    207                                    forward_iterator<const int*>(ia + sa),
    208                                    forward_iterator<const int*>(ib),
    209                                    forward_iterator<const int*>(ib + sa),
    210                                    std::equal_to<const int>()) == true);
    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 - 1),
    215                                    std::equal_to<const int>()) == false);
    216 #endif
    217     }
    218     {
    219         const int ia[] = {0, 1};
    220         const int ib[] = {1, 1};
    221         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    222         assert(std::is_permutation(forward_iterator<const int*>(ia),
    223                                    forward_iterator<const int*>(ia + sa),
    224                                    forward_iterator<const int*>(ib),
    225                                    std::equal_to<const int>()) == false);
    226 #if TEST_STD_VER >= 14
    227         assert(std::is_permutation(forward_iterator<const int*>(ia),
    228                                    forward_iterator<const int*>(ia + sa),
    229                                    forward_iterator<const int*>(ib),
    230                                    forward_iterator<const int*>(ib + sa),
    231                                    std::equal_to<const int>()) == false);
    232 #endif
    233     }
    234     {
    235         const int ia[] = {1, 0};
    236         const int ib[] = {0, 0};
    237         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    238         assert(std::is_permutation(forward_iterator<const int*>(ia),
    239                                    forward_iterator<const int*>(ia + sa),
    240                                    forward_iterator<const int*>(ib),
    241                                    std::equal_to<const int>()) == false);
    242 #if TEST_STD_VER >= 14
    243         assert(std::is_permutation(forward_iterator<const int*>(ia),
    244                                    forward_iterator<const int*>(ia + sa),
    245                                    forward_iterator<const int*>(ib),
    246                                    forward_iterator<const int*>(ib + sa),
    247                                    std::equal_to<const int>()) == false);
    248 #endif
    249     }
    250     {
    251         const int ia[] = {1, 0};
    252         const int ib[] = {0, 1};
    253         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    254         assert(std::is_permutation(forward_iterator<const int*>(ia),
    255                                    forward_iterator<const int*>(ia + sa),
    256                                    forward_iterator<const int*>(ib),
    257                                    std::equal_to<const int>()) == true);
    258 #if TEST_STD_VER >= 14
    259         assert(std::is_permutation(forward_iterator<const int*>(ia),
    260                                    forward_iterator<const int*>(ia + sa),
    261                                    forward_iterator<const int*>(ib),
    262                                    forward_iterator<const int*>(ib + sa),
    263                                    std::equal_to<const int>()) == true);
    264         assert(std::is_permutation(forward_iterator<const int*>(ia),
    265                                    forward_iterator<const int*>(ia + sa),
    266                                    forward_iterator<const int*>(ib),
    267                                    forward_iterator<const int*>(ib + sa - 1),
    268                                    std::equal_to<const int>()) == false);
    269 #endif
    270     }
    271     {
    272         const int ia[] = {1, 0};
    273         const int ib[] = {1, 0};
    274         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    275         assert(std::is_permutation(forward_iterator<const int*>(ia),
    276                                    forward_iterator<const int*>(ia + sa),
    277                                    forward_iterator<const int*>(ib),
    278                                    std::equal_to<const int>()) == true);
    279 #if TEST_STD_VER >= 14
    280         assert(std::is_permutation(forward_iterator<const int*>(ia),
    281                                    forward_iterator<const int*>(ia + sa),
    282                                    forward_iterator<const int*>(ib),
    283                                    forward_iterator<const int*>(ib + sa),
    284                                    std::equal_to<const int>()) == true);
    285         assert(std::is_permutation(forward_iterator<const int*>(ia),
    286                                    forward_iterator<const int*>(ia + sa),
    287                                    forward_iterator<const int*>(ib),
    288                                    forward_iterator<const int*>(ib + sa - 1),
    289                                    std::equal_to<const int>()) == false);
    290 #endif
    291     }
    292     {
    293         const int ia[] = {1, 0};
    294         const int ib[] = {1, 1};
    295         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    296         assert(std::is_permutation(forward_iterator<const int*>(ia),
    297                                    forward_iterator<const int*>(ia + sa),
    298                                    forward_iterator<const int*>(ib),
    299                                    std::equal_to<const int>()) == false);
    300 #if TEST_STD_VER >= 14
    301         assert(std::is_permutation(forward_iterator<const int*>(ia),
    302                                    forward_iterator<const int*>(ia + sa),
    303                                    forward_iterator<const int*>(ib),
    304                                    forward_iterator<const int*>(ib + sa),
    305                                    std::equal_to<const int>()) == false);
    306 #endif
    307     }
    308     {
    309         const int ia[] = {1, 1};
    310         const int ib[] = {0, 0};
    311         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    312         assert(std::is_permutation(forward_iterator<const int*>(ia),
    313                                    forward_iterator<const int*>(ia + sa),
    314                                    forward_iterator<const int*>(ib),
    315                                    std::equal_to<const int>()) == false);
    316 #if TEST_STD_VER >= 14
    317         assert(std::is_permutation(forward_iterator<const int*>(ia),
    318                                    forward_iterator<const int*>(ia + sa),
    319                                    forward_iterator<const int*>(ib),
    320                                    forward_iterator<const int*>(ib + sa),
    321                                    std::equal_to<const int>()) == false);
    322 #endif
    323     }
    324     {
    325         const int ia[] = {1, 1};
    326         const int ib[] = {0, 1};
    327         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    328         assert(std::is_permutation(forward_iterator<const int*>(ia),
    329                                    forward_iterator<const int*>(ia + sa),
    330                                    forward_iterator<const int*>(ib),
    331                                    std::equal_to<const int>()) == false);
    332 #if TEST_STD_VER >= 14
    333         assert(std::is_permutation(forward_iterator<const int*>(ia),
    334                                    forward_iterator<const int*>(ia + sa),
    335                                    forward_iterator<const int*>(ib),
    336                                    forward_iterator<const int*>(ib + sa),
    337                                    std::equal_to<const int>()) == false);
    338 #endif
    339     }
    340     {
    341         const int ia[] = {1, 1};
    342         const int ib[] = {1, 0};
    343         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    344         assert(std::is_permutation(forward_iterator<const int*>(ia),
    345                                    forward_iterator<const int*>(ia + sa),
    346                                    forward_iterator<const int*>(ib),
    347                                    std::equal_to<const int>()) == false);
    348 #if TEST_STD_VER >= 14
    349         assert(std::is_permutation(forward_iterator<const int*>(ia),
    350                                    forward_iterator<const int*>(ia + sa),
    351                                    forward_iterator<const int*>(ib),
    352                                    forward_iterator<const int*>(ib + sa),
    353                                    std::equal_to<const int>()) == false);
    354 #endif
    355     }
    356     {
    357         const int ia[] = {1, 1};
    358         const int ib[] = {1, 1};
    359         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    360         assert(std::is_permutation(forward_iterator<const int*>(ia),
    361                                    forward_iterator<const int*>(ia + sa),
    362                                    forward_iterator<const int*>(ib),
    363                                    std::equal_to<const int>()) == true);
    364 #if TEST_STD_VER >= 14
    365         assert(std::is_permutation(forward_iterator<const int*>(ia),
    366                                    forward_iterator<const int*>(ia + sa),
    367                                    forward_iterator<const int*>(ib),
    368                                    forward_iterator<const int*>(ib + sa),
    369                                    std::equal_to<const int>()) == true);
    370         assert(std::is_permutation(forward_iterator<const int*>(ia),
    371                                    forward_iterator<const int*>(ia + sa),
    372                                    forward_iterator<const int*>(ib),
    373                                    forward_iterator<const int*>(ib + sa - 1),
    374                                    std::equal_to<const int>()) == false);
    375 #endif
    376     }
    377 
    378     {
    379         const int ia[] = {0, 0, 0};
    380         const int ib[] = {1, 0, 0};
    381         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    382         assert(std::is_permutation(forward_iterator<const int*>(ia),
    383                                    forward_iterator<const int*>(ia + sa),
    384                                    forward_iterator<const int*>(ib),
    385                                    std::equal_to<const int>()) == false);
    386 #if TEST_STD_VER >= 14
    387         assert(std::is_permutation(forward_iterator<const int*>(ia),
    388                                    forward_iterator<const int*>(ia + sa),
    389                                    forward_iterator<const int*>(ib),
    390                                    forward_iterator<const int*>(ib + sa),
    391                                    std::equal_to<const int>()) == false);
    392 #endif
    393     }
    394     {
    395         const int ia[] = {0, 0, 0};
    396         const int ib[] = {1, 0, 1};
    397         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    398         assert(std::is_permutation(forward_iterator<const int*>(ia),
    399                                    forward_iterator<const int*>(ia + sa),
    400                                    forward_iterator<const int*>(ib),
    401                                    std::equal_to<const int>()) == false);
    402 #if TEST_STD_VER >= 14
    403         assert(std::is_permutation(forward_iterator<const int*>(ia),
    404                                    forward_iterator<const int*>(ia + sa),
    405                                    forward_iterator<const int*>(ib),
    406                                    forward_iterator<const int*>(ib + sa),
    407                                    std::equal_to<const int>()) == false);
    408 #endif
    409     }
    410     {
    411         const int ia[] = {0, 0, 0};
    412         const int ib[] = {1, 0, 2};
    413         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    414         assert(std::is_permutation(forward_iterator<const int*>(ia),
    415                                    forward_iterator<const int*>(ia + sa),
    416                                    forward_iterator<const int*>(ib),
    417                                    std::equal_to<const int>()) == false);
    418 #if TEST_STD_VER >= 14
    419         assert(std::is_permutation(forward_iterator<const int*>(ia),
    420                                    forward_iterator<const int*>(ia + sa),
    421                                    forward_iterator<const int*>(ib),
    422                                    forward_iterator<const int*>(ib + sa),
    423                                    std::equal_to<const int>()) == false);
    424 #endif
    425     }
    426     {
    427         const int ia[] = {0, 0, 0};
    428         const int ib[] = {1, 1, 0};
    429         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    430         assert(std::is_permutation(forward_iterator<const int*>(ia),
    431                                    forward_iterator<const int*>(ia + sa),
    432                                    forward_iterator<const int*>(ib),
    433                                    std::equal_to<const int>()) == false);
    434 #if TEST_STD_VER >= 14
    435         assert(std::is_permutation(forward_iterator<const int*>(ia),
    436                                    forward_iterator<const int*>(ia + sa),
    437                                    forward_iterator<const int*>(ib),
    438                                    forward_iterator<const int*>(ib + sa),
    439                                    std::equal_to<const int>()) == false);
    440 #endif
    441     }
    442     {
    443         const int ia[] = {0, 0, 0};
    444         const int ib[] = {1, 1, 1};
    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),
    449                                    std::equal_to<const int>()) == false);
    450 #if TEST_STD_VER >= 14
    451         assert(std::is_permutation(forward_iterator<const int*>(ia),
    452                                    forward_iterator<const int*>(ia + sa),
    453                                    forward_iterator<const int*>(ib),
    454                                    forward_iterator<const int*>(ib + sa),
    455                                    std::equal_to<const int>()) == false);
    456 #endif
    457     }
    458     {
    459         const int ia[] = {0, 0, 0};
    460         const int ib[] = {1, 1, 2};
    461         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    462         assert(std::is_permutation(forward_iterator<const int*>(ia),
    463                                    forward_iterator<const int*>(ia + sa),
    464                                    forward_iterator<const int*>(ib),
    465                                    std::equal_to<const int>()) == false);
    466 #if TEST_STD_VER >= 14
    467         assert(std::is_permutation(forward_iterator<const int*>(ia),
    468                                    forward_iterator<const int*>(ia + sa),
    469                                    forward_iterator<const int*>(ib),
    470                                    forward_iterator<const int*>(ib + sa),
    471                                    std::equal_to<const int>()) == false);
    472 #endif
    473     }
    474     {
    475         const int ia[] = {0, 0, 0};
    476         const int ib[] = {1, 2, 0};
    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),
    481                                    std::equal_to<const int>()) == false);
    482 #if TEST_STD_VER >= 14
    483         assert(std::is_permutation(forward_iterator<const int*>(ia),
    484                                    forward_iterator<const int*>(ia + sa),
    485                                    forward_iterator<const int*>(ib),
    486                                    forward_iterator<const int*>(ib + sa),
    487                                    std::equal_to<const int>()) == false);
    488 #endif
    489     }
    490     {
    491         const int ia[] = {0, 0, 0};
    492         const int ib[] = {1, 2, 1};
    493         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    494         assert(std::is_permutation(forward_iterator<const int*>(ia),
    495                                    forward_iterator<const int*>(ia + sa),
    496                                    forward_iterator<const int*>(ib),
    497                                    std::equal_to<const int>()) == false);
    498 #if TEST_STD_VER >= 14
    499         assert(std::is_permutation(forward_iterator<const int*>(ia),
    500                                    forward_iterator<const int*>(ia + sa),
    501                                    forward_iterator<const int*>(ib),
    502                                    forward_iterator<const int*>(ib + sa),
    503                                    std::equal_to<const int>()) == false);
    504 #endif
    505     }
    506     {
    507         const int ia[] = {0, 0, 0};
    508         const int ib[] = {1, 2, 2};
    509         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    510         assert(std::is_permutation(forward_iterator<const int*>(ia),
    511                                    forward_iterator<const int*>(ia + sa),
    512                                    forward_iterator<const int*>(ib),
    513                                    std::equal_to<const int>()) == false);
    514 #if TEST_STD_VER >= 14
    515         assert(std::is_permutation(forward_iterator<const int*>(ia),
    516                                    forward_iterator<const int*>(ia + sa),
    517                                    forward_iterator<const int*>(ib),
    518                                    forward_iterator<const int*>(ib + sa),
    519                                    std::equal_to<const int>()) == false);
    520 #endif
    521     }
    522     {
    523         const int ia[] = {0, 0, 1};
    524         const int ib[] = {1, 0, 0};
    525         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    526         assert(std::is_permutation(forward_iterator<const int*>(ia),
    527                                    forward_iterator<const int*>(ia + sa),
    528                                    forward_iterator<const int*>(ib),
    529                                    std::equal_to<const int>()) == true);
    530 #if TEST_STD_VER >= 14
    531         assert(std::is_permutation(forward_iterator<const int*>(ia),
    532                                    forward_iterator<const int*>(ia + sa),
    533                                    forward_iterator<const int*>(ib),
    534                                    forward_iterator<const int*>(ib + sa),
    535                                    std::equal_to<const int>()) == true);
    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 - 1),
    540                                    std::equal_to<const int>()) == false);
    541 #endif
    542     }
    543     {
    544         const int ia[] = {0, 0, 1};
    545         const int ib[] = {1, 0, 1};
    546         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    547         assert(std::is_permutation(forward_iterator<const int*>(ia),
    548                                    forward_iterator<const int*>(ia + sa),
    549                                    forward_iterator<const int*>(ib),
    550                                    std::equal_to<const int>()) == false);
    551 #if TEST_STD_VER >= 14
    552         assert(std::is_permutation(forward_iterator<const int*>(ia),
    553                                    forward_iterator<const int*>(ia + sa),
    554                                    forward_iterator<const int*>(ib),
    555                                    forward_iterator<const int*>(ib + sa),
    556                                    std::equal_to<const int>()) == false);
    557 #endif
    558     }
    559     {
    560         const int ia[] = {0, 1, 2};
    561         const int ib[] = {1, 0, 2};
    562         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    563         assert(std::is_permutation(forward_iterator<const int*>(ia),
    564                                    forward_iterator<const int*>(ia + sa),
    565                                    forward_iterator<const int*>(ib),
    566                                    std::equal_to<const int>()) == 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),
    572                                    std::equal_to<const int>()) == true);
    573         assert(std::is_permutation(forward_iterator<const int*>(ia),
    574                                    forward_iterator<const int*>(ia + sa),
    575                                    forward_iterator<const int*>(ib),
    576                                    forward_iterator<const int*>(ib + sa - 1),
    577                                    std::equal_to<const int>()) == false);
    578 #endif
    579     }
    580     {
    581         const int ia[] = {0, 1, 2};
    582         const int ib[] = {1, 2, 0};
    583         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    584         assert(std::is_permutation(forward_iterator<const int*>(ia),
    585                                    forward_iterator<const int*>(ia + sa),
    586                                    forward_iterator<const int*>(ib),
    587                                    std::equal_to<const int>()) == true);
    588 #if TEST_STD_VER >= 14
    589         assert(std::is_permutation(forward_iterator<const int*>(ia),
    590                                    forward_iterator<const int*>(ia + sa),
    591                                    forward_iterator<const int*>(ib),
    592                                    forward_iterator<const int*>(ib + sa),
    593                                    std::equal_to<const int>()) == true);
    594         assert(std::is_permutation(forward_iterator<const int*>(ia),
    595                                    forward_iterator<const int*>(ia + sa),
    596                                    forward_iterator<const int*>(ib),
    597                                    forward_iterator<const int*>(ib + sa - 1),
    598                                    std::equal_to<const int>()) == false);
    599 #endif
    600     }
    601     {
    602         const int ia[] = {0, 1, 2};
    603         const int ib[] = {2, 1, 0};
    604         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    605         assert(std::is_permutation(forward_iterator<const int*>(ia),
    606                                    forward_iterator<const int*>(ia + sa),
    607                                    forward_iterator<const int*>(ib),
    608                                    std::equal_to<const int>()) == true);
    609 #if TEST_STD_VER >= 14
    610         assert(std::is_permutation(forward_iterator<const int*>(ia),
    611                                    forward_iterator<const int*>(ia + sa),
    612                                    forward_iterator<const int*>(ib),
    613                                    forward_iterator<const int*>(ib + sa),
    614                                    std::equal_to<const int>()) == true);
    615         assert(std::is_permutation(forward_iterator<const int*>(ia),
    616                                    forward_iterator<const int*>(ia + sa),
    617                                    forward_iterator<const int*>(ib),
    618                                    forward_iterator<const int*>(ib + sa - 1),
    619                                    std::equal_to<const int>()) == false);
    620 #endif
    621     }
    622     {
    623         const int ia[] = {0, 1, 2};
    624         const int ib[] = {2, 0, 1};
    625         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    626         assert(std::is_permutation(forward_iterator<const int*>(ia),
    627                                    forward_iterator<const int*>(ia + sa),
    628                                    forward_iterator<const int*>(ib),
    629                                    std::equal_to<const int>()) == true);
    630 #if TEST_STD_VER >= 14
    631         assert(std::is_permutation(forward_iterator<const int*>(ia),
    632                                    forward_iterator<const int*>(ia + sa),
    633                                    forward_iterator<const int*>(ib),
    634                                    forward_iterator<const int*>(ib + sa),
    635                                    std::equal_to<const int>()) == true);
    636         assert(std::is_permutation(forward_iterator<const int*>(ia),
    637                                    forward_iterator<const int*>(ia + sa),
    638                                    forward_iterator<const int*>(ib),
    639                                    forward_iterator<const int*>(ib + sa - 1),
    640                                    std::equal_to<const int>()) == false);
    641 #endif
    642     }
    643     {
    644         const int ia[] = {0, 0, 1};
    645         const int ib[] = {1, 0, 1};
    646         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    647         assert(std::is_permutation(forward_iterator<const int*>(ia),
    648                                    forward_iterator<const int*>(ia + sa),
    649                                    forward_iterator<const int*>(ib),
    650                                    std::equal_to<const int>()) == false);
    651 #if TEST_STD_VER >= 14
    652         assert(std::is_permutation(forward_iterator<const int*>(ia),
    653                                    forward_iterator<const int*>(ia + sa),
    654                                    forward_iterator<const int*>(ib),
    655                                    forward_iterator<const int*>(ib + sa),
    656                                    std::equal_to<const int>()) == false);
    657 #endif
    658     }
    659     {
    660         const int ia[] = {0, 0, 1};
    661         const int ib[] = {1, 0, 0};
    662         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    663         assert(std::is_permutation(forward_iterator<const int*>(ia),
    664                                    forward_iterator<const int*>(ia + sa),
    665                                    forward_iterator<const int*>(ib),
    666                                    std::equal_to<const int>()) == true);
    667 #if TEST_STD_VER >= 14
    668         assert(std::is_permutation(forward_iterator<const int*>(ia),
    669                                    forward_iterator<const int*>(ia + sa),
    670                                    forward_iterator<const int*>(ib),
    671                                    forward_iterator<const int*>(ib + sa),
    672                                    std::equal_to<const int>()) == true);
    673         assert(std::is_permutation(forward_iterator<const int*>(ia),
    674                                    forward_iterator<const int*>(ia + sa),
    675                                    forward_iterator<const int*>(ib + 1),
    676                                    forward_iterator<const int*>(ib + sa),
    677                                    std::equal_to<const int>()) == false);
    678         assert(std::is_permutation(forward_iterator<const int*>(ia),
    679                                    forward_iterator<const int*>(ia + sa),
    680                                    forward_iterator<const int*>(ib),
    681                                    forward_iterator<const int*>(ib + sa - 1),
    682                                    std::equal_to<const int>()) == false);
    683 #endif
    684     }
    685     {
    686         const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
    687         const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 2};
    688         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    689         assert(std::is_permutation(forward_iterator<const int*>(ia),
    690                                    forward_iterator<const int*>(ia + sa),
    691                                    forward_iterator<const int*>(ib),
    692                                    std::equal_to<const int>()) == true);
    693 #if TEST_STD_VER >= 14
    694         assert(std::is_permutation(forward_iterator<const int*>(ia),
    695                                    forward_iterator<const int*>(ia + sa),
    696                                    forward_iterator<const int*>(ib),
    697                                    forward_iterator<const int*>(ib + sa),
    698                                    std::equal_to<const int>()) == true);
    699         assert(std::is_permutation(forward_iterator<const int*>(ia),
    700                                    forward_iterator<const int*>(ia + sa),
    701                                    forward_iterator<const int*>(ib + 1),
    702                                    forward_iterator<const int*>(ib + sa),
    703                                    std::equal_to<const int>()) == false);
    704         assert(std::is_permutation(forward_iterator<const int*>(ia),
    705                                    forward_iterator<const int*>(ia + sa),
    706                                    forward_iterator<const int*>(ib),
    707                                    forward_iterator<const int*>(ib + sa - 1),
    708                                    std::equal_to<const int>()) == false);
    709         comparison_count = 0;
    710         assert(std::is_permutation(forward_iterator<const int*>(ia),
    711                                    forward_iterator<const int*>(ia + sa),
    712                                    forward_iterator<const int*>(ib),
    713                                    forward_iterator<const int*>(ib + sa - 1),
    714                                    counting_equals<const int>) == false);
    715         assert ( comparison_count > 0 );
    716         comparison_count = 0;
    717         assert(std::is_permutation(random_access_iterator<const int*>(ia),
    718                                    random_access_iterator<const int*>(ia + sa),
    719                                    random_access_iterator<const int*>(ib),
    720                                    random_access_iterator<const int*>(ib + sa - 1),
    721                                    counting_equals<const int>) == false);
    722         assert ( comparison_count == 0 );
    723 #endif
    724     }
    725     {
    726         const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
    727         const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 0};
    728         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    729         assert(std::is_permutation(forward_iterator<const int*>(ia),
    730                                    forward_iterator<const int*>(ia + sa),
    731                                    forward_iterator<const int*>(ib),
    732                                    std::equal_to<const int>()) == false);
    733 #if TEST_STD_VER >= 14
    734         assert(std::is_permutation(forward_iterator<const int*>(ia),
    735                                    forward_iterator<const int*>(ia + sa),
    736                                    forward_iterator<const int*>(ib),
    737                                    forward_iterator<const int*>(ib + sa),
    738                                    std::equal_to<const int>()) == false);
    739 #endif
    740     }
    741     {
    742       struct S {
    743           S(int i) : i_(i) {}
    744           bool operator==(const S& other) = delete;
    745           int i_;
    746       };
    747       struct eq {
    748           bool operator()(const S& a, const S&b) { return a.i_ == b.i_; }
    749       };
    750       const S a[] = {S(0), S(1)};
    751       const S b[] = {S(1), S(0)};
    752       const unsigned sa = sizeof(a)/sizeof(a[0]);
    753       assert(std::is_permutation(forward_iterator<const S*>(a),
    754                                  forward_iterator<const S*>(a + sa),
    755                                  forward_iterator<const S*>(b),
    756                                  eq()));
    757 #if TEST_STD_VER >= 14
    758       assert(std::is_permutation(forward_iterator<const S*>(a),
    759                                  forward_iterator<const S*>(a + sa),
    760                                  forward_iterator<const S*>(b),
    761                                  forward_iterator<const S*>(b + sa),
    762                                  eq()));
    763 #endif
    764     }
    765 
    766 #if TEST_STD_VER > 17
    767     static_assert(test_constexpr());
    768 #endif
    769 }
    770