brintos

brintos / llvm-project-archived public Read only

0
0
Text · 30.3 KiB · 2a2c796 Raw
624 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// <algorithm>10 11// template<class ForwardIterator1, class ForwardIterator2>12//   constexpr bool   // constexpr after C++1713//   is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,14//                  ForwardIterator2 first2);15 16#include <algorithm>17#include <cassert>18 19#include "test_iterators.h"20 21#include "test_macros.h"22 23#if TEST_STD_VER > 1724TEST_CONSTEXPR bool test_constexpr() {25    int ia[] = {0, 0, 0};26    int ib[] = {1, 1, 0};27    int ic[] = {1, 0, 1};28    int id[] = {1};29    return !std::is_permutation(std::begin(ia), std::end(ia), std::begin(ib))30        && !std::is_permutation(std::begin(ia), std::end(ia), std::begin(ib), std::end(ib))31        &&  std::is_permutation(std::begin(ib), std::end(ib), std::begin(ic))32        &&  std::is_permutation(std::begin(ib), std::end(ib), std::begin(ic), std::end(ic))33        && !std::is_permutation(std::begin(ic), std::end(ic), std::begin(id), std::end(id))34        ;35    }36#endif37 38int main(int, char**)39{40    {41        const int ia[] = {0};42        const int ib[] = {0};43        const unsigned sa = sizeof(ia)/sizeof(ia[0]);44        assert(std::is_permutation(forward_iterator<const int*>(ia),45                                   forward_iterator<const int*>(ia + 0),46                                   forward_iterator<const int*>(ib)) == true);47#if TEST_STD_VER >= 1448        assert(std::is_permutation(forward_iterator<const int*>(ia),49                                   forward_iterator<const int*>(ia + 0),50                                   forward_iterator<const int*>(ib),51                                   forward_iterator<const int*>(ib + 0)) == true);52#endif53        assert(std::is_permutation(forward_iterator<const int*>(ia),54                                   forward_iterator<const int*>(ia + sa),55                                   forward_iterator<const int*>(ib)) == true);56#if TEST_STD_VER >= 1457        assert(std::is_permutation(forward_iterator<const int*>(ia),58                                   forward_iterator<const int*>(ia + sa),59                                   forward_iterator<const int*>(ib),60                                   forward_iterator<const int*>(ib + sa)) == true);61        assert(std::is_permutation(forward_iterator<const int*>(ia),62                                   forward_iterator<const int*>(ia + sa),63                                   forward_iterator<const int*>(ib),64                                   forward_iterator<const int*>(ib + sa - 1)) == false);65#endif66    }67    {68        const int ia[] = {0};69        const int ib[] = {1};70        const unsigned sa = sizeof(ia)/sizeof(ia[0]);71        assert(std::is_permutation(forward_iterator<const int*>(ia),72                                   forward_iterator<const int*>(ia + sa),73                                   forward_iterator<const int*>(ib)) == false);74#if TEST_STD_VER >= 1475        assert(std::is_permutation(forward_iterator<const int*>(ia),76                                   forward_iterator<const int*>(ia + sa),77                                   forward_iterator<const int*>(ib),78                                   forward_iterator<const int*>(ib + sa)) == false);79#endif80    }81 82    {83        const int ia[] = {0, 0};84        const int ib[] = {0, 0};85        const unsigned sa = sizeof(ia)/sizeof(ia[0]);86        assert(std::is_permutation(forward_iterator<const int*>(ia),87                                   forward_iterator<const int*>(ia + sa),88                                   forward_iterator<const int*>(ib)) == true);89#if TEST_STD_VER >= 1490        assert(std::is_permutation(forward_iterator<const int*>(ia),91                                   forward_iterator<const int*>(ia + sa),92                                   forward_iterator<const int*>(ib),93                                   forward_iterator<const int*>(ib + sa)) == true);94        assert(std::is_permutation(forward_iterator<const int*>(ia),95                                   forward_iterator<const int*>(ia + sa),96                                   forward_iterator<const int*>(ib),97                                   forward_iterator<const int*>(ib + sa - 1)) == false);98#endif99    }100    {101        const int ia[] = {0, 0};102        const int ib[] = {0, 1};103        const unsigned sa = sizeof(ia)/sizeof(ia[0]);104        assert(std::is_permutation(forward_iterator<const int*>(ia),105                                   forward_iterator<const int*>(ia + sa),106                                   forward_iterator<const int*>(ib)) == false);107#if TEST_STD_VER >= 14108        assert(std::is_permutation(forward_iterator<const int*>(ia),109                                   forward_iterator<const int*>(ia + sa),110                                   forward_iterator<const int*>(ib),111                                   forward_iterator<const int*>(ib + sa)) == false);112#endif113    }114    {115        const int ia[] = {0, 0};116        const int ib[] = {1, 0};117        const unsigned sa = sizeof(ia)/sizeof(ia[0]);118        assert(std::is_permutation(forward_iterator<const int*>(ia),119                                   forward_iterator<const int*>(ia + sa),120                                   forward_iterator<const int*>(ib)) == false);121#if TEST_STD_VER >= 14122        assert(std::is_permutation(forward_iterator<const int*>(ia),123                                   forward_iterator<const int*>(ia + sa),124                                   forward_iterator<const int*>(ib),125                                   forward_iterator<const int*>(ib + sa)) == false);126#endif127    }128    {129        const int ia[] = {0, 0};130        const int ib[] = {1, 1};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)) == false);135#if TEST_STD_VER >= 14136        assert(std::is_permutation(forward_iterator<const int*>(ia),137                                   forward_iterator<const int*>(ia + sa),138                                   forward_iterator<const int*>(ib),139                                   forward_iterator<const int*>(ib + sa)) == false);140#endif141    }142    {143        const int ia[] = {0, 1};144        const int ib[] = {0, 0};145        const unsigned sa = sizeof(ia)/sizeof(ia[0]);146        assert(std::is_permutation(forward_iterator<const int*>(ia),147                                   forward_iterator<const int*>(ia + sa),148                                   forward_iterator<const int*>(ib)) == false);149#if TEST_STD_VER >= 14150        assert(std::is_permutation(forward_iterator<const int*>(ia),151                                   forward_iterator<const int*>(ia + sa),152                                   forward_iterator<const int*>(ib),153                                   forward_iterator<const int*>(ib + sa)) == false);154#endif155    }156    {157        const int ia[] = {0, 1};158        const int ib[] = {0, 1};159        const unsigned sa = sizeof(ia)/sizeof(ia[0]);160        assert(std::is_permutation(forward_iterator<const int*>(ia),161                                   forward_iterator<const int*>(ia + sa),162                                   forward_iterator<const int*>(ib)) == true);163#if TEST_STD_VER >= 14164        assert(std::is_permutation(forward_iterator<const int*>(ia),165                                   forward_iterator<const int*>(ia + sa),166                                   forward_iterator<const int*>(ib),167                                   forward_iterator<const int*>(ib + sa)) == true);168        assert(std::is_permutation(forward_iterator<const int*>(ia),169                                   forward_iterator<const int*>(ia + sa),170                                   forward_iterator<const int*>(ib),171                                   forward_iterator<const int*>(ib + sa - 1)) == false);172#endif173    }174    {175        const int ia[] = {0, 1};176        const int ib[] = {1, 0};177        const unsigned sa = sizeof(ia)/sizeof(ia[0]);178        assert(std::is_permutation(forward_iterator<const int*>(ia),179                                   forward_iterator<const int*>(ia + sa),180                                   forward_iterator<const int*>(ib)) == true);181#if TEST_STD_VER >= 14182        assert(std::is_permutation(forward_iterator<const int*>(ia),183                                   forward_iterator<const int*>(ia + sa),184                                   forward_iterator<const int*>(ib),185                                   forward_iterator<const int*>(ib + sa)) == true);186#endif187    }188    {189        const int ia[] = {0, 1};190        const int ib[] = {1, 1};191        const unsigned sa = sizeof(ia)/sizeof(ia[0]);192        assert(std::is_permutation(forward_iterator<const int*>(ia),193                                   forward_iterator<const int*>(ia + sa),194                                   forward_iterator<const int*>(ib)) == false);195#if TEST_STD_VER >= 14196        assert(std::is_permutation(forward_iterator<const int*>(ia),197                                   forward_iterator<const int*>(ia + sa),198                                   forward_iterator<const int*>(ib),199                                   forward_iterator<const int*>(ib + sa)) == false);200#endif201    }202    {203        const int ia[] = {1, 0};204        const int ib[] = {0, 0};205        const unsigned sa = sizeof(ia)/sizeof(ia[0]);206        assert(std::is_permutation(forward_iterator<const int*>(ia),207                                   forward_iterator<const int*>(ia + sa),208                                   forward_iterator<const int*>(ib)) == false);209#if TEST_STD_VER >= 14210        assert(std::is_permutation(forward_iterator<const int*>(ia),211                                   forward_iterator<const int*>(ia + sa),212                                   forward_iterator<const int*>(ib),213                                   forward_iterator<const int*>(ib + sa)) == false);214#endif215    }216    {217        const int ia[] = {1, 0};218        const int ib[] = {0, 1};219        const unsigned sa = sizeof(ia)/sizeof(ia[0]);220        assert(std::is_permutation(forward_iterator<const int*>(ia),221                                   forward_iterator<const int*>(ia + sa),222                                   forward_iterator<const int*>(ib)) == true);223#if TEST_STD_VER >= 14224        assert(std::is_permutation(forward_iterator<const int*>(ia),225                                   forward_iterator<const int*>(ia + sa),226                                   forward_iterator<const int*>(ib),227                                   forward_iterator<const int*>(ib + sa)) == true);228#endif229    }230    {231        const int ia[] = {1, 0};232        const int ib[] = {1, 0};233        const unsigned sa = sizeof(ia)/sizeof(ia[0]);234        assert(std::is_permutation(forward_iterator<const int*>(ia),235                                   forward_iterator<const int*>(ia + sa),236                                   forward_iterator<const int*>(ib)) == true);237#if TEST_STD_VER >= 14238        assert(std::is_permutation(forward_iterator<const int*>(ia),239                                   forward_iterator<const int*>(ia + sa),240                                   forward_iterator<const int*>(ib),241                                   forward_iterator<const int*>(ib + sa)) == true);242#endif243    }244    {245        const int ia[] = {1, 0};246        const int ib[] = {1, 1};247        const unsigned sa = sizeof(ia)/sizeof(ia[0]);248        assert(std::is_permutation(forward_iterator<const int*>(ia),249                                   forward_iterator<const int*>(ia + sa),250                                   forward_iterator<const int*>(ib)) == false);251#if TEST_STD_VER >= 14252        assert(std::is_permutation(forward_iterator<const int*>(ia),253                                   forward_iterator<const int*>(ia + sa),254                                   forward_iterator<const int*>(ib),255                                   forward_iterator<const int*>(ib + sa)) == false);256#endif257    }258    {259        const int ia[] = {1, 1};260        const int ib[] = {0, 0};261        const unsigned sa = sizeof(ia)/sizeof(ia[0]);262        assert(std::is_permutation(forward_iterator<const int*>(ia),263                                   forward_iterator<const int*>(ia + sa),264                                   forward_iterator<const int*>(ib)) == false);265#if TEST_STD_VER >= 14266        assert(std::is_permutation(forward_iterator<const int*>(ia),267                                   forward_iterator<const int*>(ia + sa),268                                   forward_iterator<const int*>(ib),269                                   forward_iterator<const int*>(ib + sa)) == false);270#endif271    }272    {273        const int ia[] = {1, 1};274        const int ib[] = {0, 1};275        const unsigned sa = sizeof(ia)/sizeof(ia[0]);276        assert(std::is_permutation(forward_iterator<const int*>(ia),277                                   forward_iterator<const int*>(ia + sa),278                                   forward_iterator<const int*>(ib)) == false);279#if TEST_STD_VER >= 14280        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)) == false);284#endif285    }286    {287        const int ia[] = {1, 1};288        const int ib[] = {1, 0};289        const unsigned sa = sizeof(ia)/sizeof(ia[0]);290        assert(std::is_permutation(forward_iterator<const int*>(ia),291                                   forward_iterator<const int*>(ia + sa),292                                   forward_iterator<const int*>(ib)) == false);293#if TEST_STD_VER >= 14294        assert(std::is_permutation(forward_iterator<const int*>(ia),295                                   forward_iterator<const int*>(ia + sa),296                                   forward_iterator<const int*>(ib),297                                   forward_iterator<const int*>(ib + sa)) == false);298#endif299    }300    {301        const int ia[] = {1, 1};302        const int ib[] = {1, 1};303        const unsigned sa = sizeof(ia)/sizeof(ia[0]);304        assert(std::is_permutation(forward_iterator<const int*>(ia),305                                   forward_iterator<const int*>(ia + sa),306                                   forward_iterator<const int*>(ib)) == true);307#if TEST_STD_VER >= 14308        assert(std::is_permutation(forward_iterator<const int*>(ia),309                                   forward_iterator<const int*>(ia + sa),310                                   forward_iterator<const int*>(ib),311                                   forward_iterator<const int*>(ib + sa)) == true);312#endif313    }314 315    {316        const int ia[] = {0, 0, 0};317        const int ib[] = {1, 0, 0};318        const unsigned sa = sizeof(ia)/sizeof(ia[0]);319        assert(std::is_permutation(forward_iterator<const int*>(ia),320                                   forward_iterator<const int*>(ia + sa),321                                   forward_iterator<const int*>(ib)) == false);322#if TEST_STD_VER >= 14323        assert(std::is_permutation(forward_iterator<const int*>(ia),324                                   forward_iterator<const int*>(ia + sa),325                                   forward_iterator<const int*>(ib),326                                   forward_iterator<const int*>(ib + sa)) == false);327#endif328    }329    {330        const int ia[] = {0, 0, 0};331        const int ib[] = {1, 0, 1};332        const unsigned sa = sizeof(ia)/sizeof(ia[0]);333        assert(std::is_permutation(forward_iterator<const int*>(ia),334                                   forward_iterator<const int*>(ia + sa),335                                   forward_iterator<const int*>(ib)) == false);336#if TEST_STD_VER >= 14337        assert(std::is_permutation(forward_iterator<const int*>(ia),338                                   forward_iterator<const int*>(ia + sa),339                                   forward_iterator<const int*>(ib),340                                   forward_iterator<const int*>(ib + sa)) == false);341#endif342    }343    {344        const int ia[] = {0, 0, 0};345        const int ib[] = {1, 0, 2};346        const unsigned sa = sizeof(ia)/sizeof(ia[0]);347        assert(std::is_permutation(forward_iterator<const int*>(ia),348                                   forward_iterator<const int*>(ia + sa),349                                   forward_iterator<const int*>(ib)) == false);350#if TEST_STD_VER >= 14351        assert(std::is_permutation(forward_iterator<const int*>(ia),352                                   forward_iterator<const int*>(ia + sa),353                                   forward_iterator<const int*>(ib),354                                   forward_iterator<const int*>(ib + sa)) == false);355#endif356    }357    {358        const int ia[] = {0, 0, 0};359        const int ib[] = {1, 1, 0};360        const unsigned sa = sizeof(ia)/sizeof(ia[0]);361        assert(std::is_permutation(forward_iterator<const int*>(ia),362                                   forward_iterator<const int*>(ia + sa),363                                   forward_iterator<const int*>(ib)) == false);364#if TEST_STD_VER >= 14365        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)) == false);369#endif370    }371    {372        const int ia[] = {0, 0, 0};373        const int ib[] = {1, 1, 1};374        const unsigned sa = sizeof(ia)/sizeof(ia[0]);375        assert(std::is_permutation(forward_iterator<const int*>(ia),376                                   forward_iterator<const int*>(ia + sa),377                                   forward_iterator<const int*>(ib)) == false);378#if TEST_STD_VER >= 14379        assert(std::is_permutation(forward_iterator<const int*>(ia),380                                   forward_iterator<const int*>(ia + sa),381                                   forward_iterator<const int*>(ib),382                                   forward_iterator<const int*>(ib + sa)) == false);383#endif384    }385    {386        const int ia[] = {0, 0, 0};387        const int ib[] = {1, 1, 2};388        const unsigned sa = sizeof(ia)/sizeof(ia[0]);389        assert(std::is_permutation(forward_iterator<const int*>(ia),390                                   forward_iterator<const int*>(ia + sa),391                                   forward_iterator<const int*>(ib)) == false);392#if TEST_STD_VER >= 14393        assert(std::is_permutation(forward_iterator<const int*>(ia),394                                   forward_iterator<const int*>(ia + sa),395                                   forward_iterator<const int*>(ib),396                                   forward_iterator<const int*>(ib + sa)) == false);397#endif398    }399    {400        const int ia[] = {0, 0, 0};401        const int ib[] = {1, 2, 0};402        const unsigned sa = sizeof(ia)/sizeof(ia[0]);403        assert(std::is_permutation(forward_iterator<const int*>(ia),404                                   forward_iterator<const int*>(ia + sa),405                                   forward_iterator<const int*>(ib)) == false);406#if TEST_STD_VER >= 14407        assert(std::is_permutation(forward_iterator<const int*>(ia),408                                   forward_iterator<const int*>(ia + sa),409                                   forward_iterator<const int*>(ib),410                                   forward_iterator<const int*>(ib + sa)) == false);411#endif412    }413    {414        const int ia[] = {0, 0, 0};415        const int ib[] = {1, 2, 1};416        const unsigned sa = sizeof(ia)/sizeof(ia[0]);417        assert(std::is_permutation(forward_iterator<const int*>(ia),418                                   forward_iterator<const int*>(ia + sa),419                                   forward_iterator<const int*>(ib)) == false);420#if TEST_STD_VER >= 14421        assert(std::is_permutation(forward_iterator<const int*>(ia),422                                   forward_iterator<const int*>(ia + sa),423                                   forward_iterator<const int*>(ib),424                                   forward_iterator<const int*>(ib + sa)) == false);425#endif426    }427    {428        const int ia[] = {0, 0, 0};429        const int ib[] = {1, 2, 2};430        const unsigned sa = sizeof(ia)/sizeof(ia[0]);431        assert(std::is_permutation(forward_iterator<const int*>(ia),432                                   forward_iterator<const int*>(ia + sa),433                                   forward_iterator<const int*>(ib)) == false);434#if TEST_STD_VER >= 14435        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)) == false);439#endif440    }441    {442        const int ia[] = {0, 0, 1};443        const int ib[] = {1, 0, 0};444        const unsigned sa = sizeof(ia)/sizeof(ia[0]);445        assert(std::is_permutation(forward_iterator<const int*>(ia),446                                   forward_iterator<const int*>(ia + sa),447                                   forward_iterator<const int*>(ib)) == true);448#if TEST_STD_VER >= 14449        assert(std::is_permutation(forward_iterator<const int*>(ia),450                                   forward_iterator<const int*>(ia + sa),451                                   forward_iterator<const int*>(ib),452                                   forward_iterator<const int*>(ib + sa)) == true);453        assert(std::is_permutation(forward_iterator<const int*>(ia),454                                   forward_iterator<const int*>(ia + sa),455                                   forward_iterator<const int*>(ib),456                                   forward_iterator<const int*>(ib + sa - 1)) == false);457#endif458    }459    {460        const int ia[] = {0, 0, 1};461        const int ib[] = {1, 0, 1};462        const unsigned sa = sizeof(ia)/sizeof(ia[0]);463        assert(std::is_permutation(forward_iterator<const int*>(ia),464                                   forward_iterator<const int*>(ia + sa),465                                   forward_iterator<const int*>(ib)) == false);466#if TEST_STD_VER >= 14467        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)) == false);471#endif472    }473    {474        const int ia[] = {0, 1, 2};475        const int ib[] = {1, 0, 2};476        const unsigned sa = sizeof(ia)/sizeof(ia[0]);477        assert(std::is_permutation(forward_iterator<const int*>(ia),478                                   forward_iterator<const int*>(ia + sa),479                                   forward_iterator<const int*>(ib)) == true);480#if TEST_STD_VER >= 14481        assert(std::is_permutation(forward_iterator<const int*>(ia),482                                   forward_iterator<const int*>(ia + sa),483                                   forward_iterator<const int*>(ib),484                                   forward_iterator<const int*>(ib + sa)) == true);485        assert(std::is_permutation(forward_iterator<const int*>(ia),486                                   forward_iterator<const int*>(ia + sa),487                                   forward_iterator<const int*>(ib),488                                   forward_iterator<const int*>(ib + sa - 1)) == false);489#endif490    }491    {492        const int ia[] = {0, 1, 2};493        const int ib[] = {1, 2, 0};494        const unsigned sa = sizeof(ia)/sizeof(ia[0]);495        assert(std::is_permutation(forward_iterator<const int*>(ia),496                                   forward_iterator<const int*>(ia + sa),497                                   forward_iterator<const int*>(ib)) == true);498#if TEST_STD_VER >= 14499        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)) == true);503        assert(std::is_permutation(forward_iterator<const int*>(ia),504                                   forward_iterator<const int*>(ia + sa),505                                   forward_iterator<const int*>(ib),506                                   forward_iterator<const int*>(ib + sa - 1)) == false);507#endif508    }509    {510        const int ia[] = {0, 1, 2};511        const int ib[] = {2, 1, 0};512        const unsigned sa = sizeof(ia)/sizeof(ia[0]);513        assert(std::is_permutation(forward_iterator<const int*>(ia),514                                   forward_iterator<const int*>(ia + sa),515                                   forward_iterator<const int*>(ib)) == true);516#if TEST_STD_VER >= 14517        assert(std::is_permutation(forward_iterator<const int*>(ia),518                                   forward_iterator<const int*>(ia + sa),519                                   forward_iterator<const int*>(ib),520                                   forward_iterator<const int*>(ib + sa)) == true);521        assert(std::is_permutation(forward_iterator<const int*>(ia),522                                   forward_iterator<const int*>(ia + sa),523                                   forward_iterator<const int*>(ib),524                                   forward_iterator<const int*>(ib + sa - 1)) == false);525#endif526    }527    {528        const int ia[] = {0, 1, 2};529        const int ib[] = {2, 0, 1};530        const unsigned sa = sizeof(ia)/sizeof(ia[0]);531        assert(std::is_permutation(forward_iterator<const int*>(ia),532                                   forward_iterator<const int*>(ia + sa),533                                   forward_iterator<const int*>(ib)) == true);534#if TEST_STD_VER >= 14535        assert(std::is_permutation(forward_iterator<const int*>(ia),536                                   forward_iterator<const int*>(ia + sa),537                                   forward_iterator<const int*>(ib),538                                   forward_iterator<const int*>(ib + sa)) == true);539        assert(std::is_permutation(forward_iterator<const int*>(ia),540                                   forward_iterator<const int*>(ia + sa),541                                   forward_iterator<const int*>(ib),542                                   forward_iterator<const int*>(ib + sa - 1)) == false);543#endif544    }545    {546        const int ia[] = {0, 0, 1};547        const int ib[] = {1, 0, 1};548        const unsigned sa = sizeof(ia)/sizeof(ia[0]);549        assert(std::is_permutation(forward_iterator<const int*>(ia),550                                   forward_iterator<const int*>(ia + sa),551                                   forward_iterator<const int*>(ib)) == false);552#if TEST_STD_VER >= 14553        assert(std::is_permutation(forward_iterator<const int*>(ia),554                                   forward_iterator<const int*>(ia + sa),555                                   forward_iterator<const int*>(ib),556                                   forward_iterator<const int*>(ib + sa)) == false);557#endif558    }559    {560        const int ia[] = {0, 0, 1};561        const int ib[] = {1, 0, 0};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)) == true);566#if TEST_STD_VER >= 14567        assert(std::is_permutation(forward_iterator<const int*>(ia),568                                   forward_iterator<const int*>(ia + sa),569                                   forward_iterator<const int*>(ib),570                                   forward_iterator<const int*>(ib + sa)) == true);571        assert(std::is_permutation(forward_iterator<const int*>(ia),572                                   forward_iterator<const int*>(ia + sa),573                                   forward_iterator<const int*>(ib + 1),574                                   forward_iterator<const int*>(ib + sa)) == false);575        assert(std::is_permutation(forward_iterator<const int*>(ia),576                                   forward_iterator<const int*>(ia + sa),577                                   forward_iterator<const int*>(ib),578                                   forward_iterator<const int*>(ib + sa - 1)) == false);579#endif580    }581    {582        const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};583        const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 2};584        const unsigned sa = sizeof(ia)/sizeof(ia[0]);585        assert(std::is_permutation(forward_iterator<const int*>(ia),586                                   forward_iterator<const int*>(ia + sa),587                                   forward_iterator<const int*>(ib)) == true);588#if TEST_STD_VER >= 14589        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)) == true);593        assert(std::is_permutation(forward_iterator<const int*>(ia),594                                   forward_iterator<const int*>(ia + sa),595                                   forward_iterator<const int*>(ib + 1 ),596                                   forward_iterator<const int*>(ib + sa)) == false);597        assert(std::is_permutation(forward_iterator<const int*>(ia),598                                   forward_iterator<const int*>(ia + sa),599                                   forward_iterator<const int*>(ib),600                                   forward_iterator<const int*>(ib + sa - 1)) == false);601#endif602    }603    {604        const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};605        const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 0};606        const unsigned sa = sizeof(ia)/sizeof(ia[0]);607        assert(std::is_permutation(forward_iterator<const int*>(ia),608                                   forward_iterator<const int*>(ia + sa),609                                   forward_iterator<const int*>(ib)) == false);610#if TEST_STD_VER >= 14611        assert(std::is_permutation(forward_iterator<const int*>(ia),612                                   forward_iterator<const int*>(ia + sa),613                                   forward_iterator<const int*>(ib),614                                   forward_iterator<const int*>(ib + sa)) == false);615#endif616    }617 618#if TEST_STD_VER > 17619    static_assert(test_constexpr());620#endif621 622  return 0;623}624