libcxx

libcxx mirror with random patches
git clone https://git.neptards.moe/neptards/libcxx.git
Log | Files | Refs

erase_range.pass.cpp (6088B)


      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 // iterator erase(const_iterator first, const_iterator last)
     17 
     18 #include <unordered_map>
     19 #include <string>
     20 #include <cassert>
     21 #include <cstddef>
     22 
     23 #include "min_allocator.h"
     24 
     25 int main()
     26 {
     27     {
     28         typedef std::unordered_multimap<int, std::string> C;
     29         typedef std::pair<int, std::string> P;
     30         P a[] =
     31         {
     32             P(1, "one"),
     33             P(2, "two"),
     34             P(3, "three"),
     35             P(4, "four"),
     36             P(1, "four"),
     37             P(2, "four"),
     38         };
     39         C c(a, a + sizeof(a)/sizeof(a[0]));
     40         C::const_iterator i = c.find(2);
     41         C::const_iterator j = next(i, 2);
     42         C::iterator k = c.erase(i, i);
     43         assert(k == i);
     44         assert(c.size() == 6);
     45         typedef std::pair<C::iterator, C::iterator> Eq;
     46         Eq eq = c.equal_range(1);
     47         assert(std::distance(eq.first, eq.second) == 2);
     48         k = eq.first;
     49         assert(k->first == 1);
     50         assert(k->second == "one");
     51         ++k;
     52         assert(k->first == 1);
     53         assert(k->second == "four");
     54         eq = c.equal_range(2);
     55         assert(std::distance(eq.first, eq.second) == 2);
     56         k = eq.first;
     57         assert(k->first == 2);
     58         assert(k->second == "two");
     59         ++k;
     60         assert(k->first == 2);
     61         assert(k->second == "four");
     62         eq = c.equal_range(3);
     63         assert(std::distance(eq.first, eq.second) == 1);
     64         k = eq.first;
     65         assert(k->first == 3);
     66         assert(k->second == "three");
     67         eq = c.equal_range(4);
     68         assert(std::distance(eq.first, eq.second) == 1);
     69         k = eq.first;
     70         assert(k->first == 4);
     71         assert(k->second == "four");
     72         assert(static_cast<std::size_t>(std::distance(c.begin(), c.end())) == c.size());
     73         assert(static_cast<std::size_t>(std::distance(c.cbegin(), c.cend())) == c.size());
     74 
     75         k = c.erase(i, j);
     76         assert(c.size() == 4);
     77         eq = c.equal_range(1);
     78         assert(std::distance(eq.first, eq.second) == 2);
     79         k = eq.first;
     80         assert(k->first == 1);
     81         assert(k->second == "one");
     82         ++k;
     83         assert(k->first == 1);
     84         assert(k->second == "four");
     85         eq = c.equal_range(3);
     86         assert(std::distance(eq.first, eq.second) == 1);
     87         k = eq.first;
     88         assert(k->first == 3);
     89         assert(k->second == "three");
     90         eq = c.equal_range(4);
     91         assert(std::distance(eq.first, eq.second) == 1);
     92         k = eq.first;
     93         assert(k->first == 4);
     94         assert(k->second == "four");
     95         assert(static_cast<std::size_t>(std::distance(c.begin(), c.end())) == c.size());
     96         assert(static_cast<std::size_t>(std::distance(c.cbegin(), c.cend())) == c.size());
     97 
     98         k = c.erase(c.cbegin(), c.cend());
     99         assert(c.size() == 0);
    100         assert(k == c.end());
    101     }
    102 #if TEST_STD_VER >= 11
    103     {
    104         typedef std::unordered_multimap<int, std::string, std::hash<int>, std::equal_to<int>,
    105                             min_allocator<std::pair<const int, std::string>>> C;
    106         typedef std::pair<int, std::string> P;
    107         P a[] =
    108         {
    109             P(1, "one"),
    110             P(2, "two"),
    111             P(3, "three"),
    112             P(4, "four"),
    113             P(1, "four"),
    114             P(2, "four"),
    115         };
    116         C c(a, a + sizeof(a)/sizeof(a[0]));
    117         C::const_iterator i = c.find(2);
    118         C::const_iterator j = next(i, 2);
    119         C::iterator k = c.erase(i, i);
    120         assert(k == i);
    121         assert(c.size() == 6);
    122         typedef std::pair<C::iterator, C::iterator> Eq;
    123         Eq eq = c.equal_range(1);
    124         assert(std::distance(eq.first, eq.second) == 2);
    125         k = eq.first;
    126         assert(k->first == 1);
    127         assert(k->second == "one");
    128         ++k;
    129         assert(k->first == 1);
    130         assert(k->second == "four");
    131         eq = c.equal_range(2);
    132         assert(std::distance(eq.first, eq.second) == 2);
    133         k = eq.first;
    134         assert(k->first == 2);
    135         assert(k->second == "two");
    136         ++k;
    137         assert(k->first == 2);
    138         assert(k->second == "four");
    139         eq = c.equal_range(3);
    140         assert(std::distance(eq.first, eq.second) == 1);
    141         k = eq.first;
    142         assert(k->first == 3);
    143         assert(k->second == "three");
    144         eq = c.equal_range(4);
    145         assert(std::distance(eq.first, eq.second) == 1);
    146         k = eq.first;
    147         assert(k->first == 4);
    148         assert(k->second == "four");
    149         assert(static_cast<std::size_t>(std::distance(c.begin(), c.end())) == c.size());
    150         assert(static_cast<std::size_t>(std::distance(c.cbegin(), c.cend())) == c.size());
    151 
    152         k = c.erase(i, j);
    153         assert(c.size() == 4);
    154         eq = c.equal_range(1);
    155         assert(std::distance(eq.first, eq.second) == 2);
    156         k = eq.first;
    157         assert(k->first == 1);
    158         assert(k->second == "one");
    159         ++k;
    160         assert(k->first == 1);
    161         assert(k->second == "four");
    162         eq = c.equal_range(3);
    163         assert(std::distance(eq.first, eq.second) == 1);
    164         k = eq.first;
    165         assert(k->first == 3);
    166         assert(k->second == "three");
    167         eq = c.equal_range(4);
    168         assert(std::distance(eq.first, eq.second) == 1);
    169         k = eq.first;
    170         assert(k->first == 4);
    171         assert(k->second == "four");
    172         assert(static_cast<std::size_t>(std::distance(c.begin(), c.end())) == c.size());
    173         assert(static_cast<std::size_t>(std::distance(c.cbegin(), c.cend())) == c.size());
    174 
    175         k = c.erase(c.cbegin(), c.cend());
    176         assert(c.size() == 0);
    177         assert(k == c.end());
    178     }
    179 #endif
    180 }