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// <unordered_map>
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//           class Alloc = allocator<pair<const Key, T>>>
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// class unordered_multimap
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// unordered_multimap(unordered_multimap&& u, const allocator_type& a);
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <iostream>
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <unordered_map>
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <string>
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert>
23f836d531b4146465342939fe32ae47d157ee07b2Howard Hinnant#include <cfloat>
24e5e9bff62a4ae030ca42d312dc73f03d9cf61c4eMarshall Clow#include <cmath>
2598605940df7a54649618c541b972a308cccaade9Stephan T. Lavavej#include <cstddef>
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
270809a7f62b7e43e2e5f3a31f66dd8cf097cfeb71Eric Fiselier#include "test_macros.h"
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "../../../test_compare.h"
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "../../../test_hash.h"
301b92188a82b01e76ac6e8ad5f997293c2a078adcMarshall Clow#include "test_allocator.h"
31061d0cc4db18d17bf01ed14c5db0be098205bd47Marshall Clow#include "min_allocator.h"
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main()
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
3573d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::pair<int, std::string> P;
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef test_allocator<std::pair<const int, std::string>> A;
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::unordered_multimap<int, std::string,
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                   test_hash<std::hash<int> >,
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                   test_compare<std::equal_to<int> >,
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                   A
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                   > C;
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        P a[] =
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            P(1, "one"),
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            P(2, "two"),
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            P(3, "three"),
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            P(4, "four"),
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            P(1, "four"),
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            P(2, "four"),
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        };
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        C c0(a, a + sizeof(a)/sizeof(a[0]),
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            7,
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            test_hash<std::hash<int> >(8),
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            test_compare<std::equal_to<int> >(9),
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            A(10)
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant           );
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        C c(std::move(c0), A(12));
60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.bucket_count() >= 7);
61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.size() == 6);
62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::pair<C::const_iterator, C::const_iterator> Eq;
63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        Eq eq = c.equal_range(1);
64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::distance(eq.first, eq.second) == 2);
65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        C::const_iterator i = eq.first;
66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->first == 1);
67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->second == "one");
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ++i;
69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->first == 1);
70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->second == "four");
71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        eq = c.equal_range(2);
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::distance(eq.first, eq.second) == 2);
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        i = eq.first;
74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->first == 2);
75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->second == "two");
76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ++i;
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->first == 2);
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->second == "four");
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        eq = c.equal_range(3);
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::distance(eq.first, eq.second) == 1);
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        i = eq.first;
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->first == 3);
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->second == "three");
85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        eq = c.equal_range(4);
86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::distance(eq.first, eq.second) == 1);
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        i = eq.first;
88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->first == 4);
89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->second == "four");
9098605940df7a54649618c541b972a308cccaade9Stephan T. Lavavej        assert(static_cast<std::size_t>(std::distance(c.begin(), c.end())) == c.size());
9198605940df7a54649618c541b972a308cccaade9Stephan T. Lavavej        assert(static_cast<std::size_t>(std::distance(c.cbegin(), c.cend())) == c.size());
92e5e9bff62a4ae030ca42d312dc73f03d9cf61c4eMarshall Clow        assert(std::fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON);
93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.max_load_factor() == 1);
94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.hash_function() == test_hash<std::hash<int> >(8));
95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.key_eq() == test_compare<std::equal_to<int> >(9));
96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert((c.get_allocator() == test_allocator<std::pair<const int, std::string> >(12)));
97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c0.empty());
99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::pair<int, std::string> P;
102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef test_allocator<std::pair<const int, std::string>> A;
103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::unordered_multimap<int, std::string,
104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                   test_hash<std::hash<int> >,
105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                   test_compare<std::equal_to<int> >,
106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                   A
107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                   > C;
108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        P a[] =
109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            P(1, "one"),
111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            P(2, "two"),
112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            P(3, "three"),
113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            P(4, "four"),
114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            P(1, "four"),
115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            P(2, "four"),
116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        };
117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        C c0(a, a + sizeof(a)/sizeof(a[0]),
118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            7,
119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            test_hash<std::hash<int> >(8),
120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            test_compare<std::equal_to<int> >(9),
121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            A(10)
122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant           );
123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        C c(std::move(c0), A(10));
1240809a7f62b7e43e2e5f3a31f66dd8cf097cfeb71Eric Fiselier        LIBCPP_ASSERT(c.bucket_count() == 7);
125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.size() == 6);
126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::pair<C::const_iterator, C::const_iterator> Eq;
127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        Eq eq = c.equal_range(1);
128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::distance(eq.first, eq.second) == 2);
129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        C::const_iterator i = eq.first;
130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->first == 1);
131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->second == "one");
132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ++i;
133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->first == 1);
134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->second == "four");
135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        eq = c.equal_range(2);
136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::distance(eq.first, eq.second) == 2);
137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        i = eq.first;
138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->first == 2);
139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->second == "two");
140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ++i;
141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->first == 2);
142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->second == "four");
143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        eq = c.equal_range(3);
145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::distance(eq.first, eq.second) == 1);
146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        i = eq.first;
147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->first == 3);
148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->second == "three");
149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        eq = c.equal_range(4);
150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::distance(eq.first, eq.second) == 1);
151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        i = eq.first;
152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->first == 4);
153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(i->second == "four");
15498605940df7a54649618c541b972a308cccaade9Stephan T. Lavavej        assert(static_cast<std::size_t>(std::distance(c.begin(), c.end())) == c.size());
15598605940df7a54649618c541b972a308cccaade9Stephan T. Lavavej        assert(static_cast<std::size_t>(std::distance(c.cbegin(), c.cend())) == c.size());
156e5e9bff62a4ae030ca42d312dc73f03d9cf61c4eMarshall Clow        assert(std::fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON);
157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.max_load_factor() == 1);
158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.hash_function() == test_hash<std::hash<int> >(8));
159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.key_eq() == test_compare<std::equal_to<int> >(9));
160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert((c.get_allocator() == test_allocator<std::pair<const int, std::string> >(10)));
161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c0.empty());
163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
164d24c465beaec2fe9a0e365e6379cd5d3acaeb2caEric Fiselier#if TEST_STD_VER >= 11
1657a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant    {
1667a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        typedef std::pair<int, std::string> P;
1677a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        typedef min_allocator<std::pair<const int, std::string>> A;
1687a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        typedef std::unordered_multimap<int, std::string,
1697a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant                                   test_hash<std::hash<int> >,
1707a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant                                   test_compare<std::equal_to<int> >,
1717a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant                                   A
1727a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant                                   > C;
1737a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        P a[] =
1747a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        {
1757a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant            P(1, "one"),
1767a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant            P(2, "two"),
1777a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant            P(3, "three"),
1787a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant            P(4, "four"),
1797a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant            P(1, "four"),
1807a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant            P(2, "four"),
1817a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        };
1827a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        C c0(a, a + sizeof(a)/sizeof(a[0]),
1837a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant            7,
1847a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant            test_hash<std::hash<int> >(8),
1857a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant            test_compare<std::equal_to<int> >(9),
1867a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant            A()
1877a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant           );
1887a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        C c(std::move(c0), A());
1890809a7f62b7e43e2e5f3a31f66dd8cf097cfeb71Eric Fiselier        LIBCPP_ASSERT(c.bucket_count() == 7);
1907a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        assert(c.size() == 6);
1917a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        typedef std::pair<C::const_iterator, C::const_iterator> Eq;
1927a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        Eq eq = c.equal_range(1);
1937a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        assert(std::distance(eq.first, eq.second) == 2);
1947a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        C::const_iterator i = eq.first;
1957a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        assert(i->first == 1);
1967a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        assert(i->second == "one");
1977a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        ++i;
1987a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        assert(i->first == 1);
1997a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        assert(i->second == "four");
2007a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        eq = c.equal_range(2);
2017a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        assert(std::distance(eq.first, eq.second) == 2);
2027a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        i = eq.first;
2037a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        assert(i->first == 2);
2047a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        assert(i->second == "two");
2057a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        ++i;
2067a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        assert(i->first == 2);
2077a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        assert(i->second == "four");
2087a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant
2097a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        eq = c.equal_range(3);
2107a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        assert(std::distance(eq.first, eq.second) == 1);
2117a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        i = eq.first;
2127a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        assert(i->first == 3);
2137a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        assert(i->second == "three");
2147a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        eq = c.equal_range(4);
2157a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        assert(std::distance(eq.first, eq.second) == 1);
2167a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        i = eq.first;
2177a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        assert(i->first == 4);
2187a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        assert(i->second == "four");
21998605940df7a54649618c541b972a308cccaade9Stephan T. Lavavej        assert(static_cast<std::size_t>(std::distance(c.begin(), c.end())) == c.size());
22098605940df7a54649618c541b972a308cccaade9Stephan T. Lavavej        assert(static_cast<std::size_t>(std::distance(c.cbegin(), c.cend())) == c.size());
221e5e9bff62a4ae030ca42d312dc73f03d9cf61c4eMarshall Clow        assert(std::fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON);
2227a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        assert(c.max_load_factor() == 1);
2237a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        assert(c.hash_function() == test_hash<std::hash<int> >(8));
2247a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        assert(c.key_eq() == test_compare<std::equal_to<int> >(9));
2257a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        assert((c.get_allocator() == min_allocator<std::pair<const int, std::string> >()));
2267a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant
2277a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant        assert(c0.empty());
2287a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant    }
229d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow    {
230d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        typedef std::pair<int, std::string> P;
231d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        typedef explicit_allocator<std::pair<const int, std::string>> A;
232d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        typedef std::unordered_multimap<int, std::string,
233d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow                                   test_hash<std::hash<int> >,
234d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow                                   test_compare<std::equal_to<int> >,
235d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow                                   A
236d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow                                   > C;
237d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        P a[] =
238d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        {
239d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow            P(1, "one"),
240d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow            P(2, "two"),
241d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow            P(3, "three"),
242d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow            P(4, "four"),
243d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow            P(1, "four"),
244d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow            P(2, "four"),
245d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        };
246d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        C c0(a, a + sizeof(a)/sizeof(a[0]),
247d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow            7,
248d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow            test_hash<std::hash<int> >(8),
249d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow            test_compare<std::equal_to<int> >(9),
250d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow            A{}
251d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow           );
252d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        C c(std::move(c0), A());
253d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        LIBCPP_ASSERT(c.bucket_count() == 7);
254d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(c.size() == 6);
255d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        typedef std::pair<C::const_iterator, C::const_iterator> Eq;
256d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        Eq eq = c.equal_range(1);
257d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(std::distance(eq.first, eq.second) == 2);
258d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        C::const_iterator i = eq.first;
259d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(i->first == 1);
260d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(i->second == "one");
261d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        ++i;
262d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(i->first == 1);
263d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(i->second == "four");
264d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        eq = c.equal_range(2);
265d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(std::distance(eq.first, eq.second) == 2);
266d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        i = eq.first;
267d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(i->first == 2);
268d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(i->second == "two");
269d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        ++i;
270d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(i->first == 2);
271d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(i->second == "four");
272d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow
273d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        eq = c.equal_range(3);
274d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(std::distance(eq.first, eq.second) == 1);
275d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        i = eq.first;
276d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(i->first == 3);
277d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(i->second == "three");
278d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        eq = c.equal_range(4);
279d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(std::distance(eq.first, eq.second) == 1);
280d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        i = eq.first;
281d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(i->first == 4);
282d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(i->second == "four");
28398605940df7a54649618c541b972a308cccaade9Stephan T. Lavavej        assert(static_cast<std::size_t>(std::distance(c.begin(), c.end())) == c.size());
28498605940df7a54649618c541b972a308cccaade9Stephan T. Lavavej        assert(static_cast<std::size_t>(std::distance(c.cbegin(), c.cend())) == c.size());
285d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(std::fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON);
286d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(c.max_load_factor() == 1);
287d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(c.hash_function() == test_hash<std::hash<int> >(8));
288d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(c.key_eq() == test_compare<std::equal_to<int> >(9));
289d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(c.get_allocator() == A{});
290d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow
291d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow        assert(c0.empty());
292d4badbbc5a4c63fa9c644d4ae78ec0e38564c8dcMarshall Clow    }
2937a6b7cedcb3359ad7d77e355b02ab982d9d2b25bHoward Hinnant#endif
29473d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
296