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 multimap
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class... Args>
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//   iterator emplace_hint(const_iterator position, Args&&... args);
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <map>
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert>
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "../../../Emplaceable.h"
21e27dbcf2dce3505a2c6f2d385216ea4e76655df3Marshall Clow#include "DefaultOnly.h"
22061d0cc4db18d17bf01ed14c5db0be098205bd47Marshall Clow#include "min_allocator.h"
23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main()
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
2673d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::multimap<int, DefaultOnly> M;
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef M::iterator R;
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        M m;
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(DefaultOnly::count == 0);
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        R r = m.emplace_hint(m.cend());
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r == m.begin());
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.size() == 1);
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->first == 0);
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->second == DefaultOnly());
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(DefaultOnly::count == 1);
38b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant        r = m.emplace_hint(m.cend(), std::piecewise_construct,
39b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant                                       std::forward_as_tuple(1),
40b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant                                       std::forward_as_tuple());
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r == next(m.begin()));
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.size() == 2);
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(next(m.begin())->first == 1);
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(next(m.begin())->second == DefaultOnly());
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(DefaultOnly::count == 2);
46b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant        r = m.emplace_hint(m.cend(), std::piecewise_construct,
47b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant                                       std::forward_as_tuple(1),
48b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant                                       std::forward_as_tuple());
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r == next(m.begin(), 2));
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.size() == 3);
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(next(m.begin(), 2)->first == 1);
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(next(m.begin(), 2)->second == DefaultOnly());
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(DefaultOnly::count == 3);
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(DefaultOnly::count == 0);
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::multimap<int, Emplaceable> M;
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef M::iterator R;
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        M m;
60b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant        R r = m.emplace_hint(m.cend(), std::piecewise_construct,
61b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant                                       std::forward_as_tuple(2),
62b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant                                       std::forward_as_tuple());
63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r == m.begin());
64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.size() == 1);
65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->first == 2);
66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->second == Emplaceable());
67635ce1d127b617ae194b8aef03f52e810a6b6effHoward Hinnant        r = m.emplace_hint(m.cbegin(), std::piecewise_construct,
68635ce1d127b617ae194b8aef03f52e810a6b6effHoward Hinnant                                       std::forward_as_tuple(1),
69635ce1d127b617ae194b8aef03f52e810a6b6effHoward Hinnant                                       std::forward_as_tuple(2, 3.5));
70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r == m.begin());
71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.size() == 2);
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->first == 1);
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.begin()->second == Emplaceable(2, 3.5));
74635ce1d127b617ae194b8aef03f52e810a6b6effHoward Hinnant        r = m.emplace_hint(m.cbegin(), std::piecewise_construct,
75635ce1d127b617ae194b8aef03f52e810a6b6effHoward Hinnant                                       std::forward_as_tuple(1),
76635ce1d127b617ae194b8aef03f52e810a6b6effHoward Hinnant                                       std::forward_as_tuple(3, 3.5));
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r == m.begin());
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(m.size() == 3);
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r->first == 1);
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r->second == Emplaceable(3, 3.5));
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::multimap<int, double> M;
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef M::iterator R;
85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        M m;
86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        R r = m.emplace_hint(m.cend(), M::value_type(2, 3.5));
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(r == 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::multimap<int, DefaultOnly, std::less<int>, min_allocator<std::pair<const int, DefaultOnly>>> M;
9570342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        typedef M::iterator R;
9670342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        M m;
9770342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(DefaultOnly::count == 0);
9870342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        R r = m.emplace_hint(m.cend());
9970342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r == m.begin());
10070342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.size() == 1);
10170342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->first == 0);
10270342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->second == DefaultOnly());
10370342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(DefaultOnly::count == 1);
104b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant        r = m.emplace_hint(m.cend(), std::piecewise_construct,
105b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant                                       std::forward_as_tuple(1),
106b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant                                       std::forward_as_tuple());
10770342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r == 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);
112b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant        r = m.emplace_hint(m.cend(), std::piecewise_construct,
113b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant                                       std::forward_as_tuple(1),
114b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant                                       std::forward_as_tuple());
11570342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r == next(m.begin(), 2));
11670342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.size() == 3);
11770342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(next(m.begin(), 2)->first == 1);
11870342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(next(m.begin(), 2)->second == DefaultOnly());
11970342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(DefaultOnly::count == 3);
12070342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant    }
12170342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant    assert(DefaultOnly::count == 0);
12270342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant    {
12370342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        typedef std::multimap<int, Emplaceable, std::less<int>, min_allocator<std::pair<const int, Emplaceable>>> M;
12470342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        typedef M::iterator R;
12570342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        M m;
126b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant        R r = m.emplace_hint(m.cend(), std::piecewise_construct,
127b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant                                       std::forward_as_tuple(2),
128b66e1c3f961179f8f5466061a54d6530d1749550Howard Hinnant                                       std::forward_as_tuple());
12970342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r == m.begin());
13070342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.size() == 1);
13170342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->first == 2);
13270342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->second == Emplaceable());
13370342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        r = m.emplace_hint(m.cbegin(), std::piecewise_construct,
13470342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant                                       std::forward_as_tuple(1),
13570342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant                                       std::forward_as_tuple(2, 3.5));
13670342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r == m.begin());
13770342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.size() == 2);
13870342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->first == 1);
13970342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->second == Emplaceable(2, 3.5));
14070342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        r = m.emplace_hint(m.cbegin(), std::piecewise_construct,
14170342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant                                       std::forward_as_tuple(1),
14270342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant                                       std::forward_as_tuple(3, 3.5));
14370342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r == m.begin());
14470342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.size() == 3);
14570342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r->first == 1);
14670342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r->second == Emplaceable(3, 3.5));
14770342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant    }
14870342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant    {
14970342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
15070342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        typedef M::iterator R;
15170342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        M m;
15270342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        R r = m.emplace_hint(m.cend(), M::value_type(2, 3.5));
15370342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(r == m.begin());
15470342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.size() == 1);
15570342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->first == 2);
15670342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant        assert(m.begin()->second == 3.5);
15770342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant    }
15870342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant#endif
15973d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
161