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