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 int main()
21 {
22     {
23     typedef std::array<int, 5> C;
24     C c;
25     C::iterator i;
26     i = c.begin();
27     C::const_iterator j;
28     j = c.cbegin();
29     assert(i == j);
30     }
31     {
32     typedef std::array<int, 0> C;
33     C c;
34     C::iterator i;
35     i = c.begin();
36     C::const_iterator j;
37     j = c.cbegin();
38     assert(i == j);
39     }
40 
41 #if TEST_STD_VER > 11
42     { // N3644 testing
43         {
44         typedef std::array<int, 5> C;
45         C::iterator ii1{}, ii2{};
46         C::iterator ii4 = ii1;
47         C::const_iterator cii{};
48         assert ( ii1 == ii2 );
49         assert ( ii1 == ii4 );
50         assert ( ii1 == cii );
51 
52         assert ( !(ii1 != ii2 ));
53         assert ( !(ii1 != cii ));
54 
55         C c;
56         assert ( c.begin()   == std::begin(c));
57         assert ( c.cbegin()  == std::cbegin(c));
58         assert ( c.rbegin()  == std::rbegin(c));
59         assert ( c.crbegin() == std::crbegin(c));
60         assert ( c.end()     == std::end(c));
61         assert ( c.cend()    == std::cend(c));
62         assert ( c.rend()    == std::rend(c));
63         assert ( c.crend()   == std::crend(c));
64 
65         assert ( std::begin(c)   != std::end(c));
66         assert ( std::rbegin(c)  != std::rend(c));
67         assert ( std::cbegin(c)  != std::cend(c));
68         assert ( std::crbegin(c) != std::crend(c));
69         }
70         {
71         typedef std::array<int, 0> C;
72         C::iterator ii1{}, ii2{};
73         C::iterator ii4 = ii1;
74         C::const_iterator cii{};
75         assert ( ii1 == ii2 );
76         assert ( ii1 == ii4 );
77 
78         assert (!(ii1 != ii2 ));
79 
80         assert ( (ii1 == cii ));
81         assert ( (cii == ii1 ));
82         assert (!(ii1 != cii ));
83         assert (!(cii != ii1 ));
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 (cii - ii1 == 0);
93         assert (ii1 - cii == 0);
94 
95         C c;
96         assert ( c.begin()   == std::begin(c));
97         assert ( c.cbegin()  == std::cbegin(c));
98         assert ( c.rbegin()  == std::rbegin(c));
99         assert ( c.crbegin() == std::crbegin(c));
100         assert ( c.end()     == std::end(c));
101         assert ( c.cend()    == std::cend(c));
102         assert ( c.rend()    == std::rend(c));
103         assert ( c.crend()   == std::crend(c));
104 
105         assert ( std::begin(c)   == std::end(c));
106         assert ( std::rbegin(c)  == std::rend(c));
107         assert ( std::cbegin(c)  == std::cend(c));
108         assert ( std::crbegin(c) == std::crend(c));
109         }
110     }
111 #endif
112 }
113