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