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