Home | History | Annotate | Download | only in unord.multimap
      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 // <unordered_map>
     11 
     12 // template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
     13 //           class Alloc = allocator<pair<const Key, T>>>
     14 // class unordered_multimap
     15 
     16 // void swap(unordered_multimap& __u);
     17 
     18 #include <unordered_map>
     19 #include <string>
     20 #include <set>
     21 #include <cassert>
     22 #include <cstddef>
     23 
     24 #include "test_macros.h"
     25 #include "../../test_compare.h"
     26 #include "../../test_hash.h"
     27 #include "test_allocator.h"
     28 
     29 #include "min_allocator.h"
     30 
     31 int main()
     32 {
     33     {
     34         typedef test_hash<std::hash<int> > Hash;
     35         typedef test_compare<std::equal_to<int> > Compare;
     36         typedef test_allocator<std::pair<const int, std::string> > Alloc;
     37         typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
     38         C c1(0, Hash(1), Compare(1), Alloc(1, 1));
     39         C c2(0, Hash(2), Compare(2), Alloc(1, 2));
     40         c2.max_load_factor(2);
     41         c1.swap(c2);
     42 
     43         LIBCPP_ASSERT(c1.bucket_count() == 0);
     44         assert(c1.size() == 0);
     45         assert(c1.hash_function() == Hash(2));
     46         assert(c1.key_eq() == Compare(2));
     47         assert(c1.get_allocator().get_id() == 1);
     48         assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
     49         assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
     50         assert(c1.max_load_factor() == 2);
     51 
     52         LIBCPP_ASSERT(c2.bucket_count() == 0);
     53         assert(c2.size() == 0);
     54         assert(c2.hash_function() == Hash(1));
     55         assert(c2.key_eq() == Compare(1));
     56         assert(c2.get_allocator().get_id() == 2);
     57         assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
     58         assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
     59         assert(c2.max_load_factor() == 1);
     60     }
     61     {
     62         typedef test_hash<std::hash<int> > Hash;
     63         typedef test_compare<std::equal_to<int> > Compare;
     64         typedef test_allocator<std::pair<const int, std::string> > Alloc;
     65         typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
     66         typedef std::pair<int, std::string> P;
     67         P a2[] =
     68         {
     69             P(10, "ten"),
     70             P(20, "twenty"),
     71             P(30, "thirty"),
     72             P(40, "forty"),
     73             P(50, "fifty"),
     74             P(60, "sixty"),
     75             P(70, "seventy"),
     76             P(80, "eighty"),
     77         };
     78         C c1(0, Hash(1), Compare(1), Alloc(1, 1));
     79         C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc(1, 2));
     80         c2.max_load_factor(2);
     81         c1.swap(c2);
     82 
     83         assert(c1.bucket_count() >= 8);
     84         assert(c1.size() == 8);
     85         assert(c1.find(10)->second == "ten");
     86         assert(c1.find(20)->second == "twenty");
     87         assert(c1.find(30)->second == "thirty");
     88         assert(c1.find(40)->second == "forty");
     89         assert(c1.find(50)->second == "fifty");
     90         assert(c1.find(60)->second == "sixty");
     91         assert(c1.find(70)->second == "seventy");
     92         assert(c1.find(80)->second == "eighty");
     93         assert(c1.hash_function() == Hash(2));
     94         assert(c1.key_eq() == Compare(2));
     95         assert(c1.get_allocator().get_id() == 1);
     96         assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
     97         assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
     98         assert(c1.max_load_factor() == 2);
     99 
    100         LIBCPP_ASSERT(c2.bucket_count() == 0);
    101         assert(c2.size() == 0);
    102         assert(c2.hash_function() == Hash(1));
    103         assert(c2.key_eq() == Compare(1));
    104         assert(c2.get_allocator().get_id() == 2);
    105         assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
    106         assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
    107         assert(c2.max_load_factor() == 1);
    108     }
    109     {
    110         typedef test_hash<std::hash<int> > Hash;
    111         typedef test_compare<std::equal_to<int> > Compare;
    112         typedef test_allocator<std::pair<const int, std::string> > Alloc;
    113         typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
    114         typedef std::pair<int, std::string> P;
    115         P a1[] =
    116         {
    117             P(1, "one"),
    118             P(2, "two"),
    119             P(3, "three"),
    120             P(4, "four"),
    121             P(1, "four"),
    122             P(2, "four"),
    123         };
    124         C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc(1, 1));
    125         C c2(0, Hash(2), Compare(2), Alloc(1, 2));
    126         c2.max_load_factor(2);
    127         c1.swap(c2);
    128 
    129         LIBCPP_ASSERT(c1.bucket_count() == 0);
    130         assert(c1.size() == 0);
    131         assert(c1.hash_function() == Hash(2));
    132         assert(c1.key_eq() == Compare(2));
    133         assert(c1.get_allocator().get_id() == 1);
    134         assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
    135         assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
    136         assert(c1.max_load_factor() == 2);
    137 
    138         assert(c2.bucket_count() >= 6);
    139         assert(c2.size() == 6);
    140         {
    141             std::set<std::string> s;
    142             s.insert("one");
    143             s.insert("four");
    144             assert(s.find(c2.find(1)->second) != s.end());
    145             s.erase(s.find(c2.find(1)->second));
    146             assert(s.find(next(c2.find(1))->second) != s.end());
    147         }
    148         {
    149             std::set<std::string> s;
    150             s.insert("two");
    151             s.insert("four");
    152             assert(s.find(c2.find(2)->second) != s.end());
    153             s.erase(s.find(c2.find(2)->second));
    154             assert(s.find(next(c2.find(2))->second) != s.end());
    155         }
    156         assert(c2.find(3)->second == "three");
    157         assert(c2.find(4)->second == "four");
    158         assert(c2.hash_function() == Hash(1));
    159         assert(c2.key_eq() == Compare(1));
    160         assert(c2.get_allocator().get_id() == 2);
    161         assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
    162         assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
    163         assert(c2.max_load_factor() == 1);
    164     }
    165     {
    166         typedef test_hash<std::hash<int> > Hash;
    167         typedef test_compare<std::equal_to<int> > Compare;
    168         typedef test_allocator<std::pair<const int, std::string> > Alloc;
    169         typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
    170         typedef std::pair<int, std::string> P;
    171         P a1[] =
    172         {
    173             P(1, "one"),
    174             P(2, "two"),
    175             P(3, "three"),
    176             P(4, "four"),
    177             P(1, "four"),
    178             P(2, "four"),
    179         };
    180         P a2[] =
    181         {
    182             P(10, "ten"),
    183             P(20, "twenty"),
    184             P(30, "thirty"),
    185             P(40, "forty"),
    186             P(50, "fifty"),
    187             P(60, "sixty"),
    188             P(70, "seventy"),
    189             P(80, "eighty"),
    190         };
    191         C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc(1, 1));
    192         C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc(1, 2));
    193         c2.max_load_factor(2);
    194         c1.swap(c2);
    195 
    196         assert(c1.bucket_count() >= 8);
    197         assert(c1.size() == 8);
    198         assert(c1.find(10)->second == "ten");
    199         assert(c1.find(20)->second == "twenty");
    200         assert(c1.find(30)->second == "thirty");
    201         assert(c1.find(40)->second == "forty");
    202         assert(c1.find(50)->second == "fifty");
    203         assert(c1.find(60)->second == "sixty");
    204         assert(c1.find(70)->second == "seventy");
    205         assert(c1.find(80)->second == "eighty");
    206         assert(c1.hash_function() == Hash(2));
    207         assert(c1.key_eq() == Compare(2));
    208         assert(c1.get_allocator().get_id() == 1);
    209         assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
    210         assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
    211         assert(c1.max_load_factor() == 2);
    212 
    213         assert(c2.bucket_count() >= 6);
    214         assert(c2.size() == 6);
    215         {
    216             std::set<std::string> s;
    217             s.insert("one");
    218             s.insert("four");
    219             assert(s.find(c2.find(1)->second) != s.end());
    220             s.erase(s.find(c2.find(1)->second));
    221             assert(s.find(next(c2.find(1))->second) != s.end());
    222         }
    223         {
    224             std::set<std::string> s;
    225             s.insert("two");
    226             s.insert("four");
    227             assert(s.find(c2.find(2)->second) != s.end());
    228             s.erase(s.find(c2.find(2)->second));
    229             assert(s.find(next(c2.find(2))->second) != s.end());
    230         }
    231         assert(c2.find(3)->second == "three");
    232         assert(c2.find(4)->second == "four");
    233         assert(c2.hash_function() == Hash(1));
    234         assert(c2.key_eq() == Compare(1));
    235         assert(c2.get_allocator().get_id() == 2);
    236         assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
    237         assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
    238         assert(c2.max_load_factor() == 1);
    239     }
    240 
    241     {
    242         typedef test_hash<std::hash<int> > Hash;
    243         typedef test_compare<std::equal_to<int> > Compare;
    244         typedef other_allocator<std::pair<const int, std::string> > Alloc;
    245         typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
    246         C c1(0, Hash(1), Compare(1), Alloc(1));
    247         C c2(0, Hash(2), Compare(2), Alloc(2));
    248         c2.max_load_factor(2);
    249         c1.swap(c2);
    250 
    251         LIBCPP_ASSERT(c1.bucket_count() == 0);
    252         assert(c1.size() == 0);
    253         assert(c1.hash_function() == Hash(2));
    254         assert(c1.key_eq() == Compare(2));
    255         assert(c1.get_allocator() == Alloc(2));
    256         assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
    257         assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
    258         assert(c1.max_load_factor() == 2);
    259 
    260         LIBCPP_ASSERT(c2.bucket_count() == 0);
    261         assert(c2.size() == 0);
    262         assert(c2.hash_function() == Hash(1));
    263         assert(c2.key_eq() == Compare(1));
    264         assert(c2.get_allocator() == Alloc(1));
    265         assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
    266         assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
    267         assert(c2.max_load_factor() == 1);
    268     }
    269     {
    270         typedef test_hash<std::hash<int> > Hash;
    271         typedef test_compare<std::equal_to<int> > Compare;
    272         typedef other_allocator<std::pair<const int, std::string> > Alloc;
    273         typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
    274         typedef std::pair<int, std::string> P;
    275         P a2[] =
    276         {
    277             P(10, "ten"),
    278             P(20, "twenty"),
    279             P(30, "thirty"),
    280             P(40, "forty"),
    281             P(50, "fifty"),
    282             P(60, "sixty"),
    283             P(70, "seventy"),
    284             P(80, "eighty"),
    285         };
    286         C c1(0, Hash(1), Compare(1), Alloc(1));
    287         C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc(2));
    288         c2.max_load_factor(2);
    289         c1.swap(c2);
    290 
    291         assert(c1.bucket_count() >= 8);
    292         assert(c1.size() == 8);
    293         assert(c1.find(10)->second == "ten");
    294         assert(c1.find(20)->second == "twenty");
    295         assert(c1.find(30)->second == "thirty");
    296         assert(c1.find(40)->second == "forty");
    297         assert(c1.find(50)->second == "fifty");
    298         assert(c1.find(60)->second == "sixty");
    299         assert(c1.find(70)->second == "seventy");
    300         assert(c1.find(80)->second == "eighty");
    301         assert(c1.hash_function() == Hash(2));
    302         assert(c1.key_eq() == Compare(2));
    303         assert(c1.get_allocator() == Alloc(2));
    304         assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
    305         assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
    306         assert(c1.max_load_factor() == 2);
    307 
    308         LIBCPP_ASSERT(c2.bucket_count() == 0);
    309         assert(c2.size() == 0);
    310         assert(c2.hash_function() == Hash(1));
    311         assert(c2.key_eq() == Compare(1));
    312         assert(c2.get_allocator() == Alloc(1));
    313         assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
    314         assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
    315         assert(c2.max_load_factor() == 1);
    316     }
    317     {
    318         typedef test_hash<std::hash<int> > Hash;
    319         typedef test_compare<std::equal_to<int> > Compare;
    320         typedef other_allocator<std::pair<const int, std::string> > Alloc;
    321         typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
    322         typedef std::pair<int, std::string> P;
    323         P a1[] =
    324         {
    325             P(1, "one"),
    326             P(2, "two"),
    327             P(3, "three"),
    328             P(4, "four"),
    329             P(1, "four"),
    330             P(2, "four"),
    331         };
    332         C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc(1));
    333         C c2(0, Hash(2), Compare(2), Alloc(2));
    334         c2.max_load_factor(2);
    335         c1.swap(c2);
    336 
    337         LIBCPP_ASSERT(c1.bucket_count() == 0);
    338         assert(c1.size() == 0);
    339         assert(c1.hash_function() == Hash(2));
    340         assert(c1.key_eq() == Compare(2));
    341         assert(c1.get_allocator() == Alloc(2));
    342         assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
    343         assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
    344         assert(c1.max_load_factor() == 2);
    345 
    346         assert(c2.bucket_count() >= 6);
    347         assert(c2.size() == 6);
    348         {
    349             std::set<std::string> s;
    350             s.insert("one");
    351             s.insert("four");
    352             assert(s.find(c2.find(1)->second) != s.end());
    353             s.erase(s.find(c2.find(1)->second));
    354             assert(s.find(next(c2.find(1))->second) != s.end());
    355         }
    356         {
    357             std::set<std::string> s;
    358             s.insert("two");
    359             s.insert("four");
    360             assert(s.find(c2.find(2)->second) != s.end());
    361             s.erase(s.find(c2.find(2)->second));
    362             assert(s.find(next(c2.find(2))->second) != s.end());
    363         }
    364         assert(c2.find(3)->second == "three");
    365         assert(c2.find(4)->second == "four");
    366         assert(c2.hash_function() == Hash(1));
    367         assert(c2.key_eq() == Compare(1));
    368         assert(c2.get_allocator() == Alloc(1));
    369         assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
    370         assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
    371         assert(c2.max_load_factor() == 1);
    372     }
    373     {
    374         typedef test_hash<std::hash<int> > Hash;
    375         typedef test_compare<std::equal_to<int> > Compare;
    376         typedef other_allocator<std::pair<const int, std::string> > Alloc;
    377         typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
    378         typedef std::pair<int, std::string> P;
    379         P a1[] =
    380         {
    381             P(1, "one"),
    382             P(2, "two"),
    383             P(3, "three"),
    384             P(4, "four"),
    385             P(1, "four"),
    386             P(2, "four"),
    387         };
    388         P a2[] =
    389         {
    390             P(10, "ten"),
    391             P(20, "twenty"),
    392             P(30, "thirty"),
    393             P(40, "forty"),
    394             P(50, "fifty"),
    395             P(60, "sixty"),
    396             P(70, "seventy"),
    397             P(80, "eighty"),
    398         };
    399         C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc(1));
    400         C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc(2));
    401         c2.max_load_factor(2);
    402         c1.swap(c2);
    403 
    404         assert(c1.bucket_count() >= 8);
    405         assert(c1.size() == 8);
    406         assert(c1.find(10)->second == "ten");
    407         assert(c1.find(20)->second == "twenty");
    408         assert(c1.find(30)->second == "thirty");
    409         assert(c1.find(40)->second == "forty");
    410         assert(c1.find(50)->second == "fifty");
    411         assert(c1.find(60)->second == "sixty");
    412         assert(c1.find(70)->second == "seventy");
    413         assert(c1.find(80)->second == "eighty");
    414         assert(c1.hash_function() == Hash(2));
    415         assert(c1.key_eq() == Compare(2));
    416         assert(c1.get_allocator() == Alloc(2));
    417         assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
    418         assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
    419         assert(c1.max_load_factor() == 2);
    420 
    421         assert(c2.bucket_count() >= 6);
    422         assert(c2.size() == 6);
    423         {
    424             std::set<std::string> s;
    425             s.insert("one");
    426             s.insert("four");
    427             assert(s.find(c2.find(1)->second) != s.end());
    428             s.erase(s.find(c2.find(1)->second));
    429             assert(s.find(next(c2.find(1))->second) != s.end());
    430         }
    431         {
    432             std::set<std::string> s;
    433             s.insert("two");
    434             s.insert("four");
    435             assert(s.find(c2.find(2)->second) != s.end());
    436             s.erase(s.find(c2.find(2)->second));
    437             assert(s.find(next(c2.find(2))->second) != s.end());
    438         }
    439         assert(c2.find(3)->second == "three");
    440         assert(c2.find(4)->second == "four");
    441         assert(c2.hash_function() == Hash(1));
    442         assert(c2.key_eq() == Compare(1));
    443         assert(c2.get_allocator() == Alloc(1));
    444         assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
    445         assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
    446         assert(c2.max_load_factor() == 1);
    447     }
    448 #if TEST_STD_VER >= 11
    449     {
    450         typedef test_hash<std::hash<int> > Hash;
    451         typedef test_compare<std::equal_to<int> > Compare;
    452         typedef min_allocator<std::pair<const int, std::string> > Alloc;
    453         typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
    454         C c1(0, Hash(1), Compare(1), Alloc());
    455         C c2(0, Hash(2), Compare(2), Alloc());
    456         c2.max_load_factor(2);
    457         c1.swap(c2);
    458 
    459         LIBCPP_ASSERT(c1.bucket_count() == 0);
    460         assert(c1.size() == 0);
    461         assert(c1.hash_function() == Hash(2));
    462         assert(c1.key_eq() == Compare(2));
    463         assert(c1.get_allocator() == Alloc());
    464         assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
    465         assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
    466         assert(c1.max_load_factor() == 2);
    467 
    468         LIBCPP_ASSERT(c2.bucket_count() == 0);
    469         assert(c2.size() == 0);
    470         assert(c2.hash_function() == Hash(1));
    471         assert(c2.key_eq() == Compare(1));
    472         assert(c2.get_allocator() == Alloc());
    473         assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
    474         assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
    475         assert(c2.max_load_factor() == 1);
    476     }
    477     {
    478         typedef test_hash<std::hash<int> > Hash;
    479         typedef test_compare<std::equal_to<int> > Compare;
    480         typedef min_allocator<std::pair<const int, std::string> > Alloc;
    481         typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
    482         typedef std::pair<int, std::string> P;
    483         P a2[] =
    484         {
    485             P(10, "ten"),
    486             P(20, "twenty"),
    487             P(30, "thirty"),
    488             P(40, "forty"),
    489             P(50, "fifty"),
    490             P(60, "sixty"),
    491             P(70, "seventy"),
    492             P(80, "eighty"),
    493         };
    494         C c1(0, Hash(1), Compare(1), Alloc());
    495         C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc());
    496         c2.max_load_factor(2);
    497         c1.swap(c2);
    498 
    499         assert(c1.bucket_count() >= 8);
    500         assert(c1.size() == 8);
    501         assert(c1.find(10)->second == "ten");
    502         assert(c1.find(20)->second == "twenty");
    503         assert(c1.find(30)->second == "thirty");
    504         assert(c1.find(40)->second == "forty");
    505         assert(c1.find(50)->second == "fifty");
    506         assert(c1.find(60)->second == "sixty");
    507         assert(c1.find(70)->second == "seventy");
    508         assert(c1.find(80)->second == "eighty");
    509         assert(c1.hash_function() == Hash(2));
    510         assert(c1.key_eq() == Compare(2));
    511         assert(c1.get_allocator() == Alloc());
    512         assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
    513         assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
    514         assert(c1.max_load_factor() == 2);
    515 
    516         LIBCPP_ASSERT(c2.bucket_count() == 0);
    517         assert(c2.size() == 0);
    518         assert(c2.hash_function() == Hash(1));
    519         assert(c2.key_eq() == Compare(1));
    520         assert(c2.get_allocator() == Alloc());
    521         assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
    522         assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
    523         assert(c2.max_load_factor() == 1);
    524     }
    525     {
    526         typedef test_hash<std::hash<int> > Hash;
    527         typedef test_compare<std::equal_to<int> > Compare;
    528         typedef min_allocator<std::pair<const int, std::string> > Alloc;
    529         typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
    530         typedef std::pair<int, std::string> P;
    531         P a1[] =
    532         {
    533             P(1, "one"),
    534             P(2, "two"),
    535             P(3, "three"),
    536             P(4, "four"),
    537             P(1, "four"),
    538             P(2, "four"),
    539         };
    540         C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc());
    541         C c2(0, Hash(2), Compare(2), Alloc());
    542         c2.max_load_factor(2);
    543         c1.swap(c2);
    544 
    545         LIBCPP_ASSERT(c1.bucket_count() == 0);
    546         assert(c1.size() == 0);
    547         assert(c1.hash_function() == Hash(2));
    548         assert(c1.key_eq() == Compare(2));
    549         assert(c1.get_allocator() == Alloc());
    550         assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
    551         assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
    552         assert(c1.max_load_factor() == 2);
    553 
    554         assert(c2.bucket_count() >= 6);
    555         assert(c2.size() == 6);
    556         {
    557             std::set<std::string> s;
    558             s.insert("one");
    559             s.insert("four");
    560             assert(s.find(c2.find(1)->second) != s.end());
    561             s.erase(s.find(c2.find(1)->second));
    562             assert(s.find(next(c2.find(1))->second) != s.end());
    563         }
    564         {
    565             std::set<std::string> s;
    566             s.insert("two");
    567             s.insert("four");
    568             assert(s.find(c2.find(2)->second) != s.end());
    569             s.erase(s.find(c2.find(2)->second));
    570             assert(s.find(next(c2.find(2))->second) != s.end());
    571         }
    572         assert(c2.find(3)->second == "three");
    573         assert(c2.find(4)->second == "four");
    574         assert(c2.hash_function() == Hash(1));
    575         assert(c2.key_eq() == Compare(1));
    576         assert(c2.get_allocator() == Alloc());
    577         assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
    578         assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
    579         assert(c2.max_load_factor() == 1);
    580     }
    581     {
    582         typedef test_hash<std::hash<int> > Hash;
    583         typedef test_compare<std::equal_to<int> > Compare;
    584         typedef min_allocator<std::pair<const int, std::string> > Alloc;
    585         typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
    586         typedef std::pair<int, std::string> P;
    587         P a1[] =
    588         {
    589             P(1, "one"),
    590             P(2, "two"),
    591             P(3, "three"),
    592             P(4, "four"),
    593             P(1, "four"),
    594             P(2, "four"),
    595         };
    596         P a2[] =
    597         {
    598             P(10, "ten"),
    599             P(20, "twenty"),
    600             P(30, "thirty"),
    601             P(40, "forty"),
    602             P(50, "fifty"),
    603             P(60, "sixty"),
    604             P(70, "seventy"),
    605             P(80, "eighty"),
    606         };
    607         C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc());
    608         C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc());
    609         c2.max_load_factor(2);
    610         c1.swap(c2);
    611 
    612         assert(c1.bucket_count() >= 8);
    613         assert(c1.size() == 8);
    614         assert(c1.find(10)->second == "ten");
    615         assert(c1.find(20)->second == "twenty");
    616         assert(c1.find(30)->second == "thirty");
    617         assert(c1.find(40)->second == "forty");
    618         assert(c1.find(50)->second == "fifty");
    619         assert(c1.find(60)->second == "sixty");
    620         assert(c1.find(70)->second == "seventy");
    621         assert(c1.find(80)->second == "eighty");
    622         assert(c1.hash_function() == Hash(2));
    623         assert(c1.key_eq() == Compare(2));
    624         assert(c1.get_allocator() == Alloc());
    625         assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
    626         assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
    627         assert(c1.max_load_factor() == 2);
    628 
    629         assert(c2.bucket_count() >= 6);
    630         assert(c2.size() == 6);
    631         {
    632             std::set<std::string> s;
    633             s.insert("one");
    634             s.insert("four");
    635             assert(s.find(c2.find(1)->second) != s.end());
    636             s.erase(s.find(c2.find(1)->second));
    637             assert(s.find(next(c2.find(1))->second) != s.end());
    638         }
    639         {
    640             std::set<std::string> s;
    641             s.insert("two");
    642             s.insert("four");
    643             assert(s.find(c2.find(2)->second) != s.end());
    644             s.erase(s.find(c2.find(2)->second));
    645             assert(s.find(next(c2.find(2))->second) != s.end());
    646         }
    647         assert(c2.find(3)->second == "three");
    648         assert(c2.find(4)->second == "four");
    649         assert(c2.hash_function() == Hash(1));
    650         assert(c2.key_eq() == Compare(1));
    651         assert(c2.get_allocator() == Alloc());
    652         assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
    653         assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
    654         assert(c2.max_load_factor() == 1);
    655     }
    656 #endif
    657 }
    658