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
10c79549b70e66c251c15dd145c964edb70fa2e2b3Dan Albert// UNSUPPORTED: c++98, c++03
11c79549b70e66c251c15dd145c964edb70fa2e2b3Dan Albert
12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <map>
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// class map
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class... Args>
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//   pair<iterator, bool> emplace(Args&&... args);
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <map>
20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert>
21635ce1d127b617ae194b8aef03f52e810a6b6effHoward Hinnant#include <tuple>
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "../../../Emplaceable.h"
24e27dbcf2dce3505a2c6f2d385216ea4e76655df3Marshall Clow#include "DefaultOnly.h"
25061d0cc4db18d17bf01ed14c5db0be098205bd47Marshall Clow#include "min_allocator.h"
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main()
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::map<int, DefaultOnly> M;
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::pair<M::iterator, bool> R;
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        M m;
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(DefaultOnly::count == 0);
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        R r = m.emplace();
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.second);
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.first == m.begin());
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.size() == 1);
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->first == 0);
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->second == DefaultOnly());
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(DefaultOnly::count == 1);
41b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant        r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
42b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant                                                std::forward_as_tuple());
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.second);
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.first == next(m.begin()));
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.size() == 2);
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(next(m.begin())->first == 1);
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(next(m.begin())->second == DefaultOnly());
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(DefaultOnly::count == 2);
49b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant        r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
50b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant                                                std::forward_as_tuple());
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!r.second);
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.first == next(m.begin()));
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.size() == 2);
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(next(m.begin())->first == 1);
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(next(m.begin())->second == DefaultOnly());
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(DefaultOnly::count == 2);
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(DefaultOnly::count == 0);
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::map<int, Emplaceable> M;
61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::pair<M::iterator, bool> R;
62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        M m;
63b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant        R r = m.emplace(std::piecewise_construct, std::forward_as_tuple(2),
64b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant                                                  std::forward_as_tuple());
65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.second);
66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.first == m.begin());
67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.size() == 1);
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->first == 2);
69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->second == Emplaceable());
70635ce1d127b617ae194b8aef03f52e810a6b6effHoward Hinnant        r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
71635ce1d127b617ae194b8aef03f52e810a6b6effHoward Hinnant                                                std::forward_as_tuple(2, 3.5));
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.second);
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.first == m.begin());
74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.size() == 2);
75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->first == 1);
76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->second == Emplaceable(2, 3.5));
77635ce1d127b617ae194b8aef03f52e810a6b6effHoward Hinnant        r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
78635ce1d127b617ae194b8aef03f52e810a6b6effHoward Hinnant                                                std::forward_as_tuple(2, 3.5));
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!r.second);
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.first == m.begin());
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.size() == 2);
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->first == 1);
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->second == Emplaceable(2, 3.5));
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::map<int, double> M;
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::pair<M::iterator, bool> R;
88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        M m;
89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        R r = m.emplace(M::value_type(2, 3.5));
90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.second);
91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r.first == m.begin());
92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.size() == 1);
93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->first == 2);
94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->second == 3.5);
95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
9670342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant    {
9770342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        typedef std::map<int, DefaultOnly, std::less<int>, min_allocator<std::pair<const int, DefaultOnly>>> M;
9870342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        typedef std::pair<M::iterator, bool> R;
9970342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        M m;
10070342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(DefaultOnly::count == 0);
10170342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        R r = m.emplace();
10270342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.second);
10370342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.first == m.begin());
10470342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.size() == 1);
10570342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->first == 0);
10670342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->second == DefaultOnly());
10770342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(DefaultOnly::count == 1);
108b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant        r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
109b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant                                                std::forward_as_tuple());
11070342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.second);
11170342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.first == next(m.begin()));
11270342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.size() == 2);
11370342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(next(m.begin())->first == 1);
11470342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(next(m.begin())->second == DefaultOnly());
11570342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(DefaultOnly::count == 2);
116b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant        r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
117b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant                                                std::forward_as_tuple());
11870342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(!r.second);
11970342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.first == next(m.begin()));
12070342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.size() == 2);
12170342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(next(m.begin())->first == 1);
12270342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(next(m.begin())->second == DefaultOnly());
12370342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(DefaultOnly::count == 2);
12470342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant    }
12570342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant    assert(DefaultOnly::count == 0);
12670342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant    {
12770342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        typedef std::map<int, Emplaceable, std::less<int>, min_allocator<std::pair<const int, Emplaceable>>> M;
12870342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        typedef std::pair<M::iterator, bool> R;
12970342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        M m;
130b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant        R r = m.emplace(std::piecewise_construct, std::forward_as_tuple(2),
131b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant                                                  std::forward_as_tuple());
13270342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.second);
13370342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.first == m.begin());
13470342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.size() == 1);
13570342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->first == 2);
13670342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->second == Emplaceable());
13770342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
13870342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant                                                std::forward_as_tuple(2, 3.5));
13970342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.second);
14070342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.first == m.begin());
14170342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.size() == 2);
14270342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->first == 1);
14370342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->second == Emplaceable(2, 3.5));
14470342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
14570342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant                                                std::forward_as_tuple(2, 3.5));
14670342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(!r.second);
14770342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.first == m.begin());
14870342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.size() == 2);
14970342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->first == 1);
15070342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->second == Emplaceable(2, 3.5));
15170342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant    }
15270342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant    {
15370342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        typedef std::map<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
15470342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        typedef std::pair<M::iterator, bool> R;
15570342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        M m;
15670342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        R r = m.emplace(M::value_type(2, 3.5));
15770342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.second);
15870342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r.first == m.begin());
15970342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.size() == 1);
16070342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->first == 2);
16170342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->second == 3.5);
16270342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant    }
163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
164