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
95a83710eSEric Fiselier // <map>
105a83710eSEric Fiselier
115a83710eSEric Fiselier // class multimap
125a83710eSEric Fiselier
135a83710eSEric Fiselier // iterator begin();
145a83710eSEric Fiselier // const_iterator begin() const;
155a83710eSEric Fiselier // iterator end();
165a83710eSEric Fiselier // const_iterator end() const;
175a83710eSEric Fiselier //
185a83710eSEric Fiselier // reverse_iterator rbegin();
195a83710eSEric Fiselier // const_reverse_iterator rbegin() const;
205a83710eSEric Fiselier // reverse_iterator rend();
215a83710eSEric Fiselier // const_reverse_iterator rend() const;
225a83710eSEric Fiselier //
235a83710eSEric Fiselier // const_iterator cbegin() const;
245a83710eSEric Fiselier // const_iterator cend() const;
255a83710eSEric Fiselier // const_reverse_iterator crbegin() const;
265a83710eSEric Fiselier // const_reverse_iterator crend() const;
275a83710eSEric Fiselier
285a83710eSEric Fiselier #include <map>
295a83710eSEric Fiselier #include <cassert>
30fbfb2ab6SStephan T. Lavavej #include <cstddef>
315a83710eSEric Fiselier
320f901c7eSStephan T. Lavavej #include "test_macros.h"
335a83710eSEric Fiselier #include "min_allocator.h"
345a83710eSEric Fiselier
main(int,char **)352df59c50SJF Bastien int main(int, char**)
365a83710eSEric Fiselier {
375a83710eSEric Fiselier {
385a83710eSEric Fiselier typedef std::pair<const int, double> V;
395a83710eSEric Fiselier V ar[] =
405a83710eSEric Fiselier {
415a83710eSEric Fiselier V(1, 1),
425a83710eSEric Fiselier V(1, 1.5),
435a83710eSEric Fiselier V(1, 2),
445a83710eSEric Fiselier V(2, 1),
455a83710eSEric Fiselier V(2, 1.5),
465a83710eSEric Fiselier V(2, 2),
475a83710eSEric Fiselier V(3, 1),
485a83710eSEric Fiselier V(3, 1.5),
495a83710eSEric Fiselier V(3, 2),
505a83710eSEric Fiselier V(4, 1),
515a83710eSEric Fiselier V(4, 1.5),
525a83710eSEric Fiselier V(4, 2),
535a83710eSEric Fiselier V(5, 1),
545a83710eSEric Fiselier V(5, 1.5),
555a83710eSEric Fiselier V(5, 2),
565a83710eSEric Fiselier V(6, 1),
575a83710eSEric Fiselier V(6, 1.5),
585a83710eSEric Fiselier V(6, 2),
595a83710eSEric Fiselier V(7, 1),
605a83710eSEric Fiselier V(7, 1.5),
615a83710eSEric Fiselier V(7, 2),
625a83710eSEric Fiselier V(8, 1),
635a83710eSEric Fiselier V(8, 1.5),
645a83710eSEric Fiselier V(8, 2)
655a83710eSEric Fiselier };
665a83710eSEric Fiselier std::multimap<int, double> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
67fbfb2ab6SStephan T. Lavavej assert(static_cast<std::size_t>(std::distance(m.begin(), m.end())) == m.size());
68fbfb2ab6SStephan T. Lavavej assert(static_cast<std::size_t>(std::distance(m.rbegin(), m.rend())) == m.size());
695a83710eSEric Fiselier std::multimap<int, double>::iterator i;
705a83710eSEric Fiselier i = m.begin();
715a83710eSEric Fiselier std::multimap<int, double>::const_iterator k = i;
725a83710eSEric Fiselier assert(i == k);
735a83710eSEric Fiselier for (int j = 1; j <= 8; ++j)
745a83710eSEric Fiselier for (double d = 1; d <= 2; d += .5, ++i)
755a83710eSEric Fiselier {
765a83710eSEric Fiselier assert(i->first == j);
775a83710eSEric Fiselier assert(i->second == d);
785a83710eSEric Fiselier i->second = 2.5;
795a83710eSEric Fiselier assert(i->second == 2.5);
805a83710eSEric Fiselier }
81*6a929492SRuslan Arutyunyan assert(i == m.end());
82*6a929492SRuslan Arutyunyan for (int j = 8; j >= 1; --j)
83*6a929492SRuslan Arutyunyan for (double d = 1; d <= 2; d += .5)
84*6a929492SRuslan Arutyunyan {
85*6a929492SRuslan Arutyunyan --i;
86*6a929492SRuslan Arutyunyan assert(i->first == j);
87*6a929492SRuslan Arutyunyan assert(i->second == 2.5);
88*6a929492SRuslan Arutyunyan i->second = d;
89*6a929492SRuslan Arutyunyan assert(i->second == d);
90*6a929492SRuslan Arutyunyan }
91*6a929492SRuslan Arutyunyan assert(i == m.begin());
925a83710eSEric Fiselier }
935a83710eSEric Fiselier {
945a83710eSEric Fiselier typedef std::pair<const int, double> V;
955a83710eSEric Fiselier V ar[] =
965a83710eSEric Fiselier {
975a83710eSEric Fiselier V(1, 1),
985a83710eSEric Fiselier V(1, 1.5),
995a83710eSEric Fiselier V(1, 2),
1005a83710eSEric Fiselier V(2, 1),
1015a83710eSEric Fiselier V(2, 1.5),
1025a83710eSEric Fiselier V(2, 2),
1035a83710eSEric Fiselier V(3, 1),
1045a83710eSEric Fiselier V(3, 1.5),
1055a83710eSEric Fiselier V(3, 2),
1065a83710eSEric Fiselier V(4, 1),
1075a83710eSEric Fiselier V(4, 1.5),
1085a83710eSEric Fiselier V(4, 2),
1095a83710eSEric Fiselier V(5, 1),
1105a83710eSEric Fiselier V(5, 1.5),
1115a83710eSEric Fiselier V(5, 2),
1125a83710eSEric Fiselier V(6, 1),
1135a83710eSEric Fiselier V(6, 1.5),
1145a83710eSEric Fiselier V(6, 2),
1155a83710eSEric Fiselier V(7, 1),
1165a83710eSEric Fiselier V(7, 1.5),
1175a83710eSEric Fiselier V(7, 2),
1185a83710eSEric Fiselier V(8, 1),
1195a83710eSEric Fiselier V(8, 1.5),
1205a83710eSEric Fiselier V(8, 2)
1215a83710eSEric Fiselier };
1225a83710eSEric Fiselier const std::multimap<int, double> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
123fbfb2ab6SStephan T. Lavavej assert(static_cast<std::size_t>(std::distance(m.begin(), m.end())) == m.size());
124fbfb2ab6SStephan T. Lavavej assert(static_cast<std::size_t>(std::distance(m.cbegin(), m.cend())) == m.size());
125fbfb2ab6SStephan T. Lavavej assert(static_cast<std::size_t>(std::distance(m.rbegin(), m.rend())) == m.size());
126fbfb2ab6SStephan T. Lavavej assert(static_cast<std::size_t>(std::distance(m.crbegin(), m.crend())) == m.size());
1275a83710eSEric Fiselier std::multimap<int, double>::const_iterator i;
1285a83710eSEric Fiselier i = m.begin();
1295a83710eSEric Fiselier for (int j = 1; j <= 8; ++j)
1305a83710eSEric Fiselier for (double d = 1; d <= 2; d += .5, ++i)
1315a83710eSEric Fiselier {
1325a83710eSEric Fiselier assert(i->first == j);
1335a83710eSEric Fiselier assert(i->second == d);
1345a83710eSEric Fiselier }
135*6a929492SRuslan Arutyunyan assert(i == m.end());
136*6a929492SRuslan Arutyunyan for (int j = 8; j >= 1; --j)
137*6a929492SRuslan Arutyunyan for (double d = 2; d >= 1; d -= .5)
138*6a929492SRuslan Arutyunyan {
139*6a929492SRuslan Arutyunyan --i;
140*6a929492SRuslan Arutyunyan assert(i->first == j);
141*6a929492SRuslan Arutyunyan assert(i->second == d);
142*6a929492SRuslan Arutyunyan }
143*6a929492SRuslan Arutyunyan assert(i == m.begin());
1445a83710eSEric Fiselier }
145f2f2a639SEric Fiselier #if TEST_STD_VER >= 11
1465a83710eSEric Fiselier {
1475a83710eSEric Fiselier typedef std::pair<const int, double> V;
1485a83710eSEric Fiselier V ar[] =
1495a83710eSEric Fiselier {
1505a83710eSEric Fiselier V(1, 1),
1515a83710eSEric Fiselier V(1, 1.5),
1525a83710eSEric Fiselier V(1, 2),
1535a83710eSEric Fiselier V(2, 1),
1545a83710eSEric Fiselier V(2, 1.5),
1555a83710eSEric Fiselier V(2, 2),
1565a83710eSEric Fiselier V(3, 1),
1575a83710eSEric Fiselier V(3, 1.5),
1585a83710eSEric Fiselier V(3, 2),
1595a83710eSEric Fiselier V(4, 1),
1605a83710eSEric Fiselier V(4, 1.5),
1615a83710eSEric Fiselier V(4, 2),
1625a83710eSEric Fiselier V(5, 1),
1635a83710eSEric Fiselier V(5, 1.5),
1645a83710eSEric Fiselier V(5, 2),
1655a83710eSEric Fiselier V(6, 1),
1665a83710eSEric Fiselier V(6, 1.5),
1675a83710eSEric Fiselier V(6, 2),
1685a83710eSEric Fiselier V(7, 1),
1695a83710eSEric Fiselier V(7, 1.5),
1705a83710eSEric Fiselier V(7, 2),
1715a83710eSEric Fiselier V(8, 1),
1725a83710eSEric Fiselier V(8, 1.5),
1735a83710eSEric Fiselier V(8, 2)
1745a83710eSEric Fiselier };
1755a83710eSEric Fiselier std::multimap<int, double, std::less<int>, min_allocator<V>> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
176fbfb2ab6SStephan T. Lavavej assert(static_cast<std::size_t>(std::distance(m.begin(), m.end())) == m.size());
177fbfb2ab6SStephan T. Lavavej assert(static_cast<std::size_t>(std::distance(m.rbegin(), m.rend())) == m.size());
1785a83710eSEric Fiselier std::multimap<int, double, std::less<int>, min_allocator<V>>::iterator i;
1795a83710eSEric Fiselier i = m.begin();
1805a83710eSEric Fiselier std::multimap<int, double, std::less<int>, min_allocator<V>>::const_iterator k = i;
1815a83710eSEric Fiselier assert(i == k);
1825a83710eSEric Fiselier for (int j = 1; j <= 8; ++j)
1835a83710eSEric Fiselier for (double d = 1; d <= 2; d += .5, ++i)
1845a83710eSEric Fiselier {
1855a83710eSEric Fiselier assert(i->first == j);
1865a83710eSEric Fiselier assert(i->second == d);
1875a83710eSEric Fiselier i->second = 2.5;
1885a83710eSEric Fiselier assert(i->second == 2.5);
1895a83710eSEric Fiselier }
190*6a929492SRuslan Arutyunyan assert(i == m.end());
191*6a929492SRuslan Arutyunyan for (int j = 8; j >= 1; --j)
192*6a929492SRuslan Arutyunyan for (double d = 1; d <= 2; d += .5)
193*6a929492SRuslan Arutyunyan {
194*6a929492SRuslan Arutyunyan --i;
195*6a929492SRuslan Arutyunyan assert(i->first == j);
196*6a929492SRuslan Arutyunyan assert(i->second == 2.5);
197*6a929492SRuslan Arutyunyan i->second = d;
198*6a929492SRuslan Arutyunyan assert(i->second == d);
199*6a929492SRuslan Arutyunyan }
200*6a929492SRuslan Arutyunyan assert(i == m.begin());
2015a83710eSEric Fiselier }
2025a83710eSEric Fiselier {
2035a83710eSEric Fiselier typedef std::pair<const int, double> V;
2045a83710eSEric Fiselier V ar[] =
2055a83710eSEric Fiselier {
2065a83710eSEric Fiselier V(1, 1),
2075a83710eSEric Fiselier V(1, 1.5),
2085a83710eSEric Fiselier V(1, 2),
2095a83710eSEric Fiselier V(2, 1),
2105a83710eSEric Fiselier V(2, 1.5),
2115a83710eSEric Fiselier V(2, 2),
2125a83710eSEric Fiselier V(3, 1),
2135a83710eSEric Fiselier V(3, 1.5),
2145a83710eSEric Fiselier V(3, 2),
2155a83710eSEric Fiselier V(4, 1),
2165a83710eSEric Fiselier V(4, 1.5),
2175a83710eSEric Fiselier V(4, 2),
2185a83710eSEric Fiselier V(5, 1),
2195a83710eSEric Fiselier V(5, 1.5),
2205a83710eSEric Fiselier V(5, 2),
2215a83710eSEric Fiselier V(6, 1),
2225a83710eSEric Fiselier V(6, 1.5),
2235a83710eSEric Fiselier V(6, 2),
2245a83710eSEric Fiselier V(7, 1),
2255a83710eSEric Fiselier V(7, 1.5),
2265a83710eSEric Fiselier V(7, 2),
2275a83710eSEric Fiselier V(8, 1),
2285a83710eSEric Fiselier V(8, 1.5),
2295a83710eSEric Fiselier V(8, 2)
2305a83710eSEric Fiselier };
2315a83710eSEric Fiselier const std::multimap<int, double, std::less<int>, min_allocator<V>> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
232fbfb2ab6SStephan T. Lavavej assert(static_cast<std::size_t>(std::distance(m.begin(), m.end())) == m.size());
233fbfb2ab6SStephan T. Lavavej assert(static_cast<std::size_t>(std::distance(m.cbegin(), m.cend())) == m.size());
234fbfb2ab6SStephan T. Lavavej assert(static_cast<std::size_t>(std::distance(m.rbegin(), m.rend())) == m.size());
235fbfb2ab6SStephan T. Lavavej assert(static_cast<std::size_t>(std::distance(m.crbegin(), m.crend())) == m.size());
2365a83710eSEric Fiselier std::multimap<int, double, std::less<int>, min_allocator<V>>::const_iterator i;
2375a83710eSEric Fiselier i = m.begin();
2385a83710eSEric Fiselier for (int j = 1; j <= 8; ++j)
2395a83710eSEric Fiselier for (double d = 1; d <= 2; d += .5, ++i)
2405a83710eSEric Fiselier {
2415a83710eSEric Fiselier assert(i->first == j);
2425a83710eSEric Fiselier assert(i->second == d);
2435a83710eSEric Fiselier }
244*6a929492SRuslan Arutyunyan assert(i == m.end());
245*6a929492SRuslan Arutyunyan for (int j = 8; j >= 1; --j)
246*6a929492SRuslan Arutyunyan for (double d = 2; d >= 1; d -= .5)
247*6a929492SRuslan Arutyunyan {
248*6a929492SRuslan Arutyunyan --i;
249*6a929492SRuslan Arutyunyan assert(i->first == j);
250*6a929492SRuslan Arutyunyan assert(i->second == d);
251*6a929492SRuslan Arutyunyan }
252*6a929492SRuslan Arutyunyan assert(i == m.begin());
2535a83710eSEric Fiselier }
2545a83710eSEric Fiselier #endif
2550f901c7eSStephan T. Lavavej #if TEST_STD_VER > 11
2565a83710eSEric Fiselier { // N3644 testing
2575a83710eSEric Fiselier typedef std::multimap<int, double> C;
2585a83710eSEric Fiselier C::iterator ii1{}, ii2{};
2595a83710eSEric Fiselier C::iterator ii4 = ii1;
2605a83710eSEric Fiselier C::const_iterator cii{};
2615a83710eSEric Fiselier assert ( ii1 == ii2 );
2625a83710eSEric Fiselier assert ( ii1 == ii4 );
2635a83710eSEric Fiselier
2645a83710eSEric Fiselier assert (!(ii1 != ii2 ));
2655a83710eSEric Fiselier
2665a83710eSEric Fiselier assert ( (ii1 == cii ));
2675a83710eSEric Fiselier assert ( (cii == ii1 ));
2685a83710eSEric Fiselier assert (!(ii1 != cii ));
2695a83710eSEric Fiselier assert (!(cii != ii1 ));
2705a83710eSEric Fiselier }
2715a83710eSEric Fiselier #endif
2722df59c50SJF Bastien
2732df59c50SJF Bastien return 0;
2745a83710eSEric Fiselier }
275