167 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// UNSUPPORTED: c++03, c++11, c++14, c++17, c++2010 11// <flat_map>12 13// iterator erase(iterator position);14// iterator erase(const_iterator position);15 16#include <compare>17#include <concepts>18#include <deque>19#include <flat_map>20#include <functional>21#include <type_traits>22#include <utility>23#include <vector>24 25#include "MinSequenceContainer.h"26#include "../helpers.h"27#include "test_macros.h"28#include "min_allocator.h"29 30template <class KeyContainer, class ValueContainer>31constexpr void test() {32 using Key = typename KeyContainer::value_type;33 using Value = typename ValueContainer::value_type;34 using M = std::flat_map<Key, Value, std::less<Key>, KeyContainer, ValueContainer>;35 using P = std::pair<Key, Value>;36 using I = M::iterator;37 38 P ar[] = {39 P(1, 1.5),40 P(2, 2.5),41 P(3, 3.5),42 P(4, 4.5),43 P(5, 5.5),44 P(6, 6.5),45 P(7, 7.5),46 P(8, 8.5),47 };48 M m(ar, ar + sizeof(ar) / sizeof(ar[0]));49 assert(m.size() == 8);50 std::same_as<I> decltype(auto) i1 = m.erase(std::next(m.cbegin(), 3));51 assert(m.size() == 7);52 assert(i1 == std::next(m.begin(), 3));53 assert(m.begin()->first == 1);54 assert(m.begin()->second == 1.5);55 assert(std::next(m.begin())->first == 2);56 assert(std::next(m.begin())->second == 2.5);57 assert(std::next(m.begin(), 2)->first == 3);58 assert(std::next(m.begin(), 2)->second == 3.5);59 assert(std::next(m.begin(), 3)->first == 5);60 assert(std::next(m.begin(), 3)->second == 5.5);61 assert(std::next(m.begin(), 4)->first == 6);62 assert(std::next(m.begin(), 4)->second == 6.5);63 assert(std::next(m.begin(), 5)->first == 7);64 assert(std::next(m.begin(), 5)->second == 7.5);65 assert(std::next(m.begin(), 6)->first == 8);66 assert(std::next(m.begin(), 6)->second == 8.5);67 68 std::same_as<I> decltype(auto) i2 = m.erase(std::next(m.begin(), 0));69 assert(m.size() == 6);70 assert(i2 == m.begin());71 assert(m.begin()->first == 2);72 assert(m.begin()->second == 2.5);73 assert(std::next(m.begin())->first == 3);74 assert(std::next(m.begin())->second == 3.5);75 assert(std::next(m.begin(), 2)->first == 5);76 assert(std::next(m.begin(), 2)->second == 5.5);77 assert(std::next(m.begin(), 3)->first == 6);78 assert(std::next(m.begin(), 3)->second == 6.5);79 assert(std::next(m.begin(), 4)->first == 7);80 assert(std::next(m.begin(), 4)->second == 7.5);81 assert(std::next(m.begin(), 5)->first == 8);82 assert(std::next(m.begin(), 5)->second == 8.5);83 84 std::same_as<I> decltype(auto) i3 = m.erase(std::next(m.cbegin(), 5));85 assert(m.size() == 5);86 assert(i3 == m.end());87 assert(m.begin()->first == 2);88 assert(m.begin()->second == 2.5);89 assert(std::next(m.begin())->first == 3);90 assert(std::next(m.begin())->second == 3.5);91 assert(std::next(m.begin(), 2)->first == 5);92 assert(std::next(m.begin(), 2)->second == 5.5);93 assert(std::next(m.begin(), 3)->first == 6);94 assert(std::next(m.begin(), 3)->second == 6.5);95 assert(std::next(m.begin(), 4)->first == 7);96 assert(std::next(m.begin(), 4)->second == 7.5);97 98 std::same_as<I> decltype(auto) i4 = m.erase(std::next(m.begin(), 1));99 assert(m.size() == 4);100 assert(i4 == std::next(m.begin()));101 assert(m.begin()->first == 2);102 assert(m.begin()->second == 2.5);103 assert(std::next(m.begin())->first == 5);104 assert(std::next(m.begin())->second == 5.5);105 assert(std::next(m.begin(), 2)->first == 6);106 assert(std::next(m.begin(), 2)->second == 6.5);107 assert(std::next(m.begin(), 3)->first == 7);108 assert(std::next(m.begin(), 3)->second == 7.5);109 110 std::same_as<I> decltype(auto) i5 = m.erase(std::next(m.cbegin(), 2));111 assert(m.size() == 3);112 assert(i5 == std::next(m.begin(), 2));113 assert(m.begin()->first == 2);114 assert(m.begin()->second == 2.5);115 assert(std::next(m.begin())->first == 5);116 assert(std::next(m.begin())->second == 5.5);117 assert(std::next(m.begin(), 2)->first == 7);118 assert(std::next(m.begin(), 2)->second == 7.5);119 120 std::same_as<I> decltype(auto) i6 = m.erase(std::next(m.begin(), 2));121 assert(m.size() == 2);122 assert(i6 == std::next(m.begin(), 2));123 assert(m.begin()->first == 2);124 assert(m.begin()->second == 2.5);125 assert(std::next(m.begin())->first == 5);126 assert(std::next(m.begin())->second == 5.5);127 128 std::same_as<I> decltype(auto) i7 = m.erase(std::next(m.cbegin(), 0));129 assert(m.size() == 1);130 assert(i7 == std::next(m.begin(), 0));131 assert(m.begin()->first == 5);132 assert(m.begin()->second == 5.5);133 134 std::same_as<I> decltype(auto) i8 = m.erase(m.begin());135 assert(m.size() == 0);136 assert(i8 == m.begin());137 assert(i8 == m.end());138}139 140constexpr bool test() {141 test<std::vector<int>, std::vector<double>>();142#ifndef __cpp_lib_constexpr_deque143 if (!TEST_IS_CONSTANT_EVALUATED)144#endif145 {146 test<std::deque<int>, std::vector<double>>();147 }148 test<MinSequenceContainer<int>, MinSequenceContainer<double>>();149 test<std::vector<int, min_allocator<int>>, std::vector<double, min_allocator<double>>>();150 151 if (!TEST_IS_CONSTANT_EVALUATED) {152 auto erase_function = [](auto& m, auto) { m.erase(m.begin() + 2); };153 test_erase_exception_guarantee(erase_function);154 }155 156 return true;157}158 159int main(int, char**) {160 test();161#if TEST_STD_VER >= 26162 static_assert(test());163#endif164 165 return 0;166}167