1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // <map>
10 
11 // class map
12 
13 //       iterator begin();
14 // const_iterator begin() const;
15 //       iterator end();
16 // const_iterator end()   const;
17 //
18 //       reverse_iterator rbegin();
19 // const_reverse_iterator rbegin() const;
20 //       reverse_iterator rend();
21 // const_reverse_iterator rend()   const;
22 //
23 // const_iterator         cbegin()  const;
24 // const_iterator         cend()    const;
25 // const_reverse_iterator crbegin() const;
26 // const_reverse_iterator crend()   const;
27 
28 #include <map>
29 #include <cassert>
30 #include <cstddef>
31 
32 #include "test_macros.h"
33 #include "min_allocator.h"
34 
35 int main(int, char**)
36 {
37     {
38         typedef std::pair<const int, double> V;
39         V ar[] =
40         {
41             V(1, 1),
42             V(1, 1.5),
43             V(1, 2),
44             V(2, 1),
45             V(2, 1.5),
46             V(2, 2),
47             V(3, 1),
48             V(3, 1.5),
49             V(3, 2),
50             V(4, 1),
51             V(4, 1.5),
52             V(4, 2),
53             V(5, 1),
54             V(5, 1.5),
55             V(5, 2),
56             V(6, 1),
57             V(6, 1.5),
58             V(6, 2),
59             V(7, 1),
60             V(7, 1.5),
61             V(7, 2),
62             V(8, 1),
63             V(8, 1.5),
64             V(8, 2)
65         };
66         std::map<int, double> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
67         assert(static_cast<std::size_t>(std::distance(m.begin(), m.end())) == m.size());
68         assert(static_cast<std::size_t>(std::distance(m.rbegin(), m.rend())) == m.size());
69         std::map<int, double>::iterator i;
70         i = m.begin();
71         std::map<int, double>::const_iterator k = i;
72         assert(i == k);
73         for (int j = 1; static_cast<std::size_t>(j) <= m.size(); ++j, ++i)
74         {
75             assert(i->first == j);
76             assert(i->second == 1);
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::map<int, double> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
111         assert(static_cast<std::size_t>(std::distance(m.begin(), m.end())) == m.size());
112         assert(static_cast<std::size_t>(std::distance(m.cbegin(), m.cend())) == m.size());
113         assert(static_cast<std::size_t>(std::distance(m.rbegin(), m.rend())) == m.size());
114         assert(static_cast<std::size_t>(std::distance(m.crbegin(), m.crend())) == m.size());
115         std::map<int, double>::const_iterator i;
116         i = m.begin();
117         for (int j = 1; static_cast<std::size_t>(j) <= m.size(); ++j, ++i)
118         {
119             assert(i->first == j);
120             assert(i->second == 1);
121         }
122     }
123 #if TEST_STD_VER >= 11
124     {
125         typedef std::pair<const int, double> V;
126         V ar[] =
127         {
128             V(1, 1),
129             V(1, 1.5),
130             V(1, 2),
131             V(2, 1),
132             V(2, 1.5),
133             V(2, 2),
134             V(3, 1),
135             V(3, 1.5),
136             V(3, 2),
137             V(4, 1),
138             V(4, 1.5),
139             V(4, 2),
140             V(5, 1),
141             V(5, 1.5),
142             V(5, 2),
143             V(6, 1),
144             V(6, 1.5),
145             V(6, 2),
146             V(7, 1),
147             V(7, 1.5),
148             V(7, 2),
149             V(8, 1),
150             V(8, 1.5),
151             V(8, 2)
152         };
153         std::map<int, double, std::less<int>, min_allocator<V>> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
154         assert(static_cast<std::size_t>(std::distance(m.begin(), m.end())) == m.size());
155         assert(static_cast<std::size_t>(std::distance(m.rbegin(), m.rend())) == m.size());
156         std::map<int, double, std::less<int>, min_allocator<V>>::iterator i;
157         i = m.begin();
158         std::map<int, double, std::less<int>, min_allocator<V>>::const_iterator k = i;
159         assert(i == k);
160         for (int j = 1; static_cast<std::size_t>(j) <= m.size(); ++j, ++i)
161         {
162             assert(i->first == j);
163             assert(i->second == 1);
164             i->second = 2.5;
165             assert(i->second == 2.5);
166         }
167     }
168     {
169         typedef std::pair<const int, double> V;
170         V ar[] =
171         {
172             V(1, 1),
173             V(1, 1.5),
174             V(1, 2),
175             V(2, 1),
176             V(2, 1.5),
177             V(2, 2),
178             V(3, 1),
179             V(3, 1.5),
180             V(3, 2),
181             V(4, 1),
182             V(4, 1.5),
183             V(4, 2),
184             V(5, 1),
185             V(5, 1.5),
186             V(5, 2),
187             V(6, 1),
188             V(6, 1.5),
189             V(6, 2),
190             V(7, 1),
191             V(7, 1.5),
192             V(7, 2),
193             V(8, 1),
194             V(8, 1.5),
195             V(8, 2)
196         };
197         const std::map<int, double, std::less<int>, min_allocator<V>> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
198         assert(static_cast<std::size_t>(std::distance(m.begin(), m.end())) == m.size());
199         assert(static_cast<std::size_t>(std::distance(m.cbegin(), m.cend())) == m.size());
200         assert(static_cast<std::size_t>(std::distance(m.rbegin(), m.rend())) == m.size());
201         assert(static_cast<std::size_t>(std::distance(m.crbegin(), m.crend())) == m.size());
202         std::map<int, double, std::less<int>, min_allocator<V>>::const_iterator i;
203         i = m.begin();
204         for (int j = 1; static_cast<std::size_t>(j) <= m.size(); ++j, ++i)
205         {
206             assert(i->first == j);
207             assert(i->second == 1);
208         }
209     }
210 #endif
211 #if TEST_STD_VER > 11
212     { // N3644 testing
213         typedef std::map<int, double> C;
214         C::iterator ii1{}, ii2{};
215         C::iterator ii4 = ii1;
216         C::const_iterator cii{};
217         assert ( ii1 == ii2 );
218         assert ( ii1 == ii4 );
219 
220         assert (!(ii1 != ii2 ));
221 
222         assert ( (ii1 == cii ));
223         assert ( (cii == ii1 ));
224         assert (!(ii1 != cii ));
225         assert (!(cii != ii1 ));
226     }
227 #endif
228 
229   return 0;
230 }
231