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 } 727