brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.7 KiB · 67e957e Raw
300 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// <map>10 11// class multimap12 13// iterator erase(const_iterator position);14 15#include <map>16#include <cassert>17 18#include "test_macros.h"19#include "min_allocator.h"20 21struct TemplateConstructor {22  template <typename T>23  TemplateConstructor(const T&) {}24};25 26bool operator<(const TemplateConstructor&, const TemplateConstructor&) { return false; }27 28int main(int, char**) {29  {30    typedef std::multimap<int, double> M;31    typedef std::pair<int, double> P;32    typedef M::iterator I;33    P ar[] = {34        P(1, 1),35        P(1, 1.5),36        P(1, 2),37        P(2, 1),38        P(2, 1.5),39        P(2, 2),40        P(3, 1),41        P(3, 1.5),42        P(3, 2),43    };44    M m(ar, ar + sizeof(ar) / sizeof(ar[0]));45    assert(m.size() == 9);46    I i = m.erase(std::next(m.cbegin(), 3));47    assert(m.size() == 8);48    assert(i == std::next(m.begin(), 3));49    assert(m.begin()->first == 1);50    assert(m.begin()->second == 1);51    assert(std::next(m.begin())->first == 1);52    assert(std::next(m.begin())->second == 1.5);53    assert(std::next(m.begin(), 2)->first == 1);54    assert(std::next(m.begin(), 2)->second == 2);55    assert(std::next(m.begin(), 3)->first == 2);56    assert(std::next(m.begin(), 3)->second == 1.5);57    assert(std::next(m.begin(), 4)->first == 2);58    assert(std::next(m.begin(), 4)->second == 2);59    assert(std::next(m.begin(), 5)->first == 3);60    assert(std::next(m.begin(), 5)->second == 1);61    assert(std::next(m.begin(), 6)->first == 3);62    assert(std::next(m.begin(), 6)->second == 1.5);63    assert(std::next(m.begin(), 7)->first == 3);64    assert(std::next(m.begin(), 7)->second == 2);65 66    i = m.erase(std::next(m.cbegin(), 0));67    assert(m.size() == 7);68    assert(i == m.begin());69    assert(std::next(m.begin(), 0)->first == 1);70    assert(std::next(m.begin(), 0)->second == 1.5);71    assert(std::next(m.begin(), 1)->first == 1);72    assert(std::next(m.begin(), 1)->second == 2);73    assert(std::next(m.begin(), 2)->first == 2);74    assert(std::next(m.begin(), 2)->second == 1.5);75    assert(std::next(m.begin(), 3)->first == 2);76    assert(std::next(m.begin(), 3)->second == 2);77    assert(std::next(m.begin(), 4)->first == 3);78    assert(std::next(m.begin(), 4)->second == 1);79    assert(std::next(m.begin(), 5)->first == 3);80    assert(std::next(m.begin(), 5)->second == 1.5);81    assert(std::next(m.begin(), 6)->first == 3);82    assert(std::next(m.begin(), 6)->second == 2);83 84    i = m.erase(std::next(m.cbegin(), 5));85    assert(m.size() == 6);86    assert(i == std::prev(m.end()));87    assert(std::next(m.begin(), 0)->first == 1);88    assert(std::next(m.begin(), 0)->second == 1.5);89    assert(std::next(m.begin(), 1)->first == 1);90    assert(std::next(m.begin(), 1)->second == 2);91    assert(std::next(m.begin(), 2)->first == 2);92    assert(std::next(m.begin(), 2)->second == 1.5);93    assert(std::next(m.begin(), 3)->first == 2);94    assert(std::next(m.begin(), 3)->second == 2);95    assert(std::next(m.begin(), 4)->first == 3);96    assert(std::next(m.begin(), 4)->second == 1);97    assert(std::next(m.begin(), 5)->first == 3);98    assert(std::next(m.begin(), 5)->second == 2);99 100    i = m.erase(std::next(m.cbegin(), 1));101    assert(m.size() == 5);102    assert(i == std::next(m.begin()));103    assert(std::next(m.begin(), 0)->first == 1);104    assert(std::next(m.begin(), 0)->second == 1.5);105    assert(std::next(m.begin(), 1)->first == 2);106    assert(std::next(m.begin(), 1)->second == 1.5);107    assert(std::next(m.begin(), 2)->first == 2);108    assert(std::next(m.begin(), 2)->second == 2);109    assert(std::next(m.begin(), 3)->first == 3);110    assert(std::next(m.begin(), 3)->second == 1);111    assert(std::next(m.begin(), 4)->first == 3);112    assert(std::next(m.begin(), 4)->second == 2);113 114    i = m.erase(std::next(m.cbegin(), 2));115    assert(m.size() == 4);116    assert(i == std::next(m.begin(), 2));117    assert(std::next(m.begin(), 0)->first == 1);118    assert(std::next(m.begin(), 0)->second == 1.5);119    assert(std::next(m.begin(), 1)->first == 2);120    assert(std::next(m.begin(), 1)->second == 1.5);121    assert(std::next(m.begin(), 2)->first == 3);122    assert(std::next(m.begin(), 2)->second == 1);123    assert(std::next(m.begin(), 3)->first == 3);124    assert(std::next(m.begin(), 3)->second == 2);125 126    i = m.erase(std::next(m.cbegin(), 2));127    assert(m.size() == 3);128    assert(i == std::next(m.begin(), 2));129    assert(std::next(m.begin(), 0)->first == 1);130    assert(std::next(m.begin(), 0)->second == 1.5);131    assert(std::next(m.begin(), 1)->first == 2);132    assert(std::next(m.begin(), 1)->second == 1.5);133    assert(std::next(m.begin(), 2)->first == 3);134    assert(std::next(m.begin(), 2)->second == 2);135 136    i = m.erase(std::next(m.cbegin(), 0));137    assert(m.size() == 2);138    assert(i == std::next(m.begin(), 0));139    assert(std::next(m.begin(), 0)->first == 2);140    assert(std::next(m.begin(), 0)->second == 1.5);141    assert(std::next(m.begin(), 1)->first == 3);142    assert(std::next(m.begin(), 1)->second == 2);143 144    i = m.erase(std::next(m.cbegin(), 1));145    assert(m.size() == 1);146    assert(i == m.end());147    assert(std::next(m.begin(), 0)->first == 2);148    assert(std::next(m.begin(), 0)->second == 1.5);149 150    i = m.erase(m.cbegin());151    assert(m.size() == 0);152    assert(i == m.begin());153    assert(i == m.end());154  }155#if TEST_STD_VER >= 11156  {157    typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;158    typedef std::pair<int, double> P;159    typedef M::iterator I;160    P ar[] = {161        P(1, 1),162        P(1, 1.5),163        P(1, 2),164        P(2, 1),165        P(2, 1.5),166        P(2, 2),167        P(3, 1),168        P(3, 1.5),169        P(3, 2),170    };171    M m(ar, ar + sizeof(ar) / sizeof(ar[0]));172    assert(m.size() == 9);173    I i = m.erase(std::next(m.cbegin(), 3));174    assert(m.size() == 8);175    assert(i == std::next(m.begin(), 3));176    assert(m.begin()->first == 1);177    assert(m.begin()->second == 1);178    assert(std::next(m.begin())->first == 1);179    assert(std::next(m.begin())->second == 1.5);180    assert(std::next(m.begin(), 2)->first == 1);181    assert(std::next(m.begin(), 2)->second == 2);182    assert(std::next(m.begin(), 3)->first == 2);183    assert(std::next(m.begin(), 3)->second == 1.5);184    assert(std::next(m.begin(), 4)->first == 2);185    assert(std::next(m.begin(), 4)->second == 2);186    assert(std::next(m.begin(), 5)->first == 3);187    assert(std::next(m.begin(), 5)->second == 1);188    assert(std::next(m.begin(), 6)->first == 3);189    assert(std::next(m.begin(), 6)->second == 1.5);190    assert(std::next(m.begin(), 7)->first == 3);191    assert(std::next(m.begin(), 7)->second == 2);192 193    i = m.erase(std::next(m.cbegin(), 0));194    assert(m.size() == 7);195    assert(i == m.begin());196    assert(std::next(m.begin(), 0)->first == 1);197    assert(std::next(m.begin(), 0)->second == 1.5);198    assert(std::next(m.begin(), 1)->first == 1);199    assert(std::next(m.begin(), 1)->second == 2);200    assert(std::next(m.begin(), 2)->first == 2);201    assert(std::next(m.begin(), 2)->second == 1.5);202    assert(std::next(m.begin(), 3)->first == 2);203    assert(std::next(m.begin(), 3)->second == 2);204    assert(std::next(m.begin(), 4)->first == 3);205    assert(std::next(m.begin(), 4)->second == 1);206    assert(std::next(m.begin(), 5)->first == 3);207    assert(std::next(m.begin(), 5)->second == 1.5);208    assert(std::next(m.begin(), 6)->first == 3);209    assert(std::next(m.begin(), 6)->second == 2);210 211    i = m.erase(std::next(m.cbegin(), 5));212    assert(m.size() == 6);213    assert(i == std::prev(m.end()));214    assert(std::next(m.begin(), 0)->first == 1);215    assert(std::next(m.begin(), 0)->second == 1.5);216    assert(std::next(m.begin(), 1)->first == 1);217    assert(std::next(m.begin(), 1)->second == 2);218    assert(std::next(m.begin(), 2)->first == 2);219    assert(std::next(m.begin(), 2)->second == 1.5);220    assert(std::next(m.begin(), 3)->first == 2);221    assert(std::next(m.begin(), 3)->second == 2);222    assert(std::next(m.begin(), 4)->first == 3);223    assert(std::next(m.begin(), 4)->second == 1);224    assert(std::next(m.begin(), 5)->first == 3);225    assert(std::next(m.begin(), 5)->second == 2);226 227    i = m.erase(std::next(m.cbegin(), 1));228    assert(m.size() == 5);229    assert(i == std::next(m.begin()));230    assert(std::next(m.begin(), 0)->first == 1);231    assert(std::next(m.begin(), 0)->second == 1.5);232    assert(std::next(m.begin(), 1)->first == 2);233    assert(std::next(m.begin(), 1)->second == 1.5);234    assert(std::next(m.begin(), 2)->first == 2);235    assert(std::next(m.begin(), 2)->second == 2);236    assert(std::next(m.begin(), 3)->first == 3);237    assert(std::next(m.begin(), 3)->second == 1);238    assert(std::next(m.begin(), 4)->first == 3);239    assert(std::next(m.begin(), 4)->second == 2);240 241    i = m.erase(std::next(m.cbegin(), 2));242    assert(m.size() == 4);243    assert(i == std::next(m.begin(), 2));244    assert(std::next(m.begin(), 0)->first == 1);245    assert(std::next(m.begin(), 0)->second == 1.5);246    assert(std::next(m.begin(), 1)->first == 2);247    assert(std::next(m.begin(), 1)->second == 1.5);248    assert(std::next(m.begin(), 2)->first == 3);249    assert(std::next(m.begin(), 2)->second == 1);250    assert(std::next(m.begin(), 3)->first == 3);251    assert(std::next(m.begin(), 3)->second == 2);252 253    i = m.erase(std::next(m.cbegin(), 2));254    assert(m.size() == 3);255    assert(i == std::next(m.begin(), 2));256    assert(std::next(m.begin(), 0)->first == 1);257    assert(std::next(m.begin(), 0)->second == 1.5);258    assert(std::next(m.begin(), 1)->first == 2);259    assert(std::next(m.begin(), 1)->second == 1.5);260    assert(std::next(m.begin(), 2)->first == 3);261    assert(std::next(m.begin(), 2)->second == 2);262 263    i = m.erase(std::next(m.cbegin(), 0));264    assert(m.size() == 2);265    assert(i == std::next(m.begin(), 0));266    assert(std::next(m.begin(), 0)->first == 2);267    assert(std::next(m.begin(), 0)->second == 1.5);268    assert(std::next(m.begin(), 1)->first == 3);269    assert(std::next(m.begin(), 1)->second == 2);270 271    i = m.erase(std::next(m.cbegin(), 1));272    assert(m.size() == 1);273    assert(i == m.end());274    assert(std::next(m.begin(), 0)->first == 2);275    assert(std::next(m.begin(), 0)->second == 1.5);276 277    i = m.erase(m.cbegin());278    assert(m.size() == 0);279    assert(i == m.begin());280    assert(i == m.end());281  }282#endif283#if TEST_STD_VER >= 14284  {285    //  This is LWG #2059286    typedef TemplateConstructor T;287    typedef std::multimap<T, int> C;288    typedef C::iterator I;289 290    C c;291    T a{0};292    I it = c.find(a);293    if (it != c.end())294      c.erase(it);295  }296#endif297 298  return 0;299}300