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-exception
6//
7//===----------------------------------------------------------------------===//
8
9// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
10
11// <flat_map>
12
13// class flat_multimap
14
15// void swap(flat_multimap& y) noexcept;
16
17#include <flat_map>
18#include <cassert>
19#include <deque>
20#include <functional>
21#include <vector>
22
23#include "MinSequenceContainer.h"
24#include "MoveOnly.h"
25#include "min_allocator.h"
26#include "test_macros.h"
27#include "../helpers.h"
28
29// test noexcept
30
31template <class T>
32concept NoExceptMemberSwap = requires(T t1, T t2) {
33 { t1.swap(t2) } noexcept;
34};
35
36static_assert(NoExceptMemberSwap<std::flat_multimap<int, int>>);
37#ifndef TEST_HAS_NO_EXCEPTIONS
38static_assert(NoExceptMemberSwap<
39 std::flat_multimap<int, int, std::less<int>, ThrowOnMoveContainer<int>, ThrowOnMoveContainer<int>>>);
40#endif
41
42template <class KeyContainer, class ValueContainer>
43void test() {
44 using Key = typename KeyContainer::value_type;
45 using Value = typename ValueContainer::value_type;
46 using M = std::flat_multimap<Key, Value, std::less<Key>, KeyContainer, ValueContainer>;
47 using V = std::pair<const Key, Value>;
48 {
49 M m1;
50 M m2;
51 M m1_save = m1;
52 M m2_save = m2;
53 m1.swap(m2);
54 assert(m1 == m2_save);
55 assert(m2 == m1_save);
56 }
57 {
58 V ar2[] = {V(5, 5), V(5, 6), V(7, 7), V(8, 8), V(9, 9), V(10, 10), V(10, 11), V(12, 12)};
59 M m1;
60 M m2(ar2, ar2 + sizeof(ar2) / sizeof(ar2[0]));
61 M m1_save = m1;
62 M m2_save = m2;
63 m1.swap(m2);
64 assert(m1 == m2_save);
65 assert(m2 == m1_save);
66 }
67 {
68 V ar1[] = {V(1, 1), V(1, 2), V(3, 3), V(4, 4)};
69 M m1(ar1, ar1 + sizeof(ar1) / sizeof(ar1[0]));
70 M m2;
71 M m1_save = m1;
72 M m2_save = m2;
73 m1.swap(m2);
74 assert(m1 == m2_save);
75 assert(m2 == m1_save);
76 }
77 {
78 V ar1[] = {V(1, 1), V(1, 2), V(3, 3), V(4, 4)};
79 V ar2[] = {V(5, 5), V(5, 6), V(7, 7), V(8, 8), V(9, 9), V(10, 10), V(10, 11), V(12, 12)};
80 M m1(ar1, ar1 + sizeof(ar1) / sizeof(ar1[0]));
81 M m2(ar2, ar2 + sizeof(ar2) / sizeof(ar2[0]));
82 M m1_save = m1;
83 M m2_save = m2;
84 m1.swap(m2);
85 assert(m1 == m2_save);
86 assert(m2 == m1_save);
87 }
88}
89
90int main(int, char**) {
91 test<std::vector<int>, std::vector<double>>();
92 test<std::deque<int>, std::vector<double>>();
93 test<MinSequenceContainer<int>, MinSequenceContainer<double>>();
94 test<std::vector<int, min_allocator<int>>, std::vector<double, min_allocator<double>>>();
95
96 return 0;
97}
98

source code of libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/swap_member.pass.cpp