]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/std/algorithms/alg.nonmodifying/alg.is_permutation/is_permutation_pred.pass.cpp
Vendor import of libc++ trunk r290819:
[FreeBSD/FreeBSD.git] / test / std / algorithms / alg.nonmodifying / alg.is_permutation / is_permutation_pred.pass.cpp
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 //   bool
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
32 int main()
33 {
34     {
35         const int ia[] = {0};
36         const int ib[] = {0};
37         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
38         assert(std::is_permutation(forward_iterator<const int*>(ia),
39                                    forward_iterator<const int*>(ia + 0),
40                                    forward_iterator<const int*>(ib),
41                                    std::equal_to<const int>()) == true);
42         assert(std::is_permutation(forward_iterator<const int*>(ia),
43                                    forward_iterator<const int*>(ia + sa),
44                                    forward_iterator<const int*>(ib),
45                                    std::equal_to<const int>()) == true);
46 #if TEST_STD_VER >= 14
47         assert(std::is_permutation(forward_iterator<const int*>(ia),
48                                    forward_iterator<const int*>(ia + sa),
49                                    forward_iterator<const int*>(ib),
50                                    forward_iterator<const int*>(ib + sa),
51                                    std::equal_to<const int>()) == true);
52         assert(std::is_permutation(forward_iterator<const int*>(ia),
53                                    forward_iterator<const int*>(ia + sa),
54                                    forward_iterator<const int*>(ib),
55                                    forward_iterator<const int*>(ib + sa - 1),
56                                    std::equal_to<const int>()) == false);
57 #endif
58     }
59     {
60         const int ia[] = {0};
61         const int ib[] = {1};
62         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
63         assert(std::is_permutation(forward_iterator<const int*>(ia),
64                                    forward_iterator<const int*>(ia + sa),
65                                    forward_iterator<const int*>(ib),
66                                    std::equal_to<const int>()) == false);
67 #if TEST_STD_VER >= 14
68         assert(std::is_permutation(forward_iterator<const int*>(ia),
69                                    forward_iterator<const int*>(ia + sa),
70                                    forward_iterator<const int*>(ib),
71                                    forward_iterator<const int*>(ib + sa),
72                                    std::equal_to<const int>()) == false);
73 #endif
74     }
75
76     {
77         const int ia[] = {0, 0};
78         const int ib[] = {0, 0};
79         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
80         assert(std::is_permutation(forward_iterator<const int*>(ia),
81                                    forward_iterator<const int*>(ia + sa),
82                                    forward_iterator<const int*>(ib),
83                                    std::equal_to<const int>()) == true);
84 #if TEST_STD_VER >= 14
85         assert(std::is_permutation(forward_iterator<const int*>(ia),
86                                    forward_iterator<const int*>(ia + sa),
87                                    forward_iterator<const int*>(ib),
88                                    forward_iterator<const int*>(ib + sa),
89                                    std::equal_to<const int>()) == true);
90         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 - 1),
94                                    std::equal_to<const int>()) == false);
95 #endif
96     }
97     {
98         const int ia[] = {0, 0};
99         const int ib[] = {0, 1};
100         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
101         assert(std::is_permutation(forward_iterator<const int*>(ia),
102                                    forward_iterator<const int*>(ia + sa),
103                                    forward_iterator<const int*>(ib),
104                                    std::equal_to<const int>()) == false);
105 #if TEST_STD_VER >= 14
106         assert(std::is_permutation(forward_iterator<const int*>(ia),
107                                    forward_iterator<const int*>(ia + sa),
108                                    forward_iterator<const int*>(ib),
109                                    forward_iterator<const int*>(ib + sa),
110                                    std::equal_to<const int>()) == false);
111 #endif
112     }
113     {
114         const int ia[] = {0, 0};
115         const int ib[] = {1, 0};
116         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
117         assert(std::is_permutation(forward_iterator<const int*>(ia),
118                                    forward_iterator<const int*>(ia + sa),
119                                    forward_iterator<const int*>(ib),
120                                    std::equal_to<const int>()) == false);
121 #if TEST_STD_VER >= 14
122         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),
126                                    std::equal_to<const int>()) == false);
127 #endif
128     }
129     {
130         const int ia[] = {0, 0};
131         const int ib[] = {1, 1};
132         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
133         assert(std::is_permutation(forward_iterator<const int*>(ia),
134                                    forward_iterator<const int*>(ia + sa),
135                                    forward_iterator<const int*>(ib),
136                                    std::equal_to<const int>()) == false);
137 #if TEST_STD_VER >= 14
138         assert(std::is_permutation(forward_iterator<const int*>(ia),
139                                    forward_iterator<const int*>(ia + sa),
140                                    forward_iterator<const int*>(ib),
141                                    forward_iterator<const int*>(ib + sa),
142                                    std::equal_to<const int>()) == false);
143 #endif
144     }
145     {
146         const int ia[] = {0, 1};
147         const int ib[] = {0, 0};
148         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
149         assert(std::is_permutation(forward_iterator<const int*>(ia),
150                                    forward_iterator<const int*>(ia + sa),
151                                    forward_iterator<const int*>(ib),
152                                    std::equal_to<const int>()) == false);
153 #if TEST_STD_VER >= 14
154         assert(std::is_permutation(forward_iterator<const int*>(ia),
155                                    forward_iterator<const int*>(ia + sa),
156                                    forward_iterator<const int*>(ib),
157                                    forward_iterator<const int*>(ib + sa),
158                                    std::equal_to<const int>()) == false);
159 #endif
160     }
161     {
162         const int ia[] = {0, 1};
163         const int ib[] = {0, 1};
164         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
165         assert(std::is_permutation(forward_iterator<const int*>(ia),
166                                    forward_iterator<const int*>(ia + sa),
167                                    forward_iterator<const int*>(ib),
168                                    std::equal_to<const int>()) == true);
169 #if TEST_STD_VER >= 14
170         assert(std::is_permutation(forward_iterator<const int*>(ia),
171                                    forward_iterator<const int*>(ia + sa),
172                                    forward_iterator<const int*>(ib),
173                                    forward_iterator<const int*>(ib + sa),
174                                    std::equal_to<const int>()) == true);
175         assert(std::is_permutation(forward_iterator<const int*>(ia),
176                                    forward_iterator<const int*>(ia + sa),
177                                    forward_iterator<const int*>(ib),
178                                    forward_iterator<const int*>(ib + sa - 1),
179                                    std::equal_to<const int>()) == false);
180 #endif
181     }
182     {
183         const int ia[] = {0, 1};
184         const int ib[] = {1, 0};
185         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
186         assert(std::is_permutation(forward_iterator<const int*>(ia),
187                                    forward_iterator<const int*>(ia + sa),
188                                    forward_iterator<const int*>(ib),
189                                    std::equal_to<const int>()) == true);
190 #if TEST_STD_VER >= 14
191         assert(std::is_permutation(forward_iterator<const int*>(ia),
192                                    forward_iterator<const int*>(ia + sa),
193                                    forward_iterator<const int*>(ib),
194                                    forward_iterator<const int*>(ib + sa),
195                                    std::equal_to<const int>()) == true);
196         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 - 1),
200                                    std::equal_to<const int>()) == false);
201 #endif
202     }
203     {
204         const int ia[] = {0, 1};
205         const int ib[] = {1, 1};
206         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
207         assert(std::is_permutation(forward_iterator<const int*>(ia),
208                                    forward_iterator<const int*>(ia + sa),
209                                    forward_iterator<const int*>(ib),
210                                    std::equal_to<const int>()) == false);
211 #if TEST_STD_VER >= 14
212         assert(std::is_permutation(forward_iterator<const int*>(ia),
213                                    forward_iterator<const int*>(ia + sa),
214                                    forward_iterator<const int*>(ib),
215                                    forward_iterator<const int*>(ib + sa),
216                                    std::equal_to<const int>()) == false);
217 #endif
218     }
219     {
220         const int ia[] = {1, 0};
221         const int ib[] = {0, 0};
222         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
223         assert(std::is_permutation(forward_iterator<const int*>(ia),
224                                    forward_iterator<const int*>(ia + sa),
225                                    forward_iterator<const int*>(ib),
226                                    std::equal_to<const int>()) == false);
227 #if TEST_STD_VER >= 14
228         assert(std::is_permutation(forward_iterator<const int*>(ia),
229                                    forward_iterator<const int*>(ia + sa),
230                                    forward_iterator<const int*>(ib),
231                                    forward_iterator<const int*>(ib + sa),
232                                    std::equal_to<const int>()) == false);
233 #endif
234     }
235     {
236         const int ia[] = {1, 0};
237         const int ib[] = {0, 1};
238         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
239         assert(std::is_permutation(forward_iterator<const int*>(ia),
240                                    forward_iterator<const int*>(ia + sa),
241                                    forward_iterator<const int*>(ib),
242                                    std::equal_to<const int>()) == true);
243 #if TEST_STD_VER >= 14
244         assert(std::is_permutation(forward_iterator<const int*>(ia),
245                                    forward_iterator<const int*>(ia + sa),
246                                    forward_iterator<const int*>(ib),
247                                    forward_iterator<const int*>(ib + sa),
248                                    std::equal_to<const int>()) == true);
249         assert(std::is_permutation(forward_iterator<const int*>(ia),
250                                    forward_iterator<const int*>(ia + sa),
251                                    forward_iterator<const int*>(ib),
252                                    forward_iterator<const int*>(ib + sa - 1),
253                                    std::equal_to<const int>()) == false);
254 #endif
255     }
256     {
257         const int ia[] = {1, 0};
258         const int ib[] = {1, 0};
259         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
260         assert(std::is_permutation(forward_iterator<const int*>(ia),
261                                    forward_iterator<const int*>(ia + sa),
262                                    forward_iterator<const int*>(ib),
263                                    std::equal_to<const int>()) == true);
264 #if TEST_STD_VER >= 14
265         assert(std::is_permutation(forward_iterator<const int*>(ia),
266                                    forward_iterator<const int*>(ia + sa),
267                                    forward_iterator<const int*>(ib),
268                                    forward_iterator<const int*>(ib + sa),
269                                    std::equal_to<const int>()) == true);
270         assert(std::is_permutation(forward_iterator<const int*>(ia),
271                                    forward_iterator<const int*>(ia + sa),
272                                    forward_iterator<const int*>(ib),
273                                    forward_iterator<const int*>(ib + sa - 1),
274                                    std::equal_to<const int>()) == false);
275 #endif
276     }
277     {
278         const int ia[] = {1, 0};
279         const int ib[] = {1, 1};
280         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
281         assert(std::is_permutation(forward_iterator<const int*>(ia),
282                                    forward_iterator<const int*>(ia + sa),
283                                    forward_iterator<const int*>(ib),
284                                    std::equal_to<const int>()) == false);
285 #if TEST_STD_VER >= 14
286         assert(std::is_permutation(forward_iterator<const int*>(ia),
287                                    forward_iterator<const int*>(ia + sa),
288                                    forward_iterator<const int*>(ib),
289                                    forward_iterator<const int*>(ib + sa),
290                                    std::equal_to<const int>()) == false);
291 #endif
292     }
293     {
294         const int ia[] = {1, 1};
295         const int ib[] = {0, 0};
296         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
297         assert(std::is_permutation(forward_iterator<const int*>(ia),
298                                    forward_iterator<const int*>(ia + sa),
299                                    forward_iterator<const int*>(ib),
300                                    std::equal_to<const int>()) == false);
301 #if TEST_STD_VER >= 14
302         assert(std::is_permutation(forward_iterator<const int*>(ia),
303                                    forward_iterator<const int*>(ia + sa),
304                                    forward_iterator<const int*>(ib),
305                                    forward_iterator<const int*>(ib + sa),
306                                    std::equal_to<const int>()) == false);
307 #endif
308     }
309     {
310         const int ia[] = {1, 1};
311         const int ib[] = {0, 1};
312         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
313         assert(std::is_permutation(forward_iterator<const int*>(ia),
314                                    forward_iterator<const int*>(ia + sa),
315                                    forward_iterator<const int*>(ib),
316                                    std::equal_to<const int>()) == false);
317 #if TEST_STD_VER >= 14
318         assert(std::is_permutation(forward_iterator<const int*>(ia),
319                                    forward_iterator<const int*>(ia + sa),
320                                    forward_iterator<const int*>(ib),
321                                    forward_iterator<const int*>(ib + sa),
322                                    std::equal_to<const int>()) == false);
323 #endif
324     }
325     {
326         const int ia[] = {1, 1};
327         const int ib[] = {1, 0};
328         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
329         assert(std::is_permutation(forward_iterator<const int*>(ia),
330                                    forward_iterator<const int*>(ia + sa),
331                                    forward_iterator<const int*>(ib),
332                                    std::equal_to<const int>()) == false);
333 #if TEST_STD_VER >= 14
334         assert(std::is_permutation(forward_iterator<const int*>(ia),
335                                    forward_iterator<const int*>(ia + sa),
336                                    forward_iterator<const int*>(ib),
337                                    forward_iterator<const int*>(ib + sa),
338                                    std::equal_to<const int>()) == false);
339 #endif
340     }
341     {
342         const int ia[] = {1, 1};
343         const int ib[] = {1, 1};
344         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
345         assert(std::is_permutation(forward_iterator<const int*>(ia),
346                                    forward_iterator<const int*>(ia + sa),
347                                    forward_iterator<const int*>(ib),
348                                    std::equal_to<const int>()) == true);
349 #if TEST_STD_VER >= 14
350         assert(std::is_permutation(forward_iterator<const int*>(ia),
351                                    forward_iterator<const int*>(ia + sa),
352                                    forward_iterator<const int*>(ib),
353                                    forward_iterator<const int*>(ib + sa),
354                                    std::equal_to<const int>()) == true);
355         assert(std::is_permutation(forward_iterator<const int*>(ia),
356                                    forward_iterator<const int*>(ia + sa),
357                                    forward_iterator<const int*>(ib),
358                                    forward_iterator<const int*>(ib + sa - 1),
359                                    std::equal_to<const int>()) == false);
360 #endif
361     }
362
363     {
364         const int ia[] = {0, 0, 0};
365         const int ib[] = {1, 0, 0};
366         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
367         assert(std::is_permutation(forward_iterator<const int*>(ia),
368                                    forward_iterator<const int*>(ia + sa),
369                                    forward_iterator<const int*>(ib),
370                                    std::equal_to<const int>()) == false);
371 #if TEST_STD_VER >= 14
372         assert(std::is_permutation(forward_iterator<const int*>(ia),
373                                    forward_iterator<const int*>(ia + sa),
374                                    forward_iterator<const int*>(ib),
375                                    forward_iterator<const int*>(ib + sa),
376                                    std::equal_to<const int>()) == false);
377 #endif
378     }
379     {
380         const int ia[] = {0, 0, 0};
381         const int ib[] = {1, 0, 1};
382         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
383         assert(std::is_permutation(forward_iterator<const int*>(ia),
384                                    forward_iterator<const int*>(ia + sa),
385                                    forward_iterator<const int*>(ib),
386                                    std::equal_to<const int>()) == false);
387 #if TEST_STD_VER >= 14
388         assert(std::is_permutation(forward_iterator<const int*>(ia),
389                                    forward_iterator<const int*>(ia + sa),
390                                    forward_iterator<const int*>(ib),
391                                    forward_iterator<const int*>(ib + sa),
392                                    std::equal_to<const int>()) == false);
393 #endif
394     }
395     {
396         const int ia[] = {0, 0, 0};
397         const int ib[] = {1, 0, 2};
398         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
399         assert(std::is_permutation(forward_iterator<const int*>(ia),
400                                    forward_iterator<const int*>(ia + sa),
401                                    forward_iterator<const int*>(ib),
402                                    std::equal_to<const int>()) == false);
403 #if TEST_STD_VER >= 14
404         assert(std::is_permutation(forward_iterator<const int*>(ia),
405                                    forward_iterator<const int*>(ia + sa),
406                                    forward_iterator<const int*>(ib),
407                                    forward_iterator<const int*>(ib + sa),
408                                    std::equal_to<const int>()) == false);
409 #endif
410     }
411     {
412         const int ia[] = {0, 0, 0};
413         const int ib[] = {1, 1, 0};
414         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
415         assert(std::is_permutation(forward_iterator<const int*>(ia),
416                                    forward_iterator<const int*>(ia + sa),
417                                    forward_iterator<const int*>(ib),
418                                    std::equal_to<const int>()) == false);
419 #if TEST_STD_VER >= 14
420         assert(std::is_permutation(forward_iterator<const int*>(ia),
421                                    forward_iterator<const int*>(ia + sa),
422                                    forward_iterator<const int*>(ib),
423                                    forward_iterator<const int*>(ib + sa),
424                                    std::equal_to<const int>()) == false);
425 #endif
426     }
427     {
428         const int ia[] = {0, 0, 0};
429         const int ib[] = {1, 1, 1};
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),
434                                    std::equal_to<const int>()) == false);
435 #if TEST_STD_VER >= 14
436         assert(std::is_permutation(forward_iterator<const int*>(ia),
437                                    forward_iterator<const int*>(ia + sa),
438                                    forward_iterator<const int*>(ib),
439                                    forward_iterator<const int*>(ib + sa),
440                                    std::equal_to<const int>()) == false);
441 #endif
442     }
443     {
444         const int ia[] = {0, 0, 0};
445         const int ib[] = {1, 1, 2};
446         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
447         assert(std::is_permutation(forward_iterator<const int*>(ia),
448                                    forward_iterator<const int*>(ia + sa),
449                                    forward_iterator<const int*>(ib),
450                                    std::equal_to<const int>()) == false);
451 #if TEST_STD_VER >= 14
452         assert(std::is_permutation(forward_iterator<const int*>(ia),
453                                    forward_iterator<const int*>(ia + sa),
454                                    forward_iterator<const int*>(ib),
455                                    forward_iterator<const int*>(ib + sa),
456                                    std::equal_to<const int>()) == false);
457 #endif
458     }
459     {
460         const int ia[] = {0, 0, 0};
461         const int ib[] = {1, 2, 0};
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),
466                                    std::equal_to<const int>()) == false);
467 #if TEST_STD_VER >= 14
468         assert(std::is_permutation(forward_iterator<const int*>(ia),
469                                    forward_iterator<const int*>(ia + sa),
470                                    forward_iterator<const int*>(ib),
471                                    forward_iterator<const int*>(ib + sa),
472                                    std::equal_to<const int>()) == false);
473 #endif
474     }
475     {
476         const int ia[] = {0, 0, 0};
477         const int ib[] = {1, 2, 1};
478         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
479         assert(std::is_permutation(forward_iterator<const int*>(ia),
480                                    forward_iterator<const int*>(ia + sa),
481                                    forward_iterator<const int*>(ib),
482                                    std::equal_to<const int>()) == false);
483 #if TEST_STD_VER >= 14
484         assert(std::is_permutation(forward_iterator<const int*>(ia),
485                                    forward_iterator<const int*>(ia + sa),
486                                    forward_iterator<const int*>(ib),
487                                    forward_iterator<const int*>(ib + sa),
488                                    std::equal_to<const int>()) == false);
489 #endif
490     }
491     {
492         const int ia[] = {0, 0, 0};
493         const int ib[] = {1, 2, 2};
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),
498                                    std::equal_to<const int>()) == false);
499 #if TEST_STD_VER >= 14
500         assert(std::is_permutation(forward_iterator<const int*>(ia),
501                                    forward_iterator<const int*>(ia + sa),
502                                    forward_iterator<const int*>(ib),
503                                    forward_iterator<const int*>(ib + sa),
504                                    std::equal_to<const int>()) == false);
505 #endif
506     }
507     {
508         const int ia[] = {0, 0, 1};
509         const int ib[] = {1, 0, 0};
510         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
511         assert(std::is_permutation(forward_iterator<const int*>(ia),
512                                    forward_iterator<const int*>(ia + sa),
513                                    forward_iterator<const int*>(ib),
514                                    std::equal_to<const int>()) == true);
515 #if TEST_STD_VER >= 14
516         assert(std::is_permutation(forward_iterator<const int*>(ia),
517                                    forward_iterator<const int*>(ia + sa),
518                                    forward_iterator<const int*>(ib),
519                                    forward_iterator<const int*>(ib + sa),
520                                    std::equal_to<const int>()) == 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),
525                                    std::equal_to<const int>()) == false);
526 #endif
527     }
528     {
529         const int ia[] = {0, 0, 1};
530         const int ib[] = {1, 0, 1};
531         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
532         assert(std::is_permutation(forward_iterator<const int*>(ia),
533                                    forward_iterator<const int*>(ia + sa),
534                                    forward_iterator<const int*>(ib),
535                                    std::equal_to<const int>()) == false);
536 #if TEST_STD_VER >= 14
537         assert(std::is_permutation(forward_iterator<const int*>(ia),
538                                    forward_iterator<const int*>(ia + sa),
539                                    forward_iterator<const int*>(ib),
540                                    forward_iterator<const int*>(ib + sa),
541                                    std::equal_to<const int>()) == false);
542 #endif
543     }
544     {
545         const int ia[] = {0, 1, 2};
546         const int ib[] = {1, 0, 2};
547         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
548         assert(std::is_permutation(forward_iterator<const int*>(ia),
549                                    forward_iterator<const int*>(ia + sa),
550                                    forward_iterator<const int*>(ib),
551                                    std::equal_to<const int>()) == true);
552 #if TEST_STD_VER >= 14
553         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),
557                                    std::equal_to<const int>()) == true);
558         assert(std::is_permutation(forward_iterator<const int*>(ia),
559                                    forward_iterator<const int*>(ia + sa),
560                                    forward_iterator<const int*>(ib),
561                                    forward_iterator<const int*>(ib + sa - 1),
562                                    std::equal_to<const int>()) == false);
563 #endif
564     }
565     {
566         const int ia[] = {0, 1, 2};
567         const int ib[] = {1, 2, 0};
568         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
569         assert(std::is_permutation(forward_iterator<const int*>(ia),
570                                    forward_iterator<const int*>(ia + sa),
571                                    forward_iterator<const int*>(ib),
572                                    std::equal_to<const int>()) == true);
573 #if TEST_STD_VER >= 14
574         assert(std::is_permutation(forward_iterator<const int*>(ia),
575                                    forward_iterator<const int*>(ia + sa),
576                                    forward_iterator<const int*>(ib),
577                                    forward_iterator<const int*>(ib + sa),
578                                    std::equal_to<const int>()) == true);
579         assert(std::is_permutation(forward_iterator<const int*>(ia),
580                                    forward_iterator<const int*>(ia + sa),
581                                    forward_iterator<const int*>(ib),
582                                    forward_iterator<const int*>(ib + sa - 1),
583                                    std::equal_to<const int>()) == false);
584 #endif
585     }
586     {
587         const int ia[] = {0, 1, 2};
588         const int ib[] = {2, 1, 0};
589         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
590         assert(std::is_permutation(forward_iterator<const int*>(ia),
591                                    forward_iterator<const int*>(ia + sa),
592                                    forward_iterator<const int*>(ib),
593                                    std::equal_to<const int>()) == true);
594 #if TEST_STD_VER >= 14
595         assert(std::is_permutation(forward_iterator<const int*>(ia),
596                                    forward_iterator<const int*>(ia + sa),
597                                    forward_iterator<const int*>(ib),
598                                    forward_iterator<const int*>(ib + sa),
599                                    std::equal_to<const int>()) == true);
600         assert(std::is_permutation(forward_iterator<const int*>(ia),
601                                    forward_iterator<const int*>(ia + sa),
602                                    forward_iterator<const int*>(ib),
603                                    forward_iterator<const int*>(ib + sa - 1),
604                                    std::equal_to<const int>()) == false);
605 #endif
606     }
607     {
608         const int ia[] = {0, 1, 2};
609         const int ib[] = {2, 0, 1};
610         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
611         assert(std::is_permutation(forward_iterator<const int*>(ia),
612                                    forward_iterator<const int*>(ia + sa),
613                                    forward_iterator<const int*>(ib),
614                                    std::equal_to<const int>()) == true);
615 #if TEST_STD_VER >= 14
616         assert(std::is_permutation(forward_iterator<const int*>(ia),
617                                    forward_iterator<const int*>(ia + sa),
618                                    forward_iterator<const int*>(ib),
619                                    forward_iterator<const int*>(ib + sa),
620                                    std::equal_to<const int>()) == true);
621         assert(std::is_permutation(forward_iterator<const int*>(ia),
622                                    forward_iterator<const int*>(ia + sa),
623                                    forward_iterator<const int*>(ib),
624                                    forward_iterator<const int*>(ib + sa - 1),
625                                    std::equal_to<const int>()) == false);
626 #endif
627     }
628     {
629         const int ia[] = {0, 0, 1};
630         const int ib[] = {1, 0, 1};
631         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
632         assert(std::is_permutation(forward_iterator<const int*>(ia),
633                                    forward_iterator<const int*>(ia + sa),
634                                    forward_iterator<const int*>(ib),
635                                    std::equal_to<const int>()) == false);
636 #if TEST_STD_VER >= 14
637         assert(std::is_permutation(forward_iterator<const int*>(ia),
638                                    forward_iterator<const int*>(ia + sa),
639                                    forward_iterator<const int*>(ib),
640                                    forward_iterator<const int*>(ib + sa),
641                                    std::equal_to<const int>()) == false);
642 #endif
643     }
644     {
645         const int ia[] = {0, 0, 1};
646         const int ib[] = {1, 0, 0};
647         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
648         assert(std::is_permutation(forward_iterator<const int*>(ia),
649                                    forward_iterator<const int*>(ia + sa),
650                                    forward_iterator<const int*>(ib),
651                                    std::equal_to<const int>()) == true);
652 #if TEST_STD_VER >= 14
653         assert(std::is_permutation(forward_iterator<const int*>(ia),
654                                    forward_iterator<const int*>(ia + sa),
655                                    forward_iterator<const int*>(ib),
656                                    forward_iterator<const int*>(ib + sa),
657                                    std::equal_to<const int>()) == true);
658         assert(std::is_permutation(forward_iterator<const int*>(ia),
659                                    forward_iterator<const int*>(ia + sa),
660                                    forward_iterator<const int*>(ib + 1),
661                                    forward_iterator<const int*>(ib + sa),
662                                    std::equal_to<const int>()) == false);
663         assert(std::is_permutation(forward_iterator<const int*>(ia),
664                                    forward_iterator<const int*>(ia + sa),
665                                    forward_iterator<const int*>(ib),
666                                    forward_iterator<const int*>(ib + sa - 1),
667                                    std::equal_to<const int>()) == false);
668 #endif
669     }
670     {
671         const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
672         const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 2};
673         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
674         assert(std::is_permutation(forward_iterator<const int*>(ia),
675                                    forward_iterator<const int*>(ia + sa),
676                                    forward_iterator<const int*>(ib),
677                                    std::equal_to<const int>()) == true);
678 #if TEST_STD_VER >= 14
679         assert(std::is_permutation(forward_iterator<const int*>(ia),
680                                    forward_iterator<const int*>(ia + sa),
681                                    forward_iterator<const int*>(ib),
682                                    forward_iterator<const int*>(ib + sa),
683                                    std::equal_to<const int>()) == true);
684         assert(std::is_permutation(forward_iterator<const int*>(ia),
685                                    forward_iterator<const int*>(ia + sa),
686                                    forward_iterator<const int*>(ib + 1),
687                                    forward_iterator<const int*>(ib + sa),
688                                    std::equal_to<const int>()) == false);
689         assert(std::is_permutation(forward_iterator<const int*>(ia),
690                                    forward_iterator<const int*>(ia + sa),
691                                    forward_iterator<const int*>(ib),
692                                    forward_iterator<const int*>(ib + sa - 1),
693                                    std::equal_to<const int>()) == false);
694         comparison_count = 0;
695         assert(std::is_permutation(forward_iterator<const int*>(ia),
696                                    forward_iterator<const int*>(ia + sa),
697                                    forward_iterator<const int*>(ib),
698                                    forward_iterator<const int*>(ib + sa - 1),
699                                    counting_equals<const int>) == false);
700         assert ( comparison_count > 0 );
701         comparison_count = 0;
702         assert(std::is_permutation(random_access_iterator<const int*>(ia),
703                                    random_access_iterator<const int*>(ia + sa),
704                                    random_access_iterator<const int*>(ib),
705                                    random_access_iterator<const int*>(ib + sa - 1),
706                                    counting_equals<const int>) == false);
707         assert ( comparison_count == 0 );
708 #endif
709     }
710     {
711         const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
712         const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 0};
713         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
714         assert(std::is_permutation(forward_iterator<const int*>(ia),
715                                    forward_iterator<const int*>(ia + sa),
716                                    forward_iterator<const int*>(ib),
717                                    std::equal_to<const int>()) == false);
718 #if TEST_STD_VER >= 14
719         assert(std::is_permutation(forward_iterator<const int*>(ia),
720                                    forward_iterator<const int*>(ia + sa),
721                                    forward_iterator<const int*>(ib),
722                                    forward_iterator<const int*>(ib + sa),
723                                    std::equal_to<const int>()) == false);
724 #endif
725     }
726 }