184 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// <set>10 11// class set12 13// iterator erase(const_iterator position);14 15#include <set>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::set<int> M;31 typedef int V;32 typedef M::iterator I;33 V ar[] = {1, 2, 3, 4, 5, 6, 7, 8};34 M m(ar, ar + sizeof(ar) / sizeof(ar[0]));35 assert(m.size() == 8);36 I i = m.erase(std::next(m.cbegin(), 3));37 assert(m.size() == 7);38 assert(i == std::next(m.begin(), 3));39 assert(*std::next(m.begin(), 0) == 1);40 assert(*std::next(m.begin(), 1) == 2);41 assert(*std::next(m.begin(), 2) == 3);42 assert(*std::next(m.begin(), 3) == 5);43 assert(*std::next(m.begin(), 4) == 6);44 assert(*std::next(m.begin(), 5) == 7);45 assert(*std::next(m.begin(), 6) == 8);46 47 i = m.erase(std::next(m.cbegin(), 0));48 assert(m.size() == 6);49 assert(i == m.begin());50 assert(*std::next(m.begin(), 0) == 2);51 assert(*std::next(m.begin(), 1) == 3);52 assert(*std::next(m.begin(), 2) == 5);53 assert(*std::next(m.begin(), 3) == 6);54 assert(*std::next(m.begin(), 4) == 7);55 assert(*std::next(m.begin(), 5) == 8);56 57 i = m.erase(std::next(m.cbegin(), 5));58 assert(m.size() == 5);59 assert(i == m.end());60 assert(*std::next(m.begin(), 0) == 2);61 assert(*std::next(m.begin(), 1) == 3);62 assert(*std::next(m.begin(), 2) == 5);63 assert(*std::next(m.begin(), 3) == 6);64 assert(*std::next(m.begin(), 4) == 7);65 66 i = m.erase(std::next(m.cbegin(), 1));67 assert(m.size() == 4);68 assert(i == std::next(m.begin()));69 assert(*std::next(m.begin(), 0) == 2);70 assert(*std::next(m.begin(), 1) == 5);71 assert(*std::next(m.begin(), 2) == 6);72 assert(*std::next(m.begin(), 3) == 7);73 74 i = m.erase(std::next(m.cbegin(), 2));75 assert(m.size() == 3);76 assert(i == std::next(m.begin(), 2));77 assert(*std::next(m.begin(), 0) == 2);78 assert(*std::next(m.begin(), 1) == 5);79 assert(*std::next(m.begin(), 2) == 7);80 81 i = m.erase(std::next(m.cbegin(), 2));82 assert(m.size() == 2);83 assert(i == std::next(m.begin(), 2));84 assert(*std::next(m.begin(), 0) == 2);85 assert(*std::next(m.begin(), 1) == 5);86 87 i = m.erase(std::next(m.cbegin(), 0));88 assert(m.size() == 1);89 assert(i == std::next(m.begin(), 0));90 assert(*std::next(m.begin(), 0) == 5);91 92 i = m.erase(m.cbegin());93 assert(m.size() == 0);94 assert(i == m.begin());95 assert(i == m.end());96 }97#if TEST_STD_VER >= 1198 {99 typedef std::set<int, std::less<int>, min_allocator<int>> M;100 typedef int V;101 typedef M::iterator I;102 V ar[] = {1, 2, 3, 4, 5, 6, 7, 8};103 M m(ar, ar + sizeof(ar) / sizeof(ar[0]));104 assert(m.size() == 8);105 I i = m.erase(std::next(m.cbegin(), 3));106 assert(m.size() == 7);107 assert(i == std::next(m.begin(), 3));108 assert(*std::next(m.begin(), 0) == 1);109 assert(*std::next(m.begin(), 1) == 2);110 assert(*std::next(m.begin(), 2) == 3);111 assert(*std::next(m.begin(), 3) == 5);112 assert(*std::next(m.begin(), 4) == 6);113 assert(*std::next(m.begin(), 5) == 7);114 assert(*std::next(m.begin(), 6) == 8);115 116 i = m.erase(std::next(m.cbegin(), 0));117 assert(m.size() == 6);118 assert(i == m.begin());119 assert(*std::next(m.begin(), 0) == 2);120 assert(*std::next(m.begin(), 1) == 3);121 assert(*std::next(m.begin(), 2) == 5);122 assert(*std::next(m.begin(), 3) == 6);123 assert(*std::next(m.begin(), 4) == 7);124 assert(*std::next(m.begin(), 5) == 8);125 126 i = m.erase(std::next(m.cbegin(), 5));127 assert(m.size() == 5);128 assert(i == m.end());129 assert(*std::next(m.begin(), 0) == 2);130 assert(*std::next(m.begin(), 1) == 3);131 assert(*std::next(m.begin(), 2) == 5);132 assert(*std::next(m.begin(), 3) == 6);133 assert(*std::next(m.begin(), 4) == 7);134 135 i = m.erase(std::next(m.cbegin(), 1));136 assert(m.size() == 4);137 assert(i == std::next(m.begin()));138 assert(*std::next(m.begin(), 0) == 2);139 assert(*std::next(m.begin(), 1) == 5);140 assert(*std::next(m.begin(), 2) == 6);141 assert(*std::next(m.begin(), 3) == 7);142 143 i = m.erase(std::next(m.cbegin(), 2));144 assert(m.size() == 3);145 assert(i == std::next(m.begin(), 2));146 assert(*std::next(m.begin(), 0) == 2);147 assert(*std::next(m.begin(), 1) == 5);148 assert(*std::next(m.begin(), 2) == 7);149 150 i = m.erase(std::next(m.cbegin(), 2));151 assert(m.size() == 2);152 assert(i == std::next(m.begin(), 2));153 assert(*std::next(m.begin(), 0) == 2);154 assert(*std::next(m.begin(), 1) == 5);155 156 i = m.erase(std::next(m.cbegin(), 0));157 assert(m.size() == 1);158 assert(i == std::next(m.begin(), 0));159 assert(*std::next(m.begin(), 0) == 5);160 161 i = m.erase(m.cbegin());162 assert(m.size() == 0);163 assert(i == m.begin());164 assert(i == m.end());165 }166#endif167#if TEST_STD_VER >= 14168 {169 // This is LWG #2059170 typedef TemplateConstructor T;171 typedef std::set<T> C;172 typedef C::iterator I;173 174 C c;175 T a{0};176 I it = c.find(a);177 if (it != c.end())178 c.erase(it);179 }180#endif181 182 return 0;183}184