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// <map>
11
12// class multimap
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 <map>
30#include <cassert>
31
32#include "min_allocator.h"
33
34int main()
35{
36    {
37        typedef std::pair<const int, double> V;
38        V ar[] =
39        {
40            V(1, 1),
41            V(1, 1.5),
42            V(1, 2),
43            V(2, 1),
44            V(2, 1.5),
45            V(2, 2),
46            V(3, 1),
47            V(3, 1.5),
48            V(3, 2),
49            V(4, 1),
50            V(4, 1.5),
51            V(4, 2),
52            V(5, 1),
53            V(5, 1.5),
54            V(5, 2),
55            V(6, 1),
56            V(6, 1.5),
57            V(6, 2),
58            V(7, 1),
59            V(7, 1.5),
60            V(7, 2),
61            V(8, 1),
62            V(8, 1.5),
63            V(8, 2)
64        };
65        std::multimap<int, double> 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::multimap<int, double>::iterator i;
69        i = m.begin();
70        std::multimap<int, double>::const_iterator k = i;
71        assert(i == k);
72        for (int j = 1; j <= 8; ++j)
73            for (double d = 1; d <= 2; d += .5, ++i)
74            {
75                assert(i->first == j);
76                assert(i->second == d);
77                i->second = 2.5;
78                assert(i->second == 2.5);
79            }
80    }
81    {
82        typedef std::pair<const int, double> V;
83        V ar[] =
84        {
85            V(1, 1),
86            V(1, 1.5),
87            V(1, 2),
88            V(2, 1),
89            V(2, 1.5),
90            V(2, 2),
91            V(3, 1),
92            V(3, 1.5),
93            V(3, 2),
94            V(4, 1),
95            V(4, 1.5),
96            V(4, 2),
97            V(5, 1),
98            V(5, 1.5),
99            V(5, 2),
100            V(6, 1),
101            V(6, 1.5),
102            V(6, 2),
103            V(7, 1),
104            V(7, 1.5),
105            V(7, 2),
106            V(8, 1),
107            V(8, 1.5),
108            V(8, 2)
109        };
110        const std::multimap<int, double> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
111        assert(std::distance(m.begin(), m.end()) == m.size());
112        assert(std::distance(m.cbegin(), m.cend()) == m.size());
113        assert(std::distance(m.rbegin(), m.rend()) == m.size());
114        assert(std::distance(m.crbegin(), m.crend()) == m.size());
115        std::multimap<int, double>::const_iterator i;
116        i = m.begin();
117        for (int j = 1; j <= 8; ++j)
118            for (double d = 1; d <= 2; d += .5, ++i)
119            {
120                assert(i->first == j);
121                assert(i->second == d);
122            }
123    }
124#if __cplusplus >= 201103L
125    {
126        typedef std::pair<const int, double> V;
127        V ar[] =
128        {
129            V(1, 1),
130            V(1, 1.5),
131            V(1, 2),
132            V(2, 1),
133            V(2, 1.5),
134            V(2, 2),
135            V(3, 1),
136            V(3, 1.5),
137            V(3, 2),
138            V(4, 1),
139            V(4, 1.5),
140            V(4, 2),
141            V(5, 1),
142            V(5, 1.5),
143            V(5, 2),
144            V(6, 1),
145            V(6, 1.5),
146            V(6, 2),
147            V(7, 1),
148            V(7, 1.5),
149            V(7, 2),
150            V(8, 1),
151            V(8, 1.5),
152            V(8, 2)
153        };
154        std::multimap<int, double, std::less<int>, min_allocator<V>> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
155        assert(std::distance(m.begin(), m.end()) == m.size());
156        assert(std::distance(m.rbegin(), m.rend()) == m.size());
157        std::multimap<int, double, std::less<int>, min_allocator<V>>::iterator i;
158        i = m.begin();
159        std::multimap<int, double, std::less<int>, min_allocator<V>>::const_iterator k = i;
160        assert(i == k);
161        for (int j = 1; j <= 8; ++j)
162            for (double d = 1; d <= 2; d += .5, ++i)
163            {
164                assert(i->first == j);
165                assert(i->second == d);
166                i->second = 2.5;
167                assert(i->second == 2.5);
168            }
169    }
170    {
171        typedef std::pair<const int, double> V;
172        V ar[] =
173        {
174            V(1, 1),
175            V(1, 1.5),
176            V(1, 2),
177            V(2, 1),
178            V(2, 1.5),
179            V(2, 2),
180            V(3, 1),
181            V(3, 1.5),
182            V(3, 2),
183            V(4, 1),
184            V(4, 1.5),
185            V(4, 2),
186            V(5, 1),
187            V(5, 1.5),
188            V(5, 2),
189            V(6, 1),
190            V(6, 1.5),
191            V(6, 2),
192            V(7, 1),
193            V(7, 1.5),
194            V(7, 2),
195            V(8, 1),
196            V(8, 1.5),
197            V(8, 2)
198        };
199        const std::multimap<int, double, std::less<int>, min_allocator<V>> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
200        assert(std::distance(m.begin(), m.end()) == m.size());
201        assert(std::distance(m.cbegin(), m.cend()) == m.size());
202        assert(std::distance(m.rbegin(), m.rend()) == m.size());
203        assert(std::distance(m.crbegin(), m.crend()) == m.size());
204        std::multimap<int, double, std::less<int>, min_allocator<V>>::const_iterator i;
205        i = m.begin();
206        for (int j = 1; j <= 8; ++j)
207            for (double d = 1; d <= 2; d += .5, ++i)
208            {
209                assert(i->first == j);
210                assert(i->second == d);
211            }
212    }
213#endif
214#if _LIBCPP_STD_VER > 11
215    { // N3644 testing
216        typedef std::multimap<int, double> C;
217        C::iterator ii1{}, ii2{};
218        C::iterator ii4 = ii1;
219        C::const_iterator cii{};
220        assert ( ii1 == ii2 );
221        assert ( ii1 == ii4 );
222
223        assert (!(ii1 != ii2 ));
224
225        assert ( (ii1 == cii ));
226        assert ( (cii == ii1 ));
227        assert (!(ii1 != cii ));
228        assert (!(cii != ii1 ));
229    }
230#endif
231}
232