• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  //===----------------------------------------------------------------------===//
2  //
3  //                     The LLVM Compiler Infrastructure
4  //
5  // This file is dual licensed under the MIT and the University of Illinois Open
6  // Source Licenses. See LICENSE.TXT for details.
7  //
8  //===----------------------------------------------------------------------===//
9  
10  // <map>
11  
12  // class multimap
13  
14  // template <class... Args>
15  //   iterator emplace_hint(const_iterator position, Args&&... args);
16  
17  #include <map>
18  #include <cassert>
19  
20  #include "../../../Emplaceable.h"
21  #include "DefaultOnly.h"
22  #include "min_allocator.h"
23  
main()24  int main()
25  {
26  #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
27      {
28          typedef std::multimap<int, DefaultOnly> M;
29          typedef M::iterator R;
30          M m;
31          assert(DefaultOnly::count == 0);
32          R r = m.emplace_hint(m.cend());
33          assert(r == m.begin());
34          assert(m.size() == 1);
35          assert(m.begin()->first == 0);
36          assert(m.begin()->second == DefaultOnly());
37          assert(DefaultOnly::count == 1);
38          r = m.emplace_hint(m.cend(), std::piecewise_construct,
39                                         std::forward_as_tuple(1),
40                                         std::forward_as_tuple());
41          assert(r == next(m.begin()));
42          assert(m.size() == 2);
43          assert(next(m.begin())->first == 1);
44          assert(next(m.begin())->second == DefaultOnly());
45          assert(DefaultOnly::count == 2);
46          r = m.emplace_hint(m.cend(), std::piecewise_construct,
47                                         std::forward_as_tuple(1),
48                                         std::forward_as_tuple());
49          assert(r == next(m.begin(), 2));
50          assert(m.size() == 3);
51          assert(next(m.begin(), 2)->first == 1);
52          assert(next(m.begin(), 2)->second == DefaultOnly());
53          assert(DefaultOnly::count == 3);
54      }
55      assert(DefaultOnly::count == 0);
56      {
57          typedef std::multimap<int, Emplaceable> M;
58          typedef M::iterator R;
59          M m;
60          R r = m.emplace_hint(m.cend(), std::piecewise_construct,
61                                         std::forward_as_tuple(2),
62                                         std::forward_as_tuple());
63          assert(r == m.begin());
64          assert(m.size() == 1);
65          assert(m.begin()->first == 2);
66          assert(m.begin()->second == Emplaceable());
67          r = m.emplace_hint(m.cbegin(), std::piecewise_construct,
68                                         std::forward_as_tuple(1),
69                                         std::forward_as_tuple(2, 3.5));
70          assert(r == m.begin());
71          assert(m.size() == 2);
72          assert(m.begin()->first == 1);
73          assert(m.begin()->second == Emplaceable(2, 3.5));
74          r = m.emplace_hint(m.cbegin(), std::piecewise_construct,
75                                         std::forward_as_tuple(1),
76                                         std::forward_as_tuple(3, 3.5));
77          assert(r == m.begin());
78          assert(m.size() == 3);
79          assert(r->first == 1);
80          assert(r->second == Emplaceable(3, 3.5));
81      }
82      {
83          typedef std::multimap<int, double> M;
84          typedef M::iterator R;
85          M m;
86          R r = m.emplace_hint(m.cend(), M::value_type(2, 3.5));
87          assert(r == m.begin());
88          assert(m.size() == 1);
89          assert(m.begin()->first == 2);
90          assert(m.begin()->second == 3.5);
91      }
92  #if __cplusplus >= 201103L
93      {
94          typedef std::multimap<int, DefaultOnly, std::less<int>, min_allocator<std::pair<const int, DefaultOnly>>> M;
95          typedef M::iterator R;
96          M m;
97          assert(DefaultOnly::count == 0);
98          R r = m.emplace_hint(m.cend());
99          assert(r == m.begin());
100          assert(m.size() == 1);
101          assert(m.begin()->first == 0);
102          assert(m.begin()->second == DefaultOnly());
103          assert(DefaultOnly::count == 1);
104          r = m.emplace_hint(m.cend(), std::piecewise_construct,
105                                         std::forward_as_tuple(1),
106                                         std::forward_as_tuple());
107          assert(r == next(m.begin()));
108          assert(m.size() == 2);
109          assert(next(m.begin())->first == 1);
110          assert(next(m.begin())->second == DefaultOnly());
111          assert(DefaultOnly::count == 2);
112          r = m.emplace_hint(m.cend(), std::piecewise_construct,
113                                         std::forward_as_tuple(1),
114                                         std::forward_as_tuple());
115          assert(r == next(m.begin(), 2));
116          assert(m.size() == 3);
117          assert(next(m.begin(), 2)->first == 1);
118          assert(next(m.begin(), 2)->second == DefaultOnly());
119          assert(DefaultOnly::count == 3);
120      }
121      assert(DefaultOnly::count == 0);
122      {
123          typedef std::multimap<int, Emplaceable, std::less<int>, min_allocator<std::pair<const int, Emplaceable>>> M;
124          typedef M::iterator R;
125          M m;
126          R r = m.emplace_hint(m.cend(), std::piecewise_construct,
127                                         std::forward_as_tuple(2),
128                                         std::forward_as_tuple());
129          assert(r == m.begin());
130          assert(m.size() == 1);
131          assert(m.begin()->first == 2);
132          assert(m.begin()->second == Emplaceable());
133          r = m.emplace_hint(m.cbegin(), std::piecewise_construct,
134                                         std::forward_as_tuple(1),
135                                         std::forward_as_tuple(2, 3.5));
136          assert(r == m.begin());
137          assert(m.size() == 2);
138          assert(m.begin()->first == 1);
139          assert(m.begin()->second == Emplaceable(2, 3.5));
140          r = m.emplace_hint(m.cbegin(), std::piecewise_construct,
141                                         std::forward_as_tuple(1),
142                                         std::forward_as_tuple(3, 3.5));
143          assert(r == m.begin());
144          assert(m.size() == 3);
145          assert(r->first == 1);
146          assert(r->second == Emplaceable(3, 3.5));
147      }
148      {
149          typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
150          typedef M::iterator R;
151          M m;
152          R r = m.emplace_hint(m.cend(), M::value_type(2, 3.5));
153          assert(r == m.begin());
154          assert(m.size() == 1);
155          assert(m.begin()->first == 2);
156          assert(m.begin()->second == 3.5);
157      }
158  #endif
159  #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
160  }
161