brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.5 KiB · 9a0cf9b Raw
258 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 map12 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::map<int, double> M;31    typedef std::pair<int, double> P;32    typedef M::iterator I;33    P ar[] = {34        P(1, 1.5),35        P(2, 2.5),36        P(3, 3.5),37        P(4, 4.5),38        P(5, 5.5),39        P(6, 6.5),40        P(7, 7.5),41        P(8, 8.5),42    };43    M m(ar, ar + sizeof(ar) / sizeof(ar[0]));44    assert(m.size() == 8);45    I i = m.erase(std::next(m.cbegin(), 3));46    assert(m.size() == 7);47    assert(i == std::next(m.begin(), 3));48    assert(m.begin()->first == 1);49    assert(m.begin()->second == 1.5);50    assert(std::next(m.begin())->first == 2);51    assert(std::next(m.begin())->second == 2.5);52    assert(std::next(m.begin(), 2)->first == 3);53    assert(std::next(m.begin(), 2)->second == 3.5);54    assert(std::next(m.begin(), 3)->first == 5);55    assert(std::next(m.begin(), 3)->second == 5.5);56    assert(std::next(m.begin(), 4)->first == 6);57    assert(std::next(m.begin(), 4)->second == 6.5);58    assert(std::next(m.begin(), 5)->first == 7);59    assert(std::next(m.begin(), 5)->second == 7.5);60    assert(std::next(m.begin(), 6)->first == 8);61    assert(std::next(m.begin(), 6)->second == 8.5);62 63    i = m.erase(std::next(m.cbegin(), 0));64    assert(m.size() == 6);65    assert(i == m.begin());66    assert(m.begin()->first == 2);67    assert(m.begin()->second == 2.5);68    assert(std::next(m.begin())->first == 3);69    assert(std::next(m.begin())->second == 3.5);70    assert(std::next(m.begin(), 2)->first == 5);71    assert(std::next(m.begin(), 2)->second == 5.5);72    assert(std::next(m.begin(), 3)->first == 6);73    assert(std::next(m.begin(), 3)->second == 6.5);74    assert(std::next(m.begin(), 4)->first == 7);75    assert(std::next(m.begin(), 4)->second == 7.5);76    assert(std::next(m.begin(), 5)->first == 8);77    assert(std::next(m.begin(), 5)->second == 8.5);78 79    i = m.erase(std::next(m.cbegin(), 5));80    assert(m.size() == 5);81    assert(i == m.end());82    assert(m.begin()->first == 2);83    assert(m.begin()->second == 2.5);84    assert(std::next(m.begin())->first == 3);85    assert(std::next(m.begin())->second == 3.5);86    assert(std::next(m.begin(), 2)->first == 5);87    assert(std::next(m.begin(), 2)->second == 5.5);88    assert(std::next(m.begin(), 3)->first == 6);89    assert(std::next(m.begin(), 3)->second == 6.5);90    assert(std::next(m.begin(), 4)->first == 7);91    assert(std::next(m.begin(), 4)->second == 7.5);92 93    i = m.erase(std::next(m.cbegin(), 1));94    assert(m.size() == 4);95    assert(i == std::next(m.begin()));96    assert(m.begin()->first == 2);97    assert(m.begin()->second == 2.5);98    assert(std::next(m.begin())->first == 5);99    assert(std::next(m.begin())->second == 5.5);100    assert(std::next(m.begin(), 2)->first == 6);101    assert(std::next(m.begin(), 2)->second == 6.5);102    assert(std::next(m.begin(), 3)->first == 7);103    assert(std::next(m.begin(), 3)->second == 7.5);104 105    i = m.erase(std::next(m.cbegin(), 2));106    assert(m.size() == 3);107    assert(i == std::next(m.begin(), 2));108    assert(m.begin()->first == 2);109    assert(m.begin()->second == 2.5);110    assert(std::next(m.begin())->first == 5);111    assert(std::next(m.begin())->second == 5.5);112    assert(std::next(m.begin(), 2)->first == 7);113    assert(std::next(m.begin(), 2)->second == 7.5);114 115    i = m.erase(std::next(m.cbegin(), 2));116    assert(m.size() == 2);117    assert(i == std::next(m.begin(), 2));118    assert(m.begin()->first == 2);119    assert(m.begin()->second == 2.5);120    assert(std::next(m.begin())->first == 5);121    assert(std::next(m.begin())->second == 5.5);122 123    i = m.erase(std::next(m.cbegin(), 0));124    assert(m.size() == 1);125    assert(i == std::next(m.begin(), 0));126    assert(m.begin()->first == 5);127    assert(m.begin()->second == 5.5);128 129    i = m.erase(m.cbegin());130    assert(m.size() == 0);131    assert(i == m.begin());132    assert(i == m.end());133  }134#if TEST_STD_VER >= 11135  {136    typedef std::map<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;137    typedef std::pair<int, double> P;138    typedef M::iterator I;139    P ar[] = {140        P(1, 1.5),141        P(2, 2.5),142        P(3, 3.5),143        P(4, 4.5),144        P(5, 5.5),145        P(6, 6.5),146        P(7, 7.5),147        P(8, 8.5),148    };149    M m(ar, ar + sizeof(ar) / sizeof(ar[0]));150    assert(m.size() == 8);151    I i = m.erase(std::next(m.cbegin(), 3));152    assert(m.size() == 7);153    assert(i == std::next(m.begin(), 3));154    assert(m.begin()->first == 1);155    assert(m.begin()->second == 1.5);156    assert(std::next(m.begin())->first == 2);157    assert(std::next(m.begin())->second == 2.5);158    assert(std::next(m.begin(), 2)->first == 3);159    assert(std::next(m.begin(), 2)->second == 3.5);160    assert(std::next(m.begin(), 3)->first == 5);161    assert(std::next(m.begin(), 3)->second == 5.5);162    assert(std::next(m.begin(), 4)->first == 6);163    assert(std::next(m.begin(), 4)->second == 6.5);164    assert(std::next(m.begin(), 5)->first == 7);165    assert(std::next(m.begin(), 5)->second == 7.5);166    assert(std::next(m.begin(), 6)->first == 8);167    assert(std::next(m.begin(), 6)->second == 8.5);168 169    i = m.erase(std::next(m.cbegin(), 0));170    assert(m.size() == 6);171    assert(i == m.begin());172    assert(m.begin()->first == 2);173    assert(m.begin()->second == 2.5);174    assert(std::next(m.begin())->first == 3);175    assert(std::next(m.begin())->second == 3.5);176    assert(std::next(m.begin(), 2)->first == 5);177    assert(std::next(m.begin(), 2)->second == 5.5);178    assert(std::next(m.begin(), 3)->first == 6);179    assert(std::next(m.begin(), 3)->second == 6.5);180    assert(std::next(m.begin(), 4)->first == 7);181    assert(std::next(m.begin(), 4)->second == 7.5);182    assert(std::next(m.begin(), 5)->first == 8);183    assert(std::next(m.begin(), 5)->second == 8.5);184 185    i = m.erase(std::next(m.cbegin(), 5));186    assert(m.size() == 5);187    assert(i == m.end());188    assert(m.begin()->first == 2);189    assert(m.begin()->second == 2.5);190    assert(std::next(m.begin())->first == 3);191    assert(std::next(m.begin())->second == 3.5);192    assert(std::next(m.begin(), 2)->first == 5);193    assert(std::next(m.begin(), 2)->second == 5.5);194    assert(std::next(m.begin(), 3)->first == 6);195    assert(std::next(m.begin(), 3)->second == 6.5);196    assert(std::next(m.begin(), 4)->first == 7);197    assert(std::next(m.begin(), 4)->second == 7.5);198 199    i = m.erase(std::next(m.cbegin(), 1));200    assert(m.size() == 4);201    assert(i == std::next(m.begin()));202    assert(m.begin()->first == 2);203    assert(m.begin()->second == 2.5);204    assert(std::next(m.begin())->first == 5);205    assert(std::next(m.begin())->second == 5.5);206    assert(std::next(m.begin(), 2)->first == 6);207    assert(std::next(m.begin(), 2)->second == 6.5);208    assert(std::next(m.begin(), 3)->first == 7);209    assert(std::next(m.begin(), 3)->second == 7.5);210 211    i = m.erase(std::next(m.cbegin(), 2));212    assert(m.size() == 3);213    assert(i == std::next(m.begin(), 2));214    assert(m.begin()->first == 2);215    assert(m.begin()->second == 2.5);216    assert(std::next(m.begin())->first == 5);217    assert(std::next(m.begin())->second == 5.5);218    assert(std::next(m.begin(), 2)->first == 7);219    assert(std::next(m.begin(), 2)->second == 7.5);220 221    i = m.erase(std::next(m.cbegin(), 2));222    assert(m.size() == 2);223    assert(i == std::next(m.begin(), 2));224    assert(m.begin()->first == 2);225    assert(m.begin()->second == 2.5);226    assert(std::next(m.begin())->first == 5);227    assert(std::next(m.begin())->second == 5.5);228 229    i = m.erase(std::next(m.cbegin(), 0));230    assert(m.size() == 1);231    assert(i == std::next(m.begin(), 0));232    assert(m.begin()->first == 5);233    assert(m.begin()->second == 5.5);234 235    i = m.erase(m.cbegin());236    assert(m.size() == 0);237    assert(i == m.begin());238    assert(i == m.end());239  }240#endif241#if TEST_STD_VER >= 14242  {243    //  This is LWG #2059244    typedef TemplateConstructor T;245    typedef std::map<T, int> C;246    typedef C::iterator I;247 248    C c;249    T a{0};250    I it = c.find(a);251    if (it != c.end())252      c.erase(it);253  }254#endif255 256  return 0;257}258