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