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// UNSUPPORTED: c++03, c++11, c++14, c++17
9
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 assignment
39 {
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 pointer
44 // 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 assignment
181 {
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 assignment
227 {
228 std::span<int> spans[] = {
229 {}, {arr, arr + 1}, {arr, arr + 2}, {arr, arr + 3}, {arr + 1, arr + 3} // same size as s2
230 };
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 assignment
238 {
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 assignment
248 {
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

source code of libcxx/test/std/containers/views/views.span/span.cons/assign.pass.cpp