15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
35a83710eSEric Fiselier //                     The LLVM Compiler Infrastructure
45a83710eSEric Fiselier //
55a83710eSEric Fiselier // This file is dual licensed under the MIT and the University of Illinois Open
65a83710eSEric Fiselier // Source Licenses. See LICENSE.TXT for details.
75a83710eSEric Fiselier //
85a83710eSEric Fiselier //===----------------------------------------------------------------------===//
95a83710eSEric Fiselier 
105a83710eSEric Fiselier // <set>
115a83710eSEric Fiselier 
125a83710eSEric Fiselier // class multiset
135a83710eSEric Fiselier 
145a83710eSEric Fiselier //       iterator begin();
155a83710eSEric Fiselier // const_iterator begin() const;
165a83710eSEric Fiselier //       iterator end();
175a83710eSEric Fiselier // const_iterator end()   const;
185a83710eSEric Fiselier //
195a83710eSEric Fiselier //       reverse_iterator rbegin();
205a83710eSEric Fiselier // const_reverse_iterator rbegin() const;
215a83710eSEric Fiselier //       reverse_iterator rend();
225a83710eSEric Fiselier // const_reverse_iterator rend()   const;
235a83710eSEric Fiselier //
245a83710eSEric Fiselier // const_iterator         cbegin()  const;
255a83710eSEric Fiselier // const_iterator         cend()    const;
265a83710eSEric Fiselier // const_reverse_iterator crbegin() const;
275a83710eSEric Fiselier // const_reverse_iterator crend()   const;
285a83710eSEric Fiselier 
295a83710eSEric Fiselier #include <set>
305a83710eSEric Fiselier #include <cassert>
31*fbfb2ab6SStephan T. Lavavej #include <cstddef>
325a83710eSEric Fiselier 
330f901c7eSStephan T. Lavavej #include "test_macros.h"
345a83710eSEric Fiselier #include "min_allocator.h"
355a83710eSEric Fiselier 
365a83710eSEric Fiselier int main()
375a83710eSEric Fiselier {
385a83710eSEric Fiselier     {
395a83710eSEric Fiselier         typedef int V;
405a83710eSEric Fiselier         V ar[] =
415a83710eSEric Fiselier         {
425a83710eSEric Fiselier             1,
435a83710eSEric Fiselier             1,
445a83710eSEric Fiselier             1,
455a83710eSEric Fiselier             2,
465a83710eSEric Fiselier             2,
475a83710eSEric Fiselier             2,
485a83710eSEric Fiselier             3,
495a83710eSEric Fiselier             3,
505a83710eSEric Fiselier             3,
515a83710eSEric Fiselier             4,
525a83710eSEric Fiselier             4,
535a83710eSEric Fiselier             4,
545a83710eSEric Fiselier             5,
555a83710eSEric Fiselier             5,
565a83710eSEric Fiselier             5,
575a83710eSEric Fiselier             6,
585a83710eSEric Fiselier             6,
595a83710eSEric Fiselier             6,
605a83710eSEric Fiselier             7,
615a83710eSEric Fiselier             7,
625a83710eSEric Fiselier             7,
635a83710eSEric Fiselier             8,
645a83710eSEric Fiselier             8,
655a83710eSEric Fiselier             8
665a83710eSEric Fiselier         };
675a83710eSEric Fiselier         std::multiset<int> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
68*fbfb2ab6SStephan T. Lavavej         assert(static_cast<std::size_t>(std::distance(m.begin(), m.end())) == m.size());
69*fbfb2ab6SStephan T. Lavavej         assert(static_cast<std::size_t>(std::distance(m.rbegin(), m.rend())) == m.size());
705a83710eSEric Fiselier         std::multiset<int>::iterator i;
715a83710eSEric Fiselier         i = m.begin();
725a83710eSEric Fiselier         std::multiset<int>::const_iterator k = i;
735a83710eSEric Fiselier         assert(i == k);
745a83710eSEric Fiselier         for (int j = 1; j <= 8; ++j)
750d627919SEric Fiselier             for (int n = 0; n < 3; ++n, ++i)
765a83710eSEric Fiselier                 assert(*i == j);
775a83710eSEric Fiselier     }
785a83710eSEric Fiselier     {
795a83710eSEric Fiselier         typedef int V;
805a83710eSEric Fiselier         V ar[] =
815a83710eSEric Fiselier         {
825a83710eSEric Fiselier             1,
835a83710eSEric Fiselier             1,
845a83710eSEric Fiselier             1,
855a83710eSEric Fiselier             2,
865a83710eSEric Fiselier             2,
875a83710eSEric Fiselier             2,
885a83710eSEric Fiselier             3,
895a83710eSEric Fiselier             3,
905a83710eSEric Fiselier             3,
915a83710eSEric Fiselier             4,
925a83710eSEric Fiselier             4,
935a83710eSEric Fiselier             4,
945a83710eSEric Fiselier             5,
955a83710eSEric Fiselier             5,
965a83710eSEric Fiselier             5,
975a83710eSEric Fiselier             6,
985a83710eSEric Fiselier             6,
995a83710eSEric Fiselier             6,
1005a83710eSEric Fiselier             7,
1015a83710eSEric Fiselier             7,
1025a83710eSEric Fiselier             7,
1035a83710eSEric Fiselier             8,
1045a83710eSEric Fiselier             8,
1055a83710eSEric Fiselier             8
1065a83710eSEric Fiselier         };
1075a83710eSEric Fiselier         const std::multiset<int> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
108*fbfb2ab6SStephan T. Lavavej         assert(static_cast<std::size_t>(std::distance(m.begin(), m.end())) == m.size());
109*fbfb2ab6SStephan T. Lavavej         assert(static_cast<std::size_t>(std::distance(m.cbegin(), m.cend())) == m.size());
110*fbfb2ab6SStephan T. Lavavej         assert(static_cast<std::size_t>(std::distance(m.rbegin(), m.rend())) == m.size());
111*fbfb2ab6SStephan T. Lavavej         assert(static_cast<std::size_t>(std::distance(m.crbegin(), m.crend())) == m.size());
1125a83710eSEric Fiselier         std::multiset<int>::const_iterator i;
1135a83710eSEric Fiselier         i = m.begin();
1145a83710eSEric Fiselier         for (int j = 1; j <= 8; ++j)
1155a83710eSEric Fiselier             for (int k = 0; k < 3; ++k, ++i)
1165a83710eSEric Fiselier                 assert(*i == j);
1175a83710eSEric Fiselier     }
118f2f2a639SEric Fiselier #if TEST_STD_VER >= 11
1195a83710eSEric Fiselier     {
1205a83710eSEric Fiselier         typedef int V;
1215a83710eSEric Fiselier         V ar[] =
1225a83710eSEric Fiselier         {
1235a83710eSEric Fiselier             1,
1245a83710eSEric Fiselier             1,
1255a83710eSEric Fiselier             1,
1265a83710eSEric Fiselier             2,
1275a83710eSEric Fiselier             2,
1285a83710eSEric Fiselier             2,
1295a83710eSEric Fiselier             3,
1305a83710eSEric Fiselier             3,
1315a83710eSEric Fiselier             3,
1325a83710eSEric Fiselier             4,
1335a83710eSEric Fiselier             4,
1345a83710eSEric Fiselier             4,
1355a83710eSEric Fiselier             5,
1365a83710eSEric Fiselier             5,
1375a83710eSEric Fiselier             5,
1385a83710eSEric Fiselier             6,
1395a83710eSEric Fiselier             6,
1405a83710eSEric Fiselier             6,
1415a83710eSEric Fiselier             7,
1425a83710eSEric Fiselier             7,
1435a83710eSEric Fiselier             7,
1445a83710eSEric Fiselier             8,
1455a83710eSEric Fiselier             8,
1465a83710eSEric Fiselier             8
1475a83710eSEric Fiselier         };
1485a83710eSEric Fiselier         std::multiset<int, std::less<int>, min_allocator<int>> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
149*fbfb2ab6SStephan T. Lavavej         assert(static_cast<std::size_t>(std::distance(m.begin(), m.end())) == m.size());
150*fbfb2ab6SStephan T. Lavavej         assert(static_cast<std::size_t>(std::distance(m.rbegin(), m.rend())) == m.size());
1515a83710eSEric Fiselier         std::multiset<int, std::less<int>, min_allocator<int>>::iterator i;
1525a83710eSEric Fiselier         i = m.begin();
1535a83710eSEric Fiselier         std::multiset<int, std::less<int>, min_allocator<int>>::const_iterator k = i;
1545a83710eSEric Fiselier         assert(i == k);
1555a83710eSEric Fiselier         for (int j = 1; j <= 8; ++j)
1560d627919SEric Fiselier             for (int n = 0; n < 3; ++n, ++i)
1575a83710eSEric Fiselier                 assert(*i == j);
1585a83710eSEric Fiselier     }
1595a83710eSEric Fiselier     {
1605a83710eSEric Fiselier         typedef int V;
1615a83710eSEric Fiselier         V ar[] =
1625a83710eSEric Fiselier         {
1635a83710eSEric Fiselier             1,
1645a83710eSEric Fiselier             1,
1655a83710eSEric Fiselier             1,
1665a83710eSEric Fiselier             2,
1675a83710eSEric Fiselier             2,
1685a83710eSEric Fiselier             2,
1695a83710eSEric Fiselier             3,
1705a83710eSEric Fiselier             3,
1715a83710eSEric Fiselier             3,
1725a83710eSEric Fiselier             4,
1735a83710eSEric Fiselier             4,
1745a83710eSEric Fiselier             4,
1755a83710eSEric Fiselier             5,
1765a83710eSEric Fiselier             5,
1775a83710eSEric Fiselier             5,
1785a83710eSEric Fiselier             6,
1795a83710eSEric Fiselier             6,
1805a83710eSEric Fiselier             6,
1815a83710eSEric Fiselier             7,
1825a83710eSEric Fiselier             7,
1835a83710eSEric Fiselier             7,
1845a83710eSEric Fiselier             8,
1855a83710eSEric Fiselier             8,
1865a83710eSEric Fiselier             8
1875a83710eSEric Fiselier         };
1885a83710eSEric Fiselier         const std::multiset<int, std::less<int>, min_allocator<int>> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
189*fbfb2ab6SStephan T. Lavavej         assert(static_cast<std::size_t>(std::distance(m.begin(), m.end())) == m.size());
190*fbfb2ab6SStephan T. Lavavej         assert(static_cast<std::size_t>(std::distance(m.cbegin(), m.cend())) == m.size());
191*fbfb2ab6SStephan T. Lavavej         assert(static_cast<std::size_t>(std::distance(m.rbegin(), m.rend())) == m.size());
192*fbfb2ab6SStephan T. Lavavej         assert(static_cast<std::size_t>(std::distance(m.crbegin(), m.crend())) == m.size());
1935a83710eSEric Fiselier         std::multiset<int, std::less<int>, min_allocator<int>>::const_iterator i;
1945a83710eSEric Fiselier         i = m.begin();
1955a83710eSEric Fiselier         for (int j = 1; j <= 8; ++j)
1965a83710eSEric Fiselier             for (int k = 0; k < 3; ++k, ++i)
1975a83710eSEric Fiselier                 assert(*i == j);
1985a83710eSEric Fiselier     }
1995a83710eSEric Fiselier #endif
2000f901c7eSStephan T. Lavavej #if TEST_STD_VER > 11
2015a83710eSEric Fiselier     { // N3644 testing
2025a83710eSEric Fiselier         typedef std::multiset<int> C;
2035a83710eSEric Fiselier         C::iterator ii1{}, ii2{};
2045a83710eSEric Fiselier         C::iterator ii4 = ii1;
2055a83710eSEric Fiselier         C::const_iterator cii{};
2065a83710eSEric Fiselier         assert ( ii1 == ii2 );
2075a83710eSEric Fiselier         assert ( ii1 == ii4 );
2085a83710eSEric Fiselier 
2095a83710eSEric Fiselier         assert (!(ii1 != ii2 ));
2105a83710eSEric Fiselier 
2115a83710eSEric Fiselier         assert ( (ii1 == cii ));
2125a83710eSEric Fiselier         assert ( (cii == ii1 ));
2135a83710eSEric Fiselier         assert (!(ii1 != cii ));
2145a83710eSEric Fiselier         assert (!(cii != ii1 ));
2155a83710eSEric Fiselier     }
2165a83710eSEric Fiselier #endif
2175a83710eSEric Fiselier }
218