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 // <array>
10 
11 // iterator, const_iterator
12 
13 #include <array>
14 #include <iterator>
15 #include <cassert>
16 
17 #include "test_macros.h"
18 
19 // std::array is explicitly allowed to be initialized with A a = { init-list };.
20 // Disable the missing braces warning for this reason.
21 #include "disable_missing_braces_warning.h"
22 
23 int main(int, char**)
24 {
25     {
26     typedef std::array<int, 5> C;
27     C c;
28     C::iterator i;
29     i = c.begin();
30     C::const_iterator j;
31     j = c.cbegin();
32     assert(i == j);
33     }
34     {
35     typedef std::array<int, 0> C;
36     C c;
37     C::iterator i;
38     i = c.begin();
39     C::const_iterator j;
40     j = c.cbegin();
41     assert(i == j);
42     }
43 
44 #if TEST_STD_VER > 11
45     { // N3644 testing
46         {
47         typedef std::array<int, 5> C;
48         C::iterator ii1{}, ii2{};
49         C::iterator ii4 = ii1;
50         C::const_iterator cii{};
51         assert ( ii1 == ii2 );
52         assert ( ii1 == ii4 );
53         assert ( ii1 == cii );
54 
55         assert ( !(ii1 != ii2 ));
56         assert ( !(ii1 != cii ));
57 
58         C c;
59         assert ( c.begin()   == std::begin(c));
60         assert ( c.cbegin()  == std::cbegin(c));
61         assert ( c.rbegin()  == std::rbegin(c));
62         assert ( c.crbegin() == std::crbegin(c));
63         assert ( c.end()     == std::end(c));
64         assert ( c.cend()    == std::cend(c));
65         assert ( c.rend()    == std::rend(c));
66         assert ( c.crend()   == std::crend(c));
67 
68         assert ( std::begin(c)   != std::end(c));
69         assert ( std::rbegin(c)  != std::rend(c));
70         assert ( std::cbegin(c)  != std::cend(c));
71         assert ( std::crbegin(c) != std::crend(c));
72         }
73         {
74         typedef std::array<int, 0> C;
75         C::iterator ii1{}, ii2{};
76         C::iterator ii4 = ii1;
77         C::const_iterator cii{};
78         assert ( ii1 == ii2 );
79         assert ( ii1 == ii4 );
80 
81         assert (!(ii1 != ii2 ));
82 
83         assert ( (ii1 == cii ));
84         assert ( (cii == ii1 ));
85         assert (!(ii1 != cii ));
86         assert (!(cii != ii1 ));
87         assert (!(ii1 <  cii ));
88         assert (!(cii <  ii1 ));
89         assert ( (ii1 <= cii ));
90         assert ( (cii <= ii1 ));
91         assert (!(ii1 >  cii ));
92         assert (!(cii >  ii1 ));
93         assert ( (ii1 >= cii ));
94         assert ( (cii >= ii1 ));
95         assert (cii - ii1 == 0);
96         assert (ii1 - cii == 0);
97 
98         C c;
99         assert ( c.begin()   == std::begin(c));
100         assert ( c.cbegin()  == std::cbegin(c));
101         assert ( c.rbegin()  == std::rbegin(c));
102         assert ( c.crbegin() == std::crbegin(c));
103         assert ( c.end()     == std::end(c));
104         assert ( c.cend()    == std::cend(c));
105         assert ( c.rend()    == std::rend(c));
106         assert ( c.crend()   == std::crend(c));
107 
108         assert ( std::begin(c)   == std::end(c));
109         assert ( std::rbegin(c)  == std::rend(c));
110         assert ( std::cbegin(c)  == std::cend(c));
111         assert ( std::crbegin(c) == std::crend(c));
112         }
113     }
114 #endif
115 #if TEST_STD_VER > 14
116     {
117         typedef std::array<int, 5> C;
118         constexpr C c{0,1,2,3,4};
119 
120         static_assert ( c.begin()   == std::begin(c), "");
121         static_assert ( c.cbegin()  == std::cbegin(c), "");
122         static_assert ( c.end()     == std::end(c), "");
123         static_assert ( c.cend()    == std::cend(c), "");
124 
125         static_assert ( c.rbegin()  == std::rbegin(c), "");
126         static_assert ( c.crbegin() == std::crbegin(c), "");
127         static_assert ( c.rend()    == std::rend(c), "");
128         static_assert ( c.crend()   == std::crend(c), "");
129 
130         static_assert ( std::begin(c)   != std::end(c), "");
131         static_assert ( std::rbegin(c)  != std::rend(c), "");
132         static_assert ( std::cbegin(c)  != std::cend(c), "");
133         static_assert ( std::crbegin(c) != std::crend(c), "");
134 
135         static_assert ( *c.begin()  == 0, "");
136         static_assert ( *c.rbegin()  == 4, "");
137 
138         static_assert ( *std::begin(c)   == 0, "" );
139         static_assert ( *std::cbegin(c)  == 0, "" );
140         static_assert ( *std::rbegin(c)  == 4, "" );
141         static_assert ( *std::crbegin(c) == 4, "" );
142     }
143 #endif
144 
145   return 0;
146 }
147