1 //===----------------------------------------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
12 // iterator insert(const_iterator position, value_type&&);
18 #include "MinSequenceContainer.h"
20 #include "min_allocator.h"
21 #include "../helpers.h"
22 #include "test_macros.h"
24 template <class Container
, class Pair
>
25 void do_insert_iter_rv_test() {
28 using R
= typename
M::iterator
;
30 std::same_as
<R
> decltype(auto) r
= m
.insert(m
.end(), P(2, 2));
31 assert(r
== m
.begin());
32 assert(m
.size() == 1);
33 assert(r
->first
== 2);
34 assert(r
->second
== 2);
36 r
= m
.insert(m
.end(), P(1, 1));
37 assert(r
== m
.begin());
38 assert(m
.size() == 2);
39 assert(r
->first
== 1);
40 assert(r
->second
== 1);
42 r
= m
.insert(m
.end(), P(3, 3));
43 assert(r
== std::ranges::prev(m
.end()));
44 assert(m
.size() == 3);
45 assert(r
->first
== 3);
46 assert(r
->second
== 3);
48 r
= m
.insert(m
.end(), P(3, 4));
49 assert(r
== std::ranges::prev(m
.end()));
50 assert(m
.size() == 3);
51 assert(r
->first
== 3);
52 assert(r
->second
== 3);
55 template <class KeyContainer
, class ValueContainer
>
57 using Key
= typename
KeyContainer::value_type
;
58 using Value
= typename
ValueContainer::value_type
;
59 using M
= std::flat_map
<Key
, Value
, std::less
<Key
>, KeyContainer
, ValueContainer
>;
60 using P
= std::pair
<Key
, Value
>;
61 using CP
= std::pair
<const Key
, Value
>;
63 do_insert_iter_rv_test
<M
, P
>();
64 do_insert_iter_rv_test
<M
, CP
>();
67 int main(int, char**) {
68 test
<std::vector
<int>, std::vector
<double>>();
69 test
<std::vector
<int>, std::vector
<MoveOnly
>>();
70 test
<std::deque
<int>, std::deque
<double>>();
71 test
<std::deque
<int>, std::deque
<MoveOnly
>>();
72 test
<MinSequenceContainer
<int>, MinSequenceContainer
<double>>();
73 test
<MinSequenceContainer
<int>, MinSequenceContainer
<MoveOnly
>>();
74 test
<std::vector
<int, min_allocator
<int>>, std::vector
<double, min_allocator
<double>>>();
75 test
<std::vector
<int, min_allocator
<int>>, std::vector
<MoveOnly
, min_allocator
<MoveOnly
>>>();
78 auto insert_func
= [](auto& m
, auto key_arg
, auto value_arg
) {
79 using FlatMap
= std::decay_t
<decltype(m
)>;
80 using value_type
= typename
FlatMap::value_type
;
81 value_type
p(std::piecewise_construct
, std::tuple(key_arg
), std::tuple(value_arg
));
82 m
.insert(m
.begin(), std::move(p
));
84 test_emplace_exception_guarantee(insert_func
);