emplace.pass.cpp revision 70342b99e227912742972b754ad86e75c5d7eefb
1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant//                     The LLVM Compiler Infrastructure
4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <map>
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// class map
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class... Args>
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//   pair<iterator, bool> emplace(Args&&... args);
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <map>
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert>
19635ce1d127b617ae194b8aef03f52e810a6b6effHoward Hinnant#include <tuple>
20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "../../../Emplaceable.h"
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "../../../DefaultOnly.h"
2370342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant#include "../../../min_allocator.h"
24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main()
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
2773d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::map<int, DefaultOnly> M;
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::pair<M::iterator, bool> R;
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        M m;
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(DefaultOnly::count == 0);
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        R r = m.emplace();
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.second);
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.first == m.begin());
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.size() == 1);
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->first == 0);
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->second == DefaultOnly());
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(DefaultOnly::count == 1);
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        r = m.emplace(1);
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.second);
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.first == next(m.begin()));
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.size() == 2);
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(next(m.begin())->first == 1);
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(next(m.begin())->second == DefaultOnly());
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(DefaultOnly::count == 2);
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        r = m.emplace(1);
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!r.second);
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.first == next(m.begin()));
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.size() == 2);
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(next(m.begin())->first == 1);
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(next(m.begin())->second == DefaultOnly());
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(DefaultOnly::count == 2);
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(DefaultOnly::count == 0);
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::map<int, Emplaceable> M;
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::pair<M::iterator, bool> R;
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        M m;
60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        R r = m.emplace(2);
61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.second);
62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.first == m.begin());
63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.size() == 1);
64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->first == 2);
65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->second == Emplaceable());
66635ce1d127b617ae194b8aef03f52e810a6b6effHoward Hinnant        r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
67635ce1d127b617ae194b8aef03f52e810a6b6effHoward Hinnant                                                std::forward_as_tuple(2, 3.5));
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.second);
69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.first == m.begin());
70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.size() == 2);
71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->first == 1);
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->second == Emplaceable(2, 3.5));
73635ce1d127b617ae194b8aef03f52e810a6b6effHoward Hinnant        r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
74635ce1d127b617ae194b8aef03f52e810a6b6effHoward Hinnant                                                std::forward_as_tuple(2, 3.5));
75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!r.second);
76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.first == m.begin());
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.size() == 2);
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->first == 1);
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->second == Emplaceable(2, 3.5));
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::map<int, double> M;
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::pair<M::iterator, bool> R;
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        M m;
85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        R r = m.emplace(M::value_type(2, 3.5));
86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.second);
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.first == m.begin());
88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.size() == 1);
89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->first == 2);
90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->second == 3.5);
91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
9270342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant#if __cplusplus >= 201103L
9370342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant    {
9470342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        typedef std::map<int, DefaultOnly, std::less<int>, min_allocator<std::pair<const int, DefaultOnly>>> M;
9570342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        typedef std::pair<M::iterator, bool> R;
9670342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        M m;
9770342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(DefaultOnly::count == 0);
9870342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        R r = m.emplace();
9970342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.second);
10070342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.first == m.begin());
10170342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.size() == 1);
10270342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->first == 0);
10370342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->second == DefaultOnly());
10470342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(DefaultOnly::count == 1);
10570342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        r = m.emplace(1);
10670342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.second);
10770342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.first == next(m.begin()));
10870342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.size() == 2);
10970342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(next(m.begin())->first == 1);
11070342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(next(m.begin())->second == DefaultOnly());
11170342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(DefaultOnly::count == 2);
11270342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        r = m.emplace(1);
11370342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(!r.second);
11470342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.first == next(m.begin()));
11570342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.size() == 2);
11670342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(next(m.begin())->first == 1);
11770342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(next(m.begin())->second == DefaultOnly());
11870342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(DefaultOnly::count == 2);
11970342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant    }
12070342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant    assert(DefaultOnly::count == 0);
12170342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant    {
12270342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        typedef std::map<int, Emplaceable, std::less<int>, min_allocator<std::pair<const int, Emplaceable>>> M;
12370342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        typedef std::pair<M::iterator, bool> R;
12470342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        M m;
12570342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        R r = m.emplace(2);
12670342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.second);
12770342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.first == m.begin());
12870342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.size() == 1);
12970342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->first == 2);
13070342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->second == Emplaceable());
13170342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
13270342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant                                                std::forward_as_tuple(2, 3.5));
13370342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.second);
13470342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.first == m.begin());
13570342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.size() == 2);
13670342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->first == 1);
13770342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->second == Emplaceable(2, 3.5));
13870342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
13970342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant                                                std::forward_as_tuple(2, 3.5));
14070342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(!r.second);
14170342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.first == m.begin());
14270342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.size() == 2);
14370342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->first == 1);
14470342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->second == Emplaceable(2, 3.5));
14570342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant    }
14670342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant    {
14770342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        typedef std::map<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
14870342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        typedef std::pair<M::iterator, bool> R;
14970342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        M m;
15070342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        R r = m.emplace(M::value_type(2, 3.5));
15170342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.second);
15270342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.first == m.begin());
15370342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.size() == 1);
15470342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->first == 2);
15570342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->second == 3.5);
15670342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant    }
15770342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant#endif
15873d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
160