1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <set>
11
12// class multiset
13
14//       iterator begin();
15// const_iterator begin() const;
16//       iterator end();
17// const_iterator end()   const;
18//
19//       reverse_iterator rbegin();
20// const_reverse_iterator rbegin() const;
21//       reverse_iterator rend();
22// const_reverse_iterator rend()   const;
23//
24// const_iterator         cbegin()  const;
25// const_iterator         cend()    const;
26// const_reverse_iterator crbegin() const;
27// const_reverse_iterator crend()   const;
28
29#include <set>
30#include <cassert>
31
32#include "min_allocator.h"
33
34int main()
35{
36    {
37        typedef int V;
38        V ar[] =
39        {
40            1,
41            1,
42            1,
43            2,
44            2,
45            2,
46            3,
47            3,
48            3,
49            4,
50            4,
51            4,
52            5,
53            5,
54            5,
55            6,
56            6,
57            6,
58            7,
59            7,
60            7,
61            8,
62            8,
63            8
64        };
65        std::multiset<int> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
66        assert(std::distance(m.begin(), m.end()) == m.size());
67        assert(std::distance(m.rbegin(), m.rend()) == m.size());
68        std::multiset<int>::iterator i;
69        i = m.begin();
70        std::multiset<int>::const_iterator k = i;
71        assert(i == k);
72        for (int j = 1; j <= 8; ++j)
73            for (int k = 0; k < 3; ++k, ++i)
74                assert(*i == j);
75    }
76    {
77        typedef int V;
78        V ar[] =
79        {
80            1,
81            1,
82            1,
83            2,
84            2,
85            2,
86            3,
87            3,
88            3,
89            4,
90            4,
91            4,
92            5,
93            5,
94            5,
95            6,
96            6,
97            6,
98            7,
99            7,
100            7,
101            8,
102            8,
103            8
104        };
105        const std::multiset<int> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
106        assert(std::distance(m.begin(), m.end()) == m.size());
107        assert(std::distance(m.cbegin(), m.cend()) == m.size());
108        assert(std::distance(m.rbegin(), m.rend()) == m.size());
109        assert(std::distance(m.crbegin(), m.crend()) == m.size());
110        std::multiset<int>::const_iterator i;
111        i = m.begin();
112        for (int j = 1; j <= 8; ++j)
113            for (int k = 0; k < 3; ++k, ++i)
114                assert(*i == j);
115    }
116#if __cplusplus >= 201103L
117    {
118        typedef int V;
119        V ar[] =
120        {
121            1,
122            1,
123            1,
124            2,
125            2,
126            2,
127            3,
128            3,
129            3,
130            4,
131            4,
132            4,
133            5,
134            5,
135            5,
136            6,
137            6,
138            6,
139            7,
140            7,
141            7,
142            8,
143            8,
144            8
145        };
146        std::multiset<int, std::less<int>, min_allocator<int>> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
147        assert(std::distance(m.begin(), m.end()) == m.size());
148        assert(std::distance(m.rbegin(), m.rend()) == m.size());
149        std::multiset<int, std::less<int>, min_allocator<int>>::iterator i;
150        i = m.begin();
151        std::multiset<int, std::less<int>, min_allocator<int>>::const_iterator k = i;
152        assert(i == k);
153        for (int j = 1; j <= 8; ++j)
154            for (int k = 0; k < 3; ++k, ++i)
155                assert(*i == j);
156    }
157    {
158        typedef int V;
159        V ar[] =
160        {
161            1,
162            1,
163            1,
164            2,
165            2,
166            2,
167            3,
168            3,
169            3,
170            4,
171            4,
172            4,
173            5,
174            5,
175            5,
176            6,
177            6,
178            6,
179            7,
180            7,
181            7,
182            8,
183            8,
184            8
185        };
186        const std::multiset<int, std::less<int>, min_allocator<int>> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
187        assert(std::distance(m.begin(), m.end()) == m.size());
188        assert(std::distance(m.cbegin(), m.cend()) == m.size());
189        assert(std::distance(m.rbegin(), m.rend()) == m.size());
190        assert(std::distance(m.crbegin(), m.crend()) == m.size());
191        std::multiset<int, std::less<int>, min_allocator<int>>::const_iterator i;
192        i = m.begin();
193        for (int j = 1; j <= 8; ++j)
194            for (int k = 0; k < 3; ++k, ++i)
195                assert(*i == j);
196    }
197#endif
198#if _LIBCPP_STD_VER > 11
199    { // N3644 testing
200        typedef std::multiset<int> C;
201        C::iterator ii1{}, ii2{};
202        C::iterator ii4 = ii1;
203        C::const_iterator cii{};
204        assert ( ii1 == ii2 );
205        assert ( ii1 == ii4 );
206
207        assert (!(ii1 != ii2 ));
208
209        assert ( (ii1 == cii ));
210        assert ( (cii == ii1 ));
211        assert (!(ii1 != cii ));
212        assert (!(cii != ii1 ));
213    }
214#endif
215}
216