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 begin() noexcept; // constexpr in C++17 12 // const_iterator begin() const noexcept; // constexpr in C++17 13 // iterator end() noexcept; // constexpr in C++17 14 // const_iterator end() const noexcept; // constexpr in C++17 15 // 16 // reverse_iterator rbegin() noexcept; // constexpr in C++17 17 // const_reverse_iterator rbegin() const noexcept; // constexpr in C++17 18 // reverse_iterator rend() noexcept; // constexpr in C++17 19 // const_reverse_iterator rend() const noexcept; // constexpr in C++17 20 // 21 // const_iterator cbegin() const noexcept; // constexpr in C++17 22 // const_iterator cend() const noexcept; // constexpr in C++17 23 // const_reverse_iterator crbegin() const noexcept; // constexpr in C++17 24 // const_reverse_iterator crend() const noexcept; // constexpr in C++17 25 26 #include <array> 27 #include <iterator> 28 #include <cassert> 29 30 #include "test_macros.h" 31 32 // std::array is explicitly allowed to be initialized with A a = { init-list };. 33 // Disable the missing braces warning for this reason. 34 #include "disable_missing_braces_warning.h" 35 36 struct NoDefault { 37 TEST_CONSTEXPR NoDefault(int) { } 38 }; 39 40 TEST_CONSTEXPR_CXX17 bool tests() 41 { 42 { 43 typedef std::array<int, 5> C; 44 C array = {}; 45 typename C::iterator i = array.begin(); 46 typename C::const_iterator j = array.cbegin(); 47 assert(i == j); 48 } 49 { 50 typedef std::array<int, 0> C; 51 C array = {}; 52 typename C::iterator i = array.begin(); 53 typename C::const_iterator j = array.cbegin(); 54 assert(i == j); 55 LIBCPP_ASSERT(i != nullptr); 56 LIBCPP_ASSERT(j != nullptr); 57 } 58 59 { 60 typedef std::array<int, 0> C; 61 C array = {}; 62 typename C::iterator i = array.begin(); 63 typename C::const_iterator j = array.cbegin(); 64 assert(i == array.end()); 65 assert(j == array.cend()); 66 LIBCPP_ASSERT(i != nullptr); 67 LIBCPP_ASSERT(j != nullptr); 68 } 69 { 70 typedef std::array<int, 1> C; 71 C array = {1}; 72 typename C::iterator i = array.begin(); 73 assert(*i == 1); 74 assert(&*i == array.data()); 75 *i = 99; 76 assert(array[0] == 99); 77 } 78 { 79 typedef std::array<int, 2> C; 80 C array = {1, 2}; 81 typename C::iterator i = array.begin(); 82 assert(*i == 1); 83 assert(&*i == array.data()); 84 *i = 99; 85 assert(array[0] == 99); 86 assert(array[1] == 2); 87 } 88 { 89 typedef std::array<double, 3> C; 90 C array = {1, 2, 3.5}; 91 typename C::iterator i = array.begin(); 92 assert(*i == 1); 93 assert(&*i == array.data()); 94 *i = 5.5; 95 assert(array[0] == 5.5); 96 assert(array[1] == 2.0); 97 } 98 { 99 typedef std::array<NoDefault, 0> C; 100 C array = {}; 101 typename C::iterator ib = array.begin(); 102 typename C::iterator ie = array.end(); 103 assert(ib == ie); 104 LIBCPP_ASSERT(ib != nullptr); 105 LIBCPP_ASSERT(ie != nullptr); 106 } 107 108 #if TEST_STD_VER >= 14 109 { // N3644 testing 110 { 111 typedef std::array<int, 5> C; 112 C::iterator ii1{}, ii2{}; 113 C::iterator ii4 = ii1; 114 C::const_iterator cii{}; 115 assert(ii1 == ii2); 116 assert(ii1 == ii4); 117 assert(ii1 == cii); 118 119 assert(!(ii1 != ii2)); 120 assert(!(ii1 != cii)); 121 122 C c = {}; 123 assert(c.begin() == std::begin(c)); 124 assert(c.cbegin() == std::cbegin(c)); 125 assert(c.rbegin() == std::rbegin(c)); 126 assert(c.crbegin() == std::crbegin(c)); 127 assert(c.end() == std::end(c)); 128 assert(c.cend() == std::cend(c)); 129 assert(c.rend() == std::rend(c)); 130 assert(c.crend() == std::crend(c)); 131 132 assert(std::begin(c) != std::end(c)); 133 assert(std::rbegin(c) != std::rend(c)); 134 assert(std::cbegin(c) != std::cend(c)); 135 assert(std::crbegin(c) != std::crend(c)); 136 } 137 { 138 typedef std::array<int, 0> C; 139 C::iterator ii1{}, ii2{}; 140 C::iterator ii4 = ii1; 141 C::const_iterator cii{}; 142 assert(ii1 == ii2); 143 assert(ii1 == ii4); 144 145 assert(!(ii1 != ii2)); 146 147 assert( (ii1 == cii)); 148 assert( (cii == ii1)); 149 assert(!(ii1 != cii)); 150 assert(!(cii != ii1)); 151 assert(!(ii1 < cii)); 152 assert(!(cii < ii1)); 153 assert( (ii1 <= cii)); 154 assert( (cii <= ii1)); 155 assert(!(ii1 > cii)); 156 assert(!(cii > ii1)); 157 assert( (ii1 >= cii)); 158 assert( (cii >= ii1)); 159 assert(cii - ii1 == 0); 160 assert(ii1 - cii == 0); 161 162 C c = {}; 163 assert(c.begin() == std::begin(c)); 164 assert(c.cbegin() == std::cbegin(c)); 165 assert(c.rbegin() == std::rbegin(c)); 166 assert(c.crbegin() == std::crbegin(c)); 167 assert(c.end() == std::end(c)); 168 assert(c.cend() == std::cend(c)); 169 assert(c.rend() == std::rend(c)); 170 assert(c.crend() == std::crend(c)); 171 172 assert(std::begin(c) == std::end(c)); 173 assert(std::rbegin(c) == std::rend(c)); 174 assert(std::cbegin(c) == std::cend(c)); 175 assert(std::crbegin(c) == std::crend(c)); 176 } 177 } 178 #endif 179 return true; 180 } 181 182 int main(int, char**) 183 { 184 tests(); 185 #if TEST_STD_VER >= 17 186 static_assert(tests(), ""); 187 #endif 188 return 0; 189 } 190