insert_hint_rvalue.pass.cpp revision 5e57142c5902c3f73a6fdcb8cab55e88ffb43a56
16fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org//===----------------------------------------------------------------------===//
26fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org//
36fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org//                     The LLVM Compiler Infrastructure
46fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org//
56fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org// This file is dual licensed under the MIT and the University of Illinois Open
66fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org// Source Licenses. See LICENSE.TXT for details.
76fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org//
8b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com//===----------------------------------------------------------------------===//
96fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org// <unordered_map>
11b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com
1210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org// template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
13b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com//           class Alloc = allocator<pair<const Key, T>>>
14b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com// class unordered_map
15b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com
16b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com// template <class P,
17b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com//           class = typename enable_if<is_convertible<P, value_type>::value>::type>
18b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com//     iterator insert(const_iterator p, P&& x);
19db9ac6c76553d95d7eb35e2bcf84c16a7901c3c3fgalligan@chromium.org
206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#if _LIBCPP_DEBUG >= 1
216fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))
227765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org#endif
23b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com
246fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include <unordered_map>
25ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org#include <cassert>
26b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com
27b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com#include "../../../MoveOnly.h"
28b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com#include "../../../min_allocator.h"
29b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com
30b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.comint main()
31b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com{
320d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    {
330d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org        typedef std::unordered_map<double, int> C;
34b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        typedef C::iterator R;
35b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        typedef std::pair<double, short> P;
36b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        C c;
37b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        C::const_iterator e = c.end();
38b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        R r = c.insert(e, P(3.5, 3));
39b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        assert(c.size() == 1);
406fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        assert(r->first == 3.5);
416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        assert(r->second == 3);
42b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com
43b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        r = c.insert(c.end(), P(3.5, 4));
44b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        assert(c.size() == 1);
45b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        assert(r->first == 3.5);
4653a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org        assert(r->second == 3);
47b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com
48b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        r = c.insert(c.end(), P(4.5, 4));
49b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        assert(c.size() == 2);
50b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        assert(r->first == 4.5);
51b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        assert(r->second == 4);
52b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com
53b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        r = c.insert(c.end(), P(5.5, 4));
54b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        assert(c.size() == 3);
55b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        assert(r->first == 5.5);
56b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        assert(r->second == 4);
57b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com    }
58b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
59b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com    {
60b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        typedef std::unordered_map<MoveOnly, MoveOnly> C;
61b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        typedef C::iterator R;
62b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        typedef std::pair<MoveOnly, MoveOnly> P;
636fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        C c;
6483d2f0fd2cf05bc0c31ad217ed7675c2f1e92e4dgrunell@chromium.org        C::const_iterator e = c.end();
65f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org        R r = c.insert(e, P(3, 3));
66b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        assert(c.size() == 1);
676fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        assert(r->first == 3);
68b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        assert(r->second == 3);
69b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com
70daa317752787969f0b39e74dacf35acc11e4b79afgalligan@chromium.org        r = c.insert(c.end(), P(3, 4));
716fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        assert(c.size() == 1);
72b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        assert(r->first == 3);
736fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        assert(r->second == 3);
74b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com
75b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        r = c.insert(c.end(), P(4, 4));
76b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        assert(c.size() == 2);
77b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        assert(r->first == 4);
78b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        assert(r->second == 4);
796fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
806fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        r = c.insert(c.end(), P(5, 4));
81b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        assert(c.size() == 3);
826fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        assert(r->first == 5);
83b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com        assert(r->second == 4);
84b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com    }
85b3c3acc1cc5528d92ba97dee9602ad7fb87b53bfchrome-bot@google.com#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
866fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#if __cplusplus >= 201103L
8793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    {
8888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org        typedef std::unordered_map<double, int, std::hash<double>, std::equal_to<double>,
89d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                            min_allocator<std::pair<const double, int>>> C;
9041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        typedef C::iterator R;
9183d2f0fd2cf05bc0c31ad217ed7675c2f1e92e4dgrunell@chromium.org        typedef std::pair<double, short> P;
926fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        C c;
9341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        C::const_iterator e = c.end();
94d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org        R r = c.insert(e, P(3.5, 3));
956fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        assert(c.size() == 1);
96ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org        assert(r->first == 3.5);
9788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org        assert(r->second == 3);
9841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
99e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org        r = c.insert(c.end(), P(3.5, 4));
10087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        assert(c.size() == 1);
1016fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        assert(r->first == 3.5);
102        assert(r->second == 3);
103
104        r = c.insert(c.end(), P(4.5, 4));
105        assert(c.size() == 2);
106        assert(r->first == 4.5);
107        assert(r->second == 4);
108
109        r = c.insert(c.end(), P(5.5, 4));
110        assert(c.size() == 3);
111        assert(r->first == 5.5);
112        assert(r->second == 4);
113    }
114#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
115    {
116        typedef std::unordered_map<MoveOnly, MoveOnly, std::hash<MoveOnly>, std::equal_to<MoveOnly>,
117                            min_allocator<std::pair<const MoveOnly, MoveOnly>>> C;
118        typedef C::iterator R;
119        typedef std::pair<MoveOnly, MoveOnly> P;
120        C c;
121        C::const_iterator e = c.end();
122        R r = c.insert(e, P(3, 3));
123        assert(c.size() == 1);
124        assert(r->first == 3);
125        assert(r->second == 3);
126
127        r = c.insert(c.end(), P(3, 4));
128        assert(c.size() == 1);
129        assert(r->first == 3);
130        assert(r->second == 3);
131
132        r = c.insert(c.end(), P(4, 4));
133        assert(c.size() == 2);
134        assert(r->first == 4);
135        assert(r->second == 4);
136
137        r = c.insert(c.end(), P(5, 4));
138        assert(c.size() == 3);
139        assert(r->first == 5);
140        assert(r->second == 4);
141    }
142#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
143#if _LIBCPP_DEBUG >= 1
144    {
145        typedef std::unordered_map<double, int> C;
146        typedef C::iterator R;
147        typedef C::value_type P;
148        C c;
149        C c2;
150        C::const_iterator e = c2.end();
151        R r = c.insert(e, P(3.5, 3));
152        assert(false);
153    }
154#endif
155#endif
156}
157