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 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