15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier
95a83710eSEric Fiselier // <algorithm>
105a83710eSEric Fiselier
115a83710eSEric Fiselier // template<class ForwardIterator1, class ForwardIterator2>
1249c7643cSMarshall Clow // constexpr bool // constexpr after C++17
135a83710eSEric Fiselier // is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
145a83710eSEric Fiselier // ForwardIterator2 first2);
155a83710eSEric Fiselier
165a83710eSEric Fiselier #include <algorithm>
175a83710eSEric Fiselier #include <cassert>
185a83710eSEric Fiselier
195a83710eSEric Fiselier #include "test_iterators.h"
205a83710eSEric Fiselier
21e58baed3SEric Fiselier #include "test_macros.h"
225a83710eSEric Fiselier
2349c7643cSMarshall Clow #if TEST_STD_VER > 17
test_constexpr()24404ee020SMarshall Clow TEST_CONSTEXPR bool test_constexpr() {
2549c7643cSMarshall Clow int ia[] = {0, 0, 0};
2649c7643cSMarshall Clow int ib[] = {1, 1, 0};
2749c7643cSMarshall Clow int ic[] = {1, 0, 1};
2849c7643cSMarshall Clow int id[] = {1};
2949c7643cSMarshall Clow return !std::is_permutation(std::begin(ia), std::end(ia), std::begin(ib))
3049c7643cSMarshall Clow && !std::is_permutation(std::begin(ia), std::end(ia), std::begin(ib), std::end(ib))
3149c7643cSMarshall Clow && std::is_permutation(std::begin(ib), std::end(ib), std::begin(ic))
3249c7643cSMarshall Clow && std::is_permutation(std::begin(ib), std::end(ib), std::begin(ic), std::end(ic))
3349c7643cSMarshall Clow && !std::is_permutation(std::begin(ic), std::end(ic), std::begin(id), std::end(id))
3449c7643cSMarshall Clow ;
3549c7643cSMarshall Clow }
3649c7643cSMarshall Clow #endif
3749c7643cSMarshall Clow
main(int,char **)38*2df59c50SJF Bastien int main(int, char**)
395a83710eSEric Fiselier {
405a83710eSEric Fiselier {
415a83710eSEric Fiselier const int ia[] = {0};
425a83710eSEric Fiselier const int ib[] = {0};
435a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
445a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
455a83710eSEric Fiselier forward_iterator<const int*>(ia + 0),
465a83710eSEric Fiselier forward_iterator<const int*>(ib)) == true);
47e58baed3SEric Fiselier #if TEST_STD_VER >= 14
485a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
495a83710eSEric Fiselier forward_iterator<const int*>(ia + 0),
505a83710eSEric Fiselier forward_iterator<const int*>(ib),
515a83710eSEric Fiselier forward_iterator<const int*>(ib + 0)) == true);
525a83710eSEric Fiselier #endif
535a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
545a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
555a83710eSEric Fiselier forward_iterator<const int*>(ib)) == true);
56e58baed3SEric Fiselier #if TEST_STD_VER >= 14
575a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
585a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
595a83710eSEric Fiselier forward_iterator<const int*>(ib),
605a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == true);
615a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
625a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
635a83710eSEric Fiselier forward_iterator<const int*>(ib),
645a83710eSEric Fiselier forward_iterator<const int*>(ib + sa - 1)) == false);
655a83710eSEric Fiselier #endif
665a83710eSEric Fiselier }
675a83710eSEric Fiselier {
685a83710eSEric Fiselier const int ia[] = {0};
695a83710eSEric Fiselier const int ib[] = {1};
705a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
715a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
725a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
735a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
74e58baed3SEric Fiselier #if TEST_STD_VER >= 14
755a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
765a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
775a83710eSEric Fiselier forward_iterator<const int*>(ib),
785a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
795a83710eSEric Fiselier #endif
805a83710eSEric Fiselier }
815a83710eSEric Fiselier
825a83710eSEric Fiselier {
835a83710eSEric Fiselier const int ia[] = {0, 0};
845a83710eSEric Fiselier const int ib[] = {0, 0};
855a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
865a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
875a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
885a83710eSEric Fiselier forward_iterator<const int*>(ib)) == true);
89e58baed3SEric Fiselier #if TEST_STD_VER >= 14
905a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
915a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
925a83710eSEric Fiselier forward_iterator<const int*>(ib),
935a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == true);
945a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
955a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
965a83710eSEric Fiselier forward_iterator<const int*>(ib),
975a83710eSEric Fiselier forward_iterator<const int*>(ib + sa - 1)) == false);
985a83710eSEric Fiselier #endif
995a83710eSEric Fiselier }
1005a83710eSEric Fiselier {
1015a83710eSEric Fiselier const int ia[] = {0, 0};
1025a83710eSEric Fiselier const int ib[] = {0, 1};
1035a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
1045a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
1055a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
1065a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
107e58baed3SEric Fiselier #if TEST_STD_VER >= 14
1085a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
1095a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
1105a83710eSEric Fiselier forward_iterator<const int*>(ib),
1115a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
1125a83710eSEric Fiselier #endif
1135a83710eSEric Fiselier }
1145a83710eSEric Fiselier {
1155a83710eSEric Fiselier const int ia[] = {0, 0};
1165a83710eSEric Fiselier const int ib[] = {1, 0};
1175a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
1185a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
1195a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
1205a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
121e58baed3SEric Fiselier #if TEST_STD_VER >= 14
1225a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
1235a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
1245a83710eSEric Fiselier forward_iterator<const int*>(ib),
1255a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
1265a83710eSEric Fiselier #endif
1275a83710eSEric Fiselier }
1285a83710eSEric Fiselier {
1295a83710eSEric Fiselier const int ia[] = {0, 0};
1305a83710eSEric Fiselier const int ib[] = {1, 1};
1315a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
1325a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
1335a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
1345a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
135e58baed3SEric Fiselier #if TEST_STD_VER >= 14
1365a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
1375a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
1385a83710eSEric Fiselier forward_iterator<const int*>(ib),
1395a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
1405a83710eSEric Fiselier #endif
1415a83710eSEric Fiselier }
1425a83710eSEric Fiselier {
1435a83710eSEric Fiselier const int ia[] = {0, 1};
1445a83710eSEric Fiselier const int ib[] = {0, 0};
1455a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
1465a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
1475a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
1485a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
149e58baed3SEric Fiselier #if TEST_STD_VER >= 14
1505a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
1515a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
1525a83710eSEric Fiselier forward_iterator<const int*>(ib),
1535a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
1545a83710eSEric Fiselier #endif
1555a83710eSEric Fiselier }
1565a83710eSEric Fiselier {
1575a83710eSEric Fiselier const int ia[] = {0, 1};
1585a83710eSEric Fiselier const int ib[] = {0, 1};
1595a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
1605a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
1615a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
1625a83710eSEric Fiselier forward_iterator<const int*>(ib)) == true);
163e58baed3SEric Fiselier #if TEST_STD_VER >= 14
1645a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
1655a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
1665a83710eSEric Fiselier forward_iterator<const int*>(ib),
1675a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == true);
1685a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
1695a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
1705a83710eSEric Fiselier forward_iterator<const int*>(ib),
1715a83710eSEric Fiselier forward_iterator<const int*>(ib + sa - 1)) == false);
1725a83710eSEric Fiselier #endif
1735a83710eSEric Fiselier }
1745a83710eSEric Fiselier {
1755a83710eSEric Fiselier const int ia[] = {0, 1};
1765a83710eSEric Fiselier const int ib[] = {1, 0};
1775a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
1785a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
1795a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
1805a83710eSEric Fiselier forward_iterator<const int*>(ib)) == true);
181e58baed3SEric Fiselier #if TEST_STD_VER >= 14
1825a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
1835a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
1845a83710eSEric Fiselier forward_iterator<const int*>(ib),
1855a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == true);
1865a83710eSEric Fiselier #endif
1875a83710eSEric Fiselier }
1885a83710eSEric Fiselier {
1895a83710eSEric Fiselier const int ia[] = {0, 1};
1905a83710eSEric Fiselier const int ib[] = {1, 1};
1915a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
1925a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
1935a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
1945a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
195e58baed3SEric Fiselier #if TEST_STD_VER >= 14
1965a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
1975a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
1985a83710eSEric Fiselier forward_iterator<const int*>(ib),
1995a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
2005a83710eSEric Fiselier #endif
2015a83710eSEric Fiselier }
2025a83710eSEric Fiselier {
2035a83710eSEric Fiselier const int ia[] = {1, 0};
2045a83710eSEric Fiselier const int ib[] = {0, 0};
2055a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
2065a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
2075a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
2085a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
209e58baed3SEric Fiselier #if TEST_STD_VER >= 14
2105a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
2115a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
2125a83710eSEric Fiselier forward_iterator<const int*>(ib),
2135a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
2145a83710eSEric Fiselier #endif
2155a83710eSEric Fiselier }
2165a83710eSEric Fiselier {
2175a83710eSEric Fiselier const int ia[] = {1, 0};
2185a83710eSEric Fiselier const int ib[] = {0, 1};
2195a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
2205a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
2215a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
2225a83710eSEric Fiselier forward_iterator<const int*>(ib)) == true);
223e58baed3SEric Fiselier #if TEST_STD_VER >= 14
2245a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
2255a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
2265a83710eSEric Fiselier forward_iterator<const int*>(ib),
2275a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == true);
2285a83710eSEric Fiselier #endif
2295a83710eSEric Fiselier }
2305a83710eSEric Fiselier {
2315a83710eSEric Fiselier const int ia[] = {1, 0};
2325a83710eSEric Fiselier const int ib[] = {1, 0};
2335a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
2345a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
2355a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
2365a83710eSEric Fiselier forward_iterator<const int*>(ib)) == true);
237e58baed3SEric Fiselier #if TEST_STD_VER >= 14
2385a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
2395a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
2405a83710eSEric Fiselier forward_iterator<const int*>(ib),
2415a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == true);
2425a83710eSEric Fiselier #endif
2435a83710eSEric Fiselier }
2445a83710eSEric Fiselier {
2455a83710eSEric Fiselier const int ia[] = {1, 0};
2465a83710eSEric Fiselier const int ib[] = {1, 1};
2475a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
2485a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
2495a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
2505a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
251e58baed3SEric Fiselier #if TEST_STD_VER >= 14
2525a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
2535a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
2545a83710eSEric Fiselier forward_iterator<const int*>(ib),
2555a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
2565a83710eSEric Fiselier #endif
2575a83710eSEric Fiselier }
2585a83710eSEric Fiselier {
2595a83710eSEric Fiselier const int ia[] = {1, 1};
2605a83710eSEric Fiselier const int ib[] = {0, 0};
2615a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
2625a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
2635a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
2645a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
265e58baed3SEric Fiselier #if TEST_STD_VER >= 14
2665a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
2675a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
2685a83710eSEric Fiselier forward_iterator<const int*>(ib),
2695a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
2705a83710eSEric Fiselier #endif
2715a83710eSEric Fiselier }
2725a83710eSEric Fiselier {
2735a83710eSEric Fiselier const int ia[] = {1, 1};
2745a83710eSEric Fiselier const int ib[] = {0, 1};
2755a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
2765a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
2775a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
2785a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
279e58baed3SEric Fiselier #if TEST_STD_VER >= 14
2805a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
2815a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
2825a83710eSEric Fiselier forward_iterator<const int*>(ib),
2835a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
2845a83710eSEric Fiselier #endif
2855a83710eSEric Fiselier }
2865a83710eSEric Fiselier {
2875a83710eSEric Fiselier const int ia[] = {1, 1};
2885a83710eSEric Fiselier const int ib[] = {1, 0};
2895a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
2905a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
2915a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
2925a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
293e58baed3SEric Fiselier #if TEST_STD_VER >= 14
2945a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
2955a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
2965a83710eSEric Fiselier forward_iterator<const int*>(ib),
2975a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
2985a83710eSEric Fiselier #endif
2995a83710eSEric Fiselier }
3005a83710eSEric Fiselier {
3015a83710eSEric Fiselier const int ia[] = {1, 1};
3025a83710eSEric Fiselier const int ib[] = {1, 1};
3035a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
3045a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
3055a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
3065a83710eSEric Fiselier forward_iterator<const int*>(ib)) == true);
307e58baed3SEric Fiselier #if TEST_STD_VER >= 14
3085a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
3095a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
3105a83710eSEric Fiselier forward_iterator<const int*>(ib),
3115a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == true);
3125a83710eSEric Fiselier #endif
3135a83710eSEric Fiselier }
3145a83710eSEric Fiselier
3155a83710eSEric Fiselier {
3165a83710eSEric Fiselier const int ia[] = {0, 0, 0};
3175a83710eSEric Fiselier const int ib[] = {1, 0, 0};
3185a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
3195a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
3205a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
3215a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
322e58baed3SEric Fiselier #if TEST_STD_VER >= 14
3235a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
3245a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
3255a83710eSEric Fiselier forward_iterator<const int*>(ib),
3265a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
3275a83710eSEric Fiselier #endif
3285a83710eSEric Fiselier }
3295a83710eSEric Fiselier {
3305a83710eSEric Fiselier const int ia[] = {0, 0, 0};
3315a83710eSEric Fiselier const int ib[] = {1, 0, 1};
3325a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
3335a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
3345a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
3355a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
336e58baed3SEric Fiselier #if TEST_STD_VER >= 14
3375a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
3385a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
3395a83710eSEric Fiselier forward_iterator<const int*>(ib),
3405a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
3415a83710eSEric Fiselier #endif
3425a83710eSEric Fiselier }
3435a83710eSEric Fiselier {
3445a83710eSEric Fiselier const int ia[] = {0, 0, 0};
3455a83710eSEric Fiselier const int ib[] = {1, 0, 2};
3465a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
3475a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
3485a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
3495a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
350e58baed3SEric Fiselier #if TEST_STD_VER >= 14
3515a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
3525a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
3535a83710eSEric Fiselier forward_iterator<const int*>(ib),
3545a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
3555a83710eSEric Fiselier #endif
3565a83710eSEric Fiselier }
3575a83710eSEric Fiselier {
3585a83710eSEric Fiselier const int ia[] = {0, 0, 0};
3595a83710eSEric Fiselier const int ib[] = {1, 1, 0};
3605a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
3615a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
3625a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
3635a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
364e58baed3SEric Fiselier #if TEST_STD_VER >= 14
3655a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
3665a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
3675a83710eSEric Fiselier forward_iterator<const int*>(ib),
3685a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
3695a83710eSEric Fiselier #endif
3705a83710eSEric Fiselier }
3715a83710eSEric Fiselier {
3725a83710eSEric Fiselier const int ia[] = {0, 0, 0};
3735a83710eSEric Fiselier const int ib[] = {1, 1, 1};
3745a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
3755a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
3765a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
3775a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
378e58baed3SEric Fiselier #if TEST_STD_VER >= 14
3795a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
3805a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
3815a83710eSEric Fiselier forward_iterator<const int*>(ib),
3825a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
3835a83710eSEric Fiselier #endif
3845a83710eSEric Fiselier }
3855a83710eSEric Fiselier {
3865a83710eSEric Fiselier const int ia[] = {0, 0, 0};
3875a83710eSEric Fiselier const int ib[] = {1, 1, 2};
3885a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
3895a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
3905a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
3915a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
392e58baed3SEric Fiselier #if TEST_STD_VER >= 14
3935a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
3945a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
3955a83710eSEric Fiselier forward_iterator<const int*>(ib),
3965a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
3975a83710eSEric Fiselier #endif
3985a83710eSEric Fiselier }
3995a83710eSEric Fiselier {
4005a83710eSEric Fiselier const int ia[] = {0, 0, 0};
4015a83710eSEric Fiselier const int ib[] = {1, 2, 0};
4025a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
4035a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
4045a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
4055a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
406e58baed3SEric Fiselier #if TEST_STD_VER >= 14
4075a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
4085a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
4095a83710eSEric Fiselier forward_iterator<const int*>(ib),
4105a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
4115a83710eSEric Fiselier #endif
4125a83710eSEric Fiselier }
4135a83710eSEric Fiselier {
4145a83710eSEric Fiselier const int ia[] = {0, 0, 0};
4155a83710eSEric Fiselier const int ib[] = {1, 2, 1};
4165a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
4175a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
4185a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
4195a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
420e58baed3SEric Fiselier #if TEST_STD_VER >= 14
4215a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
4225a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
4235a83710eSEric Fiselier forward_iterator<const int*>(ib),
4245a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
4255a83710eSEric Fiselier #endif
4265a83710eSEric Fiselier }
4275a83710eSEric Fiselier {
4285a83710eSEric Fiselier const int ia[] = {0, 0, 0};
4295a83710eSEric Fiselier const int ib[] = {1, 2, 2};
4305a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
4315a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
4325a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
4335a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
434e58baed3SEric Fiselier #if TEST_STD_VER >= 14
4355a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
4365a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
4375a83710eSEric Fiselier forward_iterator<const int*>(ib),
4385a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
4395a83710eSEric Fiselier #endif
4405a83710eSEric Fiselier }
4415a83710eSEric Fiselier {
4425a83710eSEric Fiselier const int ia[] = {0, 0, 1};
4435a83710eSEric Fiselier const int ib[] = {1, 0, 0};
4445a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
4455a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
4465a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
4475a83710eSEric Fiselier forward_iterator<const int*>(ib)) == true);
448e58baed3SEric Fiselier #if TEST_STD_VER >= 14
4495a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
4505a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
4515a83710eSEric Fiselier forward_iterator<const int*>(ib),
4525a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == true);
4535a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
4545a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
4555a83710eSEric Fiselier forward_iterator<const int*>(ib),
4565a83710eSEric Fiselier forward_iterator<const int*>(ib + sa - 1)) == false);
4575a83710eSEric Fiselier #endif
4585a83710eSEric Fiselier }
4595a83710eSEric Fiselier {
4605a83710eSEric Fiselier const int ia[] = {0, 0, 1};
4615a83710eSEric Fiselier const int ib[] = {1, 0, 1};
4625a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
4635a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
4645a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
4655a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
466e58baed3SEric Fiselier #if TEST_STD_VER >= 14
4675a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
4685a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
4695a83710eSEric Fiselier forward_iterator<const int*>(ib),
4705a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
4715a83710eSEric Fiselier #endif
4725a83710eSEric Fiselier }
4735a83710eSEric Fiselier {
4745a83710eSEric Fiselier const int ia[] = {0, 1, 2};
4755a83710eSEric Fiselier const int ib[] = {1, 0, 2};
4765a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
4775a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
4785a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
4795a83710eSEric Fiselier forward_iterator<const int*>(ib)) == true);
480e58baed3SEric Fiselier #if TEST_STD_VER >= 14
4815a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
4825a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
4835a83710eSEric Fiselier forward_iterator<const int*>(ib),
4845a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == true);
4855a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
4865a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
4875a83710eSEric Fiselier forward_iterator<const int*>(ib),
4885a83710eSEric Fiselier forward_iterator<const int*>(ib + sa - 1)) == false);
4895a83710eSEric Fiselier #endif
4905a83710eSEric Fiselier }
4915a83710eSEric Fiselier {
4925a83710eSEric Fiselier const int ia[] = {0, 1, 2};
4935a83710eSEric Fiselier const int ib[] = {1, 2, 0};
4945a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
4955a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
4965a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
4975a83710eSEric Fiselier forward_iterator<const int*>(ib)) == true);
498e58baed3SEric Fiselier #if TEST_STD_VER >= 14
4995a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
5005a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
5015a83710eSEric Fiselier forward_iterator<const int*>(ib),
5025a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == true);
5035a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
5045a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
5055a83710eSEric Fiselier forward_iterator<const int*>(ib),
5065a83710eSEric Fiselier forward_iterator<const int*>(ib + sa - 1)) == false);
5075a83710eSEric Fiselier #endif
5085a83710eSEric Fiselier }
5095a83710eSEric Fiselier {
5105a83710eSEric Fiselier const int ia[] = {0, 1, 2};
5115a83710eSEric Fiselier const int ib[] = {2, 1, 0};
5125a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
5135a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
5145a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
5155a83710eSEric Fiselier forward_iterator<const int*>(ib)) == true);
516e58baed3SEric Fiselier #if TEST_STD_VER >= 14
5175a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
5185a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
5195a83710eSEric Fiselier forward_iterator<const int*>(ib),
5205a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == true);
5215a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
5225a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
5235a83710eSEric Fiselier forward_iterator<const int*>(ib),
5245a83710eSEric Fiselier forward_iterator<const int*>(ib + sa - 1)) == false);
5255a83710eSEric Fiselier #endif
5265a83710eSEric Fiselier }
5275a83710eSEric Fiselier {
5285a83710eSEric Fiselier const int ia[] = {0, 1, 2};
5295a83710eSEric Fiselier const int ib[] = {2, 0, 1};
5305a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
5315a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
5325a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
5335a83710eSEric Fiselier forward_iterator<const int*>(ib)) == true);
534e58baed3SEric Fiselier #if TEST_STD_VER >= 14
5355a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
5365a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
5375a83710eSEric Fiselier forward_iterator<const int*>(ib),
5385a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == true);
5395a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
5405a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
5415a83710eSEric Fiselier forward_iterator<const int*>(ib),
5425a83710eSEric Fiselier forward_iterator<const int*>(ib + sa - 1)) == false);
5435a83710eSEric Fiselier #endif
5445a83710eSEric Fiselier }
5455a83710eSEric Fiselier {
5465a83710eSEric Fiselier const int ia[] = {0, 0, 1};
5475a83710eSEric Fiselier const int ib[] = {1, 0, 1};
5485a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
5495a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
5505a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
5515a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
552e58baed3SEric Fiselier #if TEST_STD_VER >= 14
5535a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
5545a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
5555a83710eSEric Fiselier forward_iterator<const int*>(ib),
5565a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
5575a83710eSEric Fiselier #endif
5585a83710eSEric Fiselier }
5595a83710eSEric Fiselier {
5605a83710eSEric Fiselier const int ia[] = {0, 0, 1};
5615a83710eSEric Fiselier const int ib[] = {1, 0, 0};
5625a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
5635a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
5645a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
5655a83710eSEric Fiselier forward_iterator<const int*>(ib)) == true);
566e58baed3SEric Fiselier #if TEST_STD_VER >= 14
5675a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
5685a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
5695a83710eSEric Fiselier forward_iterator<const int*>(ib),
5705a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == true);
5715a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
5725a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
5735a83710eSEric Fiselier forward_iterator<const int*>(ib + 1),
5745a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
5755a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
5765a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
5775a83710eSEric Fiselier forward_iterator<const int*>(ib),
5785a83710eSEric Fiselier forward_iterator<const int*>(ib + sa - 1)) == false);
5795a83710eSEric Fiselier #endif
5805a83710eSEric Fiselier }
5815a83710eSEric Fiselier {
5825a83710eSEric Fiselier const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
5835a83710eSEric Fiselier const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 2};
5845a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
5855a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
5865a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
5875a83710eSEric Fiselier forward_iterator<const int*>(ib)) == true);
588e58baed3SEric Fiselier #if TEST_STD_VER >= 14
5895a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
5905a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
5915a83710eSEric Fiselier forward_iterator<const int*>(ib),
5925a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == true);
5935a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
5945a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
5955a83710eSEric Fiselier forward_iterator<const int*>(ib + 1 ),
5965a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
5975a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
5985a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
5995a83710eSEric Fiselier forward_iterator<const int*>(ib),
6005a83710eSEric Fiselier forward_iterator<const int*>(ib + sa - 1)) == false);
6015a83710eSEric Fiselier #endif
6025a83710eSEric Fiselier }
6035a83710eSEric Fiselier {
6045a83710eSEric Fiselier const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
6055a83710eSEric Fiselier const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 0};
6065a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
6075a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
6085a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
6095a83710eSEric Fiselier forward_iterator<const int*>(ib)) == false);
610e58baed3SEric Fiselier #if TEST_STD_VER >= 14
6115a83710eSEric Fiselier assert(std::is_permutation(forward_iterator<const int*>(ia),
6125a83710eSEric Fiselier forward_iterator<const int*>(ia + sa),
6135a83710eSEric Fiselier forward_iterator<const int*>(ib),
6145a83710eSEric Fiselier forward_iterator<const int*>(ib + sa)) == false);
6155a83710eSEric Fiselier #endif
6165a83710eSEric Fiselier }
61749c7643cSMarshall Clow
61849c7643cSMarshall Clow #if TEST_STD_VER > 17
61949c7643cSMarshall Clow static_assert(test_constexpr());
62049c7643cSMarshall Clow #endif
621*2df59c50SJF Bastien
622*2df59c50SJF Bastien return 0;
6235a83710eSEric Fiselier }
624