277 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8// UNSUPPORTED: c++03, c++11, c++14, c++179 10// <span>11 12// constexpr span& operator=(const span& other) noexcept = default;13 14#include <span>15#include <cassert>16#include <iterator>17#include <string>18#include <utility>19 20#include "test_macros.h"21 22template <typename T>23constexpr bool doAssign(T lhs, T rhs) {24 ASSERT_NOEXCEPT(std::declval<T&>() = rhs);25 lhs = rhs;26 return lhs.data() == rhs.data() && lhs.size() == rhs.size();27}28 29struct A {};30 31constexpr int carr1[] = {1, 2, 3, 4};32constexpr int carr2[] = {3, 4, 5};33constexpr int carr3[] = {7, 8};34int arr[] = {5, 6, 7, 9};35std::string strs[] = {"ABC", "DEF", "GHI"};36 37int main(int, char**) {38 // constexpr dynamically sized assignment39 {40 // On systems where 'ptrdiff_t' is a synonym for 'int',41 // the call span(ptr, 0) selects the (pointer, size_type) constructor.42 // On systems where 'ptrdiff_t' is NOT a synonym for 'int',43 // it is ambiguous, because of 0 also being convertible to a null pointer44 // and so the compiler can't choose between:45 // span(pointer, size_type)46 // and span(pointer, pointer)47 // We cast zero to std::ptrdiff_t to remove that ambiguity.48 // Example:49 // On darwin x86_64, ptrdiff_t is the same as long int.50 // On darwin i386, ptrdiff_t is the same as int.51 constexpr std::span<const int> spans[] = {52 {},53 {carr1, static_cast<std::size_t>(0)},54 {carr1, 1U},55 {carr1, 2U},56 {carr1, 3U},57 {carr1, 4U},58 {carr2, static_cast<std::size_t>(0)},59 {carr2, 1U},60 {carr2, 2U},61 {carr2, 3U},62 {carr3, static_cast<std::size_t>(0)},63 {carr3, 1U},64 {carr3, 2U}};65 66 static_assert(std::size(spans) == 13, "");67 68 // No for loops in constexpr land :-(69 static_assert(doAssign(spans[0], spans[0]), "");70 static_assert(doAssign(spans[0], spans[1]), "");71 static_assert(doAssign(spans[0], spans[2]), "");72 static_assert(doAssign(spans[0], spans[3]), "");73 static_assert(doAssign(spans[0], spans[4]), "");74 static_assert(doAssign(spans[0], spans[5]), "");75 static_assert(doAssign(spans[0], spans[6]), "");76 static_assert(doAssign(spans[0], spans[7]), "");77 static_assert(doAssign(spans[0], spans[8]), "");78 static_assert(doAssign(spans[0], spans[9]), "");79 static_assert(doAssign(spans[0], spans[10]), "");80 static_assert(doAssign(spans[0], spans[11]), "");81 static_assert(doAssign(spans[0], spans[12]), "");82 83 static_assert(doAssign(spans[1], spans[1]), "");84 static_assert(doAssign(spans[1], spans[2]), "");85 static_assert(doAssign(spans[1], spans[3]), "");86 static_assert(doAssign(spans[1], spans[4]), "");87 static_assert(doAssign(spans[1], spans[5]), "");88 static_assert(doAssign(spans[1], spans[6]), "");89 static_assert(doAssign(spans[1], spans[7]), "");90 static_assert(doAssign(spans[1], spans[8]), "");91 static_assert(doAssign(spans[1], spans[9]), "");92 static_assert(doAssign(spans[1], spans[10]), "");93 static_assert(doAssign(spans[1], spans[11]), "");94 static_assert(doAssign(spans[1], spans[12]), "");95 96 static_assert(doAssign(spans[2], spans[2]), "");97 static_assert(doAssign(spans[2], spans[3]), "");98 static_assert(doAssign(spans[2], spans[4]), "");99 static_assert(doAssign(spans[2], spans[5]), "");100 static_assert(doAssign(spans[2], spans[6]), "");101 static_assert(doAssign(spans[2], spans[7]), "");102 static_assert(doAssign(spans[2], spans[8]), "");103 static_assert(doAssign(spans[2], spans[9]), "");104 static_assert(doAssign(spans[2], spans[10]), "");105 static_assert(doAssign(spans[2], spans[11]), "");106 static_assert(doAssign(spans[2], spans[12]), "");107 108 static_assert(doAssign(spans[3], spans[3]), "");109 static_assert(doAssign(spans[3], spans[4]), "");110 static_assert(doAssign(spans[3], spans[4]), "");111 static_assert(doAssign(spans[3], spans[4]), "");112 static_assert(doAssign(spans[3], spans[4]), "");113 static_assert(doAssign(spans[3], spans[4]), "");114 static_assert(doAssign(spans[3], spans[4]), "");115 static_assert(doAssign(spans[3], spans[4]), "");116 static_assert(doAssign(spans[3], spans[4]), "");117 static_assert(doAssign(spans[3], spans[10]), "");118 static_assert(doAssign(spans[3], spans[11]), "");119 static_assert(doAssign(spans[3], spans[12]), "");120 121 static_assert(doAssign(spans[4], spans[4]), "");122 static_assert(doAssign(spans[4], spans[5]), "");123 static_assert(doAssign(spans[4], spans[6]), "");124 static_assert(doAssign(spans[4], spans[7]), "");125 static_assert(doAssign(spans[4], spans[8]), "");126 static_assert(doAssign(spans[4], spans[9]), "");127 static_assert(doAssign(spans[4], spans[10]), "");128 static_assert(doAssign(spans[4], spans[11]), "");129 static_assert(doAssign(spans[4], spans[12]), "");130 131 static_assert(doAssign(spans[5], spans[5]), "");132 static_assert(doAssign(spans[5], spans[6]), "");133 static_assert(doAssign(spans[5], spans[7]), "");134 static_assert(doAssign(spans[5], spans[8]), "");135 static_assert(doAssign(spans[5], spans[9]), "");136 static_assert(doAssign(spans[5], spans[10]), "");137 static_assert(doAssign(spans[5], spans[11]), "");138 static_assert(doAssign(spans[5], spans[12]), "");139 140 static_assert(doAssign(spans[6], spans[6]), "");141 static_assert(doAssign(spans[6], spans[7]), "");142 static_assert(doAssign(spans[6], spans[8]), "");143 static_assert(doAssign(spans[6], spans[9]), "");144 static_assert(doAssign(spans[6], spans[10]), "");145 static_assert(doAssign(spans[6], spans[11]), "");146 static_assert(doAssign(spans[6], spans[12]), "");147 148 static_assert(doAssign(spans[7], spans[7]), "");149 static_assert(doAssign(spans[7], spans[8]), "");150 static_assert(doAssign(spans[7], spans[9]), "");151 static_assert(doAssign(spans[7], spans[10]), "");152 static_assert(doAssign(spans[7], spans[11]), "");153 static_assert(doAssign(spans[7], spans[12]), "");154 155 static_assert(doAssign(spans[8], spans[8]), "");156 static_assert(doAssign(spans[8], spans[9]), "");157 static_assert(doAssign(spans[8], spans[10]), "");158 static_assert(doAssign(spans[8], spans[11]), "");159 static_assert(doAssign(spans[8], spans[12]), "");160 161 static_assert(doAssign(spans[9], spans[9]), "");162 static_assert(doAssign(spans[9], spans[10]), "");163 static_assert(doAssign(spans[9], spans[11]), "");164 static_assert(doAssign(spans[9], spans[12]), "");165 166 static_assert(doAssign(spans[10], spans[10]), "");167 static_assert(doAssign(spans[10], spans[11]), "");168 static_assert(doAssign(spans[10], spans[12]), "");169 170 static_assert(doAssign(spans[11], spans[11]), "");171 static_assert(doAssign(spans[11], spans[12]), "");172 173 static_assert(doAssign(spans[12], spans[12]), "");174 175 // for (size_t i = 0; i < std::size(spans); ++i)176 // for (size_t j = i; j < std::size(spans); ++j)177 // static_assert(doAssign(spans[i], spans[j]), "");178 }179 180 // constexpr statically sized assignment181 {182 using spanType = std::span<const int, 2>;183 constexpr spanType spans[] = {184 spanType{carr1, 2},185 spanType{carr1 + 1, 2},186 spanType{carr1 + 2, 2},187 spanType{carr2, 2},188 spanType{carr2 + 1, 2},189 spanType{carr3, 2}};190 191 static_assert(std::size(spans) == 6, "");192 193 // No for loops in constexpr land :-(194 static_assert(doAssign(spans[0], spans[0]), "");195 static_assert(doAssign(spans[0], spans[1]), "");196 static_assert(doAssign(spans[0], spans[2]), "");197 static_assert(doAssign(spans[0], spans[3]), "");198 static_assert(doAssign(spans[0], spans[4]), "");199 static_assert(doAssign(spans[0], spans[5]), "");200 201 static_assert(doAssign(spans[1], spans[1]), "");202 static_assert(doAssign(spans[1], spans[2]), "");203 static_assert(doAssign(spans[1], spans[3]), "");204 static_assert(doAssign(spans[1], spans[4]), "");205 static_assert(doAssign(spans[1], spans[5]), "");206 207 static_assert(doAssign(spans[2], spans[2]), "");208 static_assert(doAssign(spans[2], spans[3]), "");209 static_assert(doAssign(spans[2], spans[4]), "");210 static_assert(doAssign(spans[2], spans[5]), "");211 212 static_assert(doAssign(spans[3], spans[3]), "");213 static_assert(doAssign(spans[3], spans[4]), "");214 static_assert(doAssign(spans[3], spans[5]), "");215 216 static_assert(doAssign(spans[4], spans[4]), "");217 static_assert(doAssign(spans[4], spans[5]), "");218 219 static_assert(doAssign(spans[5], spans[5]), "");220 221 // for (size_t i = 0; i < std::size(spans); ++i)222 // for (size_t j = i; j < std::size(spans); ++j)223 // static_assert(doAssign(spans[i], spans[j]), "");224 }225 226 // dynamically sized assignment227 {228 std::span<int> spans[] = {229 {}, {arr, arr + 1}, {arr, arr + 2}, {arr, arr + 3}, {arr + 1, arr + 3} // same size as s2230 };231 232 for (std::size_t i = 0; i < std::size(spans); ++i)233 for (std::size_t j = i; j < std::size(spans); ++j)234 assert((doAssign(spans[i], spans[j])));235 }236 237 // statically sized assignment238 {239 using spanType = std::span<int, 2>;240 spanType spans[] = {spanType{arr, arr + 2}, spanType{arr + 1, arr + 3}, spanType{arr + 2, arr + 4}};241 242 for (std::size_t i = 0; i < std::size(spans); ++i)243 for (std::size_t j = i; j < std::size(spans); ++j)244 assert((doAssign(spans[i], spans[j])));245 }246 247 // dynamically sized assignment248 {249 std::span<std::string> spans[] = {250 {strs, strs},251 {strs, strs + 1},252 {strs, strs + 2},253 {strs, strs + 3},254 {strs + 1, strs + 1},255 {strs + 1, strs + 2},256 {strs + 1, strs + 3},257 {strs + 2, strs + 2},258 {strs + 2, strs + 3},259 {strs + 3, strs + 3}};260 261 for (std::size_t i = 0; i < std::size(spans); ++i)262 for (std::size_t j = i; j < std::size(spans); ++j)263 assert((doAssign(spans[i], spans[j])));264 }265 266 {267 using spanType = std::span<std::string, 1>;268 spanType spans[] = {spanType{strs, strs + 1}, spanType{strs + 1, strs + 2}, spanType{strs + 2, strs + 3}};269 270 for (std::size_t i = 0; i < std::size(spans); ++i)271 for (std::size_t j = i; j < std::size(spans); ++j)272 assert((doAssign(spans[i], spans[j])));273 }274 275 return 0;276}277