brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · 6582d47 Raw
96 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// void replace(key_container_type&& key_cont, mapped_container_type&& mapped_cont);14 15#include <algorithm>16#include <deque>17#include <concepts>18#include <flat_map>19#include <functional>20 21#include "MinSequenceContainer.h"22#include "../helpers.h"23#include "test_macros.h"24#include "min_allocator.h"25 26template <class T, class... Args>27concept CanReplace = requires(T t, Args&&... args) { t.replace(std::forward<Args>(args)...); };28 29using Map = std::flat_map<int, int>;30static_assert(CanReplace<Map, std::vector<int>, std::vector<int>>);31static_assert(!CanReplace<Map, const std::vector<int>&, std::vector<int>>);32static_assert(!CanReplace<Map, std::vector<int>, const std::vector<int>&>);33static_assert(!CanReplace<Map, const std::vector<int>&, const std::vector<int>&>);34 35template <class KeyContainer, class ValueContainer>36constexpr void test() {37  using Key   = typename KeyContainer::value_type;38  using Value = typename ValueContainer::value_type;39  using M     = std::flat_map<Key, Value, std::less<Key>, KeyContainer, ValueContainer>;40 41  M m                       = M({1, 2, 3}, {4, 5, 6});42  KeyContainer new_keys     = {7, 8};43  ValueContainer new_values = {9, 10};44  auto expected_keys        = new_keys;45  auto expected_values      = new_values;46  m.replace(std::move(new_keys), std::move(new_values));47  assert(m.size() == 2);48  assert(std::ranges::equal(m.keys(), expected_keys));49  assert(std::ranges::equal(m.values(), expected_values));50}51 52constexpr bool test() {53  test<std::vector<int>, std::vector<double>>();54#ifndef __cpp_lib_constexpr_deque55  if (!TEST_IS_CONSTANT_EVALUATED)56#endif57  {58    test<std::deque<int>, std::vector<double>>();59  }60  test<MinSequenceContainer<int>, MinSequenceContainer<double>>();61  test<std::vector<int, min_allocator<int>>, std::vector<double, min_allocator<double>>>();62 63  if (!TEST_IS_CONSTANT_EVALUATED) {64#ifndef TEST_HAS_NO_EXCEPTIONS65    using KeyContainer   = std::vector<int>;66    using ValueContainer = ThrowOnMoveContainer<int>;67    using M              = std::flat_map<int, int, std::ranges::less, KeyContainer, ValueContainer>;68 69    M m;70    m.emplace(1, 1);71    m.emplace(2, 2);72    try {73      KeyContainer new_keys{3, 4};74      ValueContainer new_values{5, 6};75      m.replace(std::move(new_keys), std::move(new_values));76      assert(false);77    } catch (int) {78      check_invariant(m);79      // In libc++, we clear the map80      LIBCPP_ASSERT(m.size() == 0);81    }82#endif83  }84 85  return true;86}87 88int main(int, char**) {89  test();90#if TEST_STD_VER >= 2691  static_assert(test());92#endif93 94  return 0;95}96