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