15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier
9f8457a07SMarshall Clow // <multimap>
105a83710eSEric Fiselier
115a83710eSEric Fiselier // class multimap
125a83710eSEric Fiselier
135a83710eSEric Fiselier // pair<iterator, iterator> equal_range(const key_type& k);
145a83710eSEric Fiselier // pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
155a83710eSEric Fiselier
165a83710eSEric Fiselier #include <map>
175a83710eSEric Fiselier #include <cassert>
185a83710eSEric Fiselier
190f901c7eSStephan T. Lavavej #include "test_macros.h"
205a83710eSEric Fiselier #include "min_allocator.h"
21cc89063bSNico Weber #include "private_constructor.h"
22f8457a07SMarshall Clow #include "is_transparent.h"
235a83710eSEric Fiselier
main(int,char **)242df59c50SJF Bastien int main(int, char**)
255a83710eSEric Fiselier {
265a83710eSEric Fiselier typedef std::pair<const int, double> V;
275a83710eSEric Fiselier {
285a83710eSEric Fiselier typedef std::multimap<int, double> M;
295a83710eSEric Fiselier {
305a83710eSEric Fiselier typedef std::pair<M::iterator, M::iterator> R;
315a83710eSEric Fiselier V ar[] =
325a83710eSEric Fiselier {
335a83710eSEric Fiselier V(5, 1),
345a83710eSEric Fiselier V(5, 2),
355a83710eSEric Fiselier V(5, 3),
365a83710eSEric Fiselier V(7, 1),
375a83710eSEric Fiselier V(7, 2),
385a83710eSEric Fiselier V(7, 3),
395a83710eSEric Fiselier V(9, 1),
405a83710eSEric Fiselier V(9, 2),
415a83710eSEric Fiselier V(9, 3)
425a83710eSEric Fiselier };
435a83710eSEric Fiselier M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
445a83710eSEric Fiselier R r = m.equal_range(4);
455a83710eSEric Fiselier assert(r.first == m.begin());
465a83710eSEric Fiselier assert(r.second == m.begin());
475a83710eSEric Fiselier r = m.equal_range(5);
485a83710eSEric Fiselier assert(r.first == m.begin());
49*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 3));
505a83710eSEric Fiselier r = m.equal_range(6);
51*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 3));
52*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 3));
535a83710eSEric Fiselier r = m.equal_range(7);
54*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 3));
55*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 6));
565a83710eSEric Fiselier r = m.equal_range(8);
57*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 6));
58*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 6));
595a83710eSEric Fiselier r = m.equal_range(9);
60*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 6));
61*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 9));
625a83710eSEric Fiselier r = m.equal_range(10);
635a83710eSEric Fiselier assert(r.first == m.end());
645a83710eSEric Fiselier assert(r.second == m.end());
655a83710eSEric Fiselier }
665a83710eSEric Fiselier {
675a83710eSEric Fiselier typedef std::pair<M::const_iterator, M::const_iterator> R;
685a83710eSEric Fiselier V ar[] =
695a83710eSEric Fiselier {
705a83710eSEric Fiselier V(5, 1),
715a83710eSEric Fiselier V(5, 2),
725a83710eSEric Fiselier V(5, 3),
735a83710eSEric Fiselier V(7, 1),
745a83710eSEric Fiselier V(7, 2),
755a83710eSEric Fiselier V(7, 3),
765a83710eSEric Fiselier V(9, 1),
775a83710eSEric Fiselier V(9, 2),
785a83710eSEric Fiselier V(9, 3)
795a83710eSEric Fiselier };
805a83710eSEric Fiselier const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
815a83710eSEric Fiselier R r = m.equal_range(4);
825a83710eSEric Fiselier assert(r.first == m.begin());
835a83710eSEric Fiselier assert(r.second == m.begin());
845a83710eSEric Fiselier r = m.equal_range(5);
855a83710eSEric Fiselier assert(r.first == m.begin());
86*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 3));
875a83710eSEric Fiselier r = m.equal_range(6);
88*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 3));
89*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 3));
905a83710eSEric Fiselier r = m.equal_range(7);
91*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 3));
92*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 6));
935a83710eSEric Fiselier r = m.equal_range(8);
94*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 6));
95*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 6));
965a83710eSEric Fiselier r = m.equal_range(9);
97*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 6));
98*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 9));
995a83710eSEric Fiselier r = m.equal_range(10);
1005a83710eSEric Fiselier assert(r.first == m.end());
1015a83710eSEric Fiselier assert(r.second == m.end());
1025a83710eSEric Fiselier }
1035a83710eSEric Fiselier }
104f2f2a639SEric Fiselier #if TEST_STD_VER >= 11
1055a83710eSEric Fiselier {
1065a83710eSEric Fiselier typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
1075a83710eSEric Fiselier {
1085a83710eSEric Fiselier typedef std::pair<M::iterator, M::iterator> R;
1095a83710eSEric Fiselier V ar[] =
1105a83710eSEric Fiselier {
1115a83710eSEric Fiselier V(5, 1),
1125a83710eSEric Fiselier V(5, 2),
1135a83710eSEric Fiselier V(5, 3),
1145a83710eSEric Fiselier V(7, 1),
1155a83710eSEric Fiselier V(7, 2),
1165a83710eSEric Fiselier V(7, 3),
1175a83710eSEric Fiselier V(9, 1),
1185a83710eSEric Fiselier V(9, 2),
1195a83710eSEric Fiselier V(9, 3)
1205a83710eSEric Fiselier };
1215a83710eSEric Fiselier M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
1225a83710eSEric Fiselier R r = m.equal_range(4);
1235a83710eSEric Fiselier assert(r.first == m.begin());
1245a83710eSEric Fiselier assert(r.second == m.begin());
1255a83710eSEric Fiselier r = m.equal_range(5);
1265a83710eSEric Fiselier assert(r.first == m.begin());
127*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 3));
1285a83710eSEric Fiselier r = m.equal_range(6);
129*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 3));
130*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 3));
1315a83710eSEric Fiselier r = m.equal_range(7);
132*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 3));
133*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 6));
1345a83710eSEric Fiselier r = m.equal_range(8);
135*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 6));
136*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 6));
1375a83710eSEric Fiselier r = m.equal_range(9);
138*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 6));
139*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 9));
1405a83710eSEric Fiselier r = m.equal_range(10);
1415a83710eSEric Fiselier assert(r.first == m.end());
1425a83710eSEric Fiselier assert(r.second == m.end());
1435a83710eSEric Fiselier }
1445a83710eSEric Fiselier {
1455a83710eSEric Fiselier typedef std::pair<M::const_iterator, M::const_iterator> R;
1465a83710eSEric Fiselier V ar[] =
1475a83710eSEric Fiselier {
1485a83710eSEric Fiselier V(5, 1),
1495a83710eSEric Fiselier V(5, 2),
1505a83710eSEric Fiselier V(5, 3),
1515a83710eSEric Fiselier V(7, 1),
1525a83710eSEric Fiselier V(7, 2),
1535a83710eSEric Fiselier V(7, 3),
1545a83710eSEric Fiselier V(9, 1),
1555a83710eSEric Fiselier V(9, 2),
1565a83710eSEric Fiselier V(9, 3)
1575a83710eSEric Fiselier };
1585a83710eSEric Fiselier const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
1595a83710eSEric Fiselier R r = m.equal_range(4);
1605a83710eSEric Fiselier assert(r.first == m.begin());
1615a83710eSEric Fiselier assert(r.second == m.begin());
1625a83710eSEric Fiselier r = m.equal_range(5);
1635a83710eSEric Fiselier assert(r.first == m.begin());
164*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 3));
1655a83710eSEric Fiselier r = m.equal_range(6);
166*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 3));
167*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 3));
1685a83710eSEric Fiselier r = m.equal_range(7);
169*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 3));
170*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 6));
1715a83710eSEric Fiselier r = m.equal_range(8);
172*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 6));
173*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 6));
1745a83710eSEric Fiselier r = m.equal_range(9);
175*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 6));
176*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 9));
1775a83710eSEric Fiselier r = m.equal_range(10);
1785a83710eSEric Fiselier assert(r.first == m.end());
1795a83710eSEric Fiselier assert(r.second == m.end());
1805a83710eSEric Fiselier }
1815a83710eSEric Fiselier }
1825a83710eSEric Fiselier #endif
1830f901c7eSStephan T. Lavavej #if TEST_STD_VER > 11
1845a83710eSEric Fiselier {
1855a83710eSEric Fiselier typedef std::multimap<int, double, std::less<>> M;
1865a83710eSEric Fiselier
1875a83710eSEric Fiselier typedef std::pair<M::iterator, M::iterator> R;
1885a83710eSEric Fiselier V ar[] =
1895a83710eSEric Fiselier {
1905a83710eSEric Fiselier V(5, 1),
1915a83710eSEric Fiselier V(5, 2),
1925a83710eSEric Fiselier V(5, 3),
1935a83710eSEric Fiselier V(7, 1),
1945a83710eSEric Fiselier V(7, 2),
1955a83710eSEric Fiselier V(7, 3),
1965a83710eSEric Fiselier V(9, 1),
1975a83710eSEric Fiselier V(9, 2),
1985a83710eSEric Fiselier V(9, 3)
1995a83710eSEric Fiselier };
2005a83710eSEric Fiselier M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
2015a83710eSEric Fiselier R r = m.equal_range(4);
2025a83710eSEric Fiselier assert(r.first == m.begin());
2035a83710eSEric Fiselier assert(r.second == m.begin());
2045a83710eSEric Fiselier r = m.equal_range(5);
2055a83710eSEric Fiselier assert(r.first == m.begin());
206*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 3));
2075a83710eSEric Fiselier r = m.equal_range(6);
208*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 3));
209*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 3));
2105a83710eSEric Fiselier r = m.equal_range(7);
211*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 3));
212*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 6));
2135a83710eSEric Fiselier r = m.equal_range(8);
214*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 6));
215*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 6));
2165a83710eSEric Fiselier r = m.equal_range(9);
217*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 6));
218*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 9));
2195a83710eSEric Fiselier r = m.equal_range(10);
2205a83710eSEric Fiselier assert(r.first == m.end());
2215a83710eSEric Fiselier assert(r.second == m.end());
222f8457a07SMarshall Clow
223f8457a07SMarshall Clow r = m.equal_range(C2Int(4));
224f8457a07SMarshall Clow assert(r.first == m.begin());
225f8457a07SMarshall Clow assert(r.second == m.begin());
226f8457a07SMarshall Clow r = m.equal_range(C2Int(5));
227f8457a07SMarshall Clow assert(r.first == m.begin());
228*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 3));
229f8457a07SMarshall Clow r = m.equal_range(C2Int(6));
230*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 3));
231*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 3));
232f8457a07SMarshall Clow r = m.equal_range(C2Int(7));
233*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 3));
234*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 6));
235f8457a07SMarshall Clow r = m.equal_range(C2Int(8));
236*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 6));
237*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 6));
238f8457a07SMarshall Clow r = m.equal_range(C2Int(9));
239*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 6));
240*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 9));
241f8457a07SMarshall Clow r = m.equal_range(C2Int(10));
242f8457a07SMarshall Clow assert(r.first == m.end());
243f8457a07SMarshall Clow assert(r.second == m.end());
2445a83710eSEric Fiselier }
2455a83710eSEric Fiselier
2465a83710eSEric Fiselier {
2475a83710eSEric Fiselier typedef PrivateConstructor PC;
2485a83710eSEric Fiselier typedef std::multimap<PC, double, std::less<>> M;
2495a83710eSEric Fiselier typedef std::pair<M::iterator, M::iterator> R;
2505a83710eSEric Fiselier
2515a83710eSEric Fiselier M m;
2525a83710eSEric Fiselier m.insert ( std::make_pair<PC, double> ( PC::make(5), 1 ));
2535a83710eSEric Fiselier m.insert ( std::make_pair<PC, double> ( PC::make(5), 2 ));
2545a83710eSEric Fiselier m.insert ( std::make_pair<PC, double> ( PC::make(5), 3 ));
2555a83710eSEric Fiselier m.insert ( std::make_pair<PC, double> ( PC::make(7), 1 ));
2565a83710eSEric Fiselier m.insert ( std::make_pair<PC, double> ( PC::make(7), 2 ));
2575a83710eSEric Fiselier m.insert ( std::make_pair<PC, double> ( PC::make(7), 3 ));
2585a83710eSEric Fiselier m.insert ( std::make_pair<PC, double> ( PC::make(9), 1 ));
2595a83710eSEric Fiselier m.insert ( std::make_pair<PC, double> ( PC::make(9), 2 ));
2605a83710eSEric Fiselier m.insert ( std::make_pair<PC, double> ( PC::make(9), 3 ));
2615a83710eSEric Fiselier
2625a83710eSEric Fiselier // assert(m.size() == 9);
2635a83710eSEric Fiselier R r = m.equal_range(4);
2645a83710eSEric Fiselier assert(r.first == m.begin());
2655a83710eSEric Fiselier assert(r.second == m.begin());
2665a83710eSEric Fiselier r = m.equal_range(5);
2675a83710eSEric Fiselier assert(r.first == m.begin());
268*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 3));
2695a83710eSEric Fiselier r = m.equal_range(6);
270*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 3));
271*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 3));
2725a83710eSEric Fiselier r = m.equal_range(7);
273*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 3));
274*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 6));
2755a83710eSEric Fiselier r = m.equal_range(8);
276*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 6));
277*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 6));
2785a83710eSEric Fiselier r = m.equal_range(9);
279*5ffe11a9SArthur O'Dwyer assert(r.first == std::next(m.begin(), 6));
280*5ffe11a9SArthur O'Dwyer assert(r.second == std::next(m.begin(), 9));
2815a83710eSEric Fiselier r = m.equal_range(10);
2825a83710eSEric Fiselier assert(r.first == m.end());
2835a83710eSEric Fiselier assert(r.second == m.end());
2845a83710eSEric Fiselier }
2855a83710eSEric Fiselier #endif
2862df59c50SJF Bastien
2872df59c50SJF Bastien return 0;
2885a83710eSEric Fiselier }
289