brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.4 KiB · 841a793 Raw
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