xref: /aosp_15_r20/external/libchrome/base/containers/span_unittest.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "base/containers/span.h"
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include <stdint.h>
8*635a8641SAndroid Build Coastguard Worker 
9*635a8641SAndroid Build Coastguard Worker #include <algorithm>
10*635a8641SAndroid Build Coastguard Worker #include <memory>
11*635a8641SAndroid Build Coastguard Worker #include <string>
12*635a8641SAndroid Build Coastguard Worker #include <vector>
13*635a8641SAndroid Build Coastguard Worker 
14*635a8641SAndroid Build Coastguard Worker #include "base/macros.h"
15*635a8641SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
16*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
17*635a8641SAndroid Build Coastguard Worker 
18*635a8641SAndroid Build Coastguard Worker using ::testing::ElementsAre;
19*635a8641SAndroid Build Coastguard Worker using ::testing::Eq;
20*635a8641SAndroid Build Coastguard Worker using ::testing::Pointwise;
21*635a8641SAndroid Build Coastguard Worker 
22*635a8641SAndroid Build Coastguard Worker namespace base {
23*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,DefaultConstructor)24*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, DefaultConstructor) {
25*635a8641SAndroid Build Coastguard Worker   span<int> dynamic_span;
26*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dynamic_span.data());
27*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0u, dynamic_span.size());
28*635a8641SAndroid Build Coastguard Worker 
29*635a8641SAndroid Build Coastguard Worker   constexpr span<int, 0> static_span;
30*635a8641SAndroid Build Coastguard Worker   static_assert(nullptr == static_span.data(), "");
31*635a8641SAndroid Build Coastguard Worker   static_assert(0u == static_span.size(), "");
32*635a8641SAndroid Build Coastguard Worker }
33*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromDataAndSize)34*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromDataAndSize) {
35*635a8641SAndroid Build Coastguard Worker   constexpr span<int> empty_span(nullptr, 0);
36*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(empty_span.empty());
37*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, empty_span.data());
38*635a8641SAndroid Build Coastguard Worker 
39*635a8641SAndroid Build Coastguard Worker   std::vector<int> vector = {1, 1, 2, 3, 5, 8};
40*635a8641SAndroid Build Coastguard Worker 
41*635a8641SAndroid Build Coastguard Worker   span<int> dynamic_span(vector.data(), vector.size());
42*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), dynamic_span.data());
43*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), dynamic_span.size());
44*635a8641SAndroid Build Coastguard Worker 
45*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < dynamic_span.size(); ++i)
46*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], dynamic_span[i]);
47*635a8641SAndroid Build Coastguard Worker 
48*635a8641SAndroid Build Coastguard Worker   span<int, 6> static_span(vector.data(), vector.size());
49*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), static_span.data());
50*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), static_span.size());
51*635a8641SAndroid Build Coastguard Worker 
52*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i)
53*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], static_span[i]);
54*635a8641SAndroid Build Coastguard Worker }
55*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromPointerPair)56*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromPointerPair) {
57*635a8641SAndroid Build Coastguard Worker   constexpr span<int> empty_span(nullptr, nullptr);
58*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(empty_span.empty());
59*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, empty_span.data());
60*635a8641SAndroid Build Coastguard Worker 
61*635a8641SAndroid Build Coastguard Worker   std::vector<int> vector = {1, 1, 2, 3, 5, 8};
62*635a8641SAndroid Build Coastguard Worker 
63*635a8641SAndroid Build Coastguard Worker   span<int> dynamic_span(vector.data(), vector.data() + vector.size() / 2);
64*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), dynamic_span.data());
65*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(vector.size() / 2, dynamic_span.size());
66*635a8641SAndroid Build Coastguard Worker 
67*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < dynamic_span.size(); ++i)
68*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], dynamic_span[i]);
69*635a8641SAndroid Build Coastguard Worker 
70*635a8641SAndroid Build Coastguard Worker   span<int, 3> static_span(vector.data(), vector.data() + vector.size() / 2);
71*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), static_span.data());
72*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(vector.size() / 2, static_span.size());
73*635a8641SAndroid Build Coastguard Worker 
74*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i)
75*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], static_span[i]);
76*635a8641SAndroid Build Coastguard Worker }
77*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromConstexprArray)78*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromConstexprArray) {
79*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray[] = {5, 4, 3, 2, 1};
80*635a8641SAndroid Build Coastguard Worker 
81*635a8641SAndroid Build Coastguard Worker   constexpr span<const int> dynamic_span(kArray);
82*635a8641SAndroid Build Coastguard Worker   static_assert(kArray == dynamic_span.data(), "");
83*635a8641SAndroid Build Coastguard Worker   static_assert(base::size(kArray) == dynamic_span.size(), "");
84*635a8641SAndroid Build Coastguard Worker 
85*635a8641SAndroid Build Coastguard Worker   static_assert(kArray[0] == dynamic_span[0], "");
86*635a8641SAndroid Build Coastguard Worker   static_assert(kArray[1] == dynamic_span[1], "");
87*635a8641SAndroid Build Coastguard Worker   static_assert(kArray[2] == dynamic_span[2], "");
88*635a8641SAndroid Build Coastguard Worker   static_assert(kArray[3] == dynamic_span[3], "");
89*635a8641SAndroid Build Coastguard Worker   static_assert(kArray[4] == dynamic_span[4], "");
90*635a8641SAndroid Build Coastguard Worker 
91*635a8641SAndroid Build Coastguard Worker   constexpr span<const int, base::size(kArray)> static_span(kArray);
92*635a8641SAndroid Build Coastguard Worker   static_assert(kArray == static_span.data(), "");
93*635a8641SAndroid Build Coastguard Worker   static_assert(base::size(kArray) == static_span.size(), "");
94*635a8641SAndroid Build Coastguard Worker 
95*635a8641SAndroid Build Coastguard Worker   static_assert(kArray[0] == static_span[0], "");
96*635a8641SAndroid Build Coastguard Worker   static_assert(kArray[1] == static_span[1], "");
97*635a8641SAndroid Build Coastguard Worker   static_assert(kArray[2] == static_span[2], "");
98*635a8641SAndroid Build Coastguard Worker   static_assert(kArray[3] == static_span[3], "");
99*635a8641SAndroid Build Coastguard Worker   static_assert(kArray[4] == static_span[4], "");
100*635a8641SAndroid Build Coastguard Worker }
101*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromArray)102*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromArray) {
103*635a8641SAndroid Build Coastguard Worker   int array[] = {5, 4, 3, 2, 1};
104*635a8641SAndroid Build Coastguard Worker 
105*635a8641SAndroid Build Coastguard Worker   span<const int> const_span(array);
106*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(array, const_span.data());
107*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(arraysize(array), const_span.size());
108*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < const_span.size(); ++i)
109*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(array[i], const_span[i]);
110*635a8641SAndroid Build Coastguard Worker 
111*635a8641SAndroid Build Coastguard Worker   span<int> dynamic_span(array);
112*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(array, dynamic_span.data());
113*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(base::size(array), dynamic_span.size());
114*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < dynamic_span.size(); ++i)
115*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(array[i], dynamic_span[i]);
116*635a8641SAndroid Build Coastguard Worker 
117*635a8641SAndroid Build Coastguard Worker   span<int, base::size(array)> static_span(array);
118*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(array, static_span.data());
119*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(base::size(array), static_span.size());
120*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i)
121*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(array[i], static_span[i]);
122*635a8641SAndroid Build Coastguard Worker }
123*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromStdArray)124*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromStdArray) {
125*635a8641SAndroid Build Coastguard Worker   // Note: Constructing a constexpr span from a constexpr std::array does not
126*635a8641SAndroid Build Coastguard Worker   // work prior to C++17 due to non-constexpr std::array::data.
127*635a8641SAndroid Build Coastguard Worker   std::array<int, 5> array = {{5, 4, 3, 2, 1}};
128*635a8641SAndroid Build Coastguard Worker 
129*635a8641SAndroid Build Coastguard Worker   span<const int> const_span(array);
130*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(array.data(), const_span.data());
131*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(array.size(), const_span.size());
132*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < const_span.size(); ++i)
133*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(array[i], const_span[i]);
134*635a8641SAndroid Build Coastguard Worker 
135*635a8641SAndroid Build Coastguard Worker   span<int> dynamic_span(array);
136*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(array.data(), dynamic_span.data());
137*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(array.size(), dynamic_span.size());
138*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < dynamic_span.size(); ++i)
139*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(array[i], dynamic_span[i]);
140*635a8641SAndroid Build Coastguard Worker 
141*635a8641SAndroid Build Coastguard Worker   span<int, base::size(array)> static_span(array);
142*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(array.data(), static_span.data());
143*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(array.size(), static_span.size());
144*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i)
145*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(array[i], static_span[i]);
146*635a8641SAndroid Build Coastguard Worker }
147*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromInitializerList)148*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromInitializerList) {
149*635a8641SAndroid Build Coastguard Worker   std::initializer_list<int> il = {1, 1, 2, 3, 5, 8};
150*635a8641SAndroid Build Coastguard Worker 
151*635a8641SAndroid Build Coastguard Worker   span<const int> const_span(il);
152*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(il.begin(), const_span.data());
153*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(il.size(), const_span.size());
154*635a8641SAndroid Build Coastguard Worker 
155*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < const_span.size(); ++i)
156*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(il.begin()[i], const_span[i]);
157*635a8641SAndroid Build Coastguard Worker 
158*635a8641SAndroid Build Coastguard Worker   span<const int, 6> static_span(il);
159*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(il.begin(), static_span.data());
160*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(il.size(), static_span.size());
161*635a8641SAndroid Build Coastguard Worker 
162*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i)
163*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(il.begin()[i], static_span[i]);
164*635a8641SAndroid Build Coastguard Worker }
165*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromStdString)166*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromStdString) {
167*635a8641SAndroid Build Coastguard Worker   std::string str = "foobar";
168*635a8641SAndroid Build Coastguard Worker 
169*635a8641SAndroid Build Coastguard Worker   span<const char> const_span(str);
170*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(str.data(), const_span.data());
171*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(str.size(), const_span.size());
172*635a8641SAndroid Build Coastguard Worker 
173*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < const_span.size(); ++i)
174*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(str[i], const_span[i]);
175*635a8641SAndroid Build Coastguard Worker 
176*635a8641SAndroid Build Coastguard Worker   span<char> dynamic_span(str);
177*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(str.data(), dynamic_span.data());
178*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(str.size(), dynamic_span.size());
179*635a8641SAndroid Build Coastguard Worker 
180*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < dynamic_span.size(); ++i)
181*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(str[i], dynamic_span[i]);
182*635a8641SAndroid Build Coastguard Worker 
183*635a8641SAndroid Build Coastguard Worker   span<char, 6> static_span(str);
184*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(str.data(), static_span.data());
185*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(str.size(), static_span.size());
186*635a8641SAndroid Build Coastguard Worker 
187*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i)
188*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(str[i], static_span[i]);
189*635a8641SAndroid Build Coastguard Worker }
190*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromConstContainer)191*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromConstContainer) {
192*635a8641SAndroid Build Coastguard Worker   const std::vector<int> vector = {1, 1, 2, 3, 5, 8};
193*635a8641SAndroid Build Coastguard Worker 
194*635a8641SAndroid Build Coastguard Worker   span<const int> const_span(vector);
195*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), const_span.data());
196*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), const_span.size());
197*635a8641SAndroid Build Coastguard Worker 
198*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < const_span.size(); ++i)
199*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], const_span[i]);
200*635a8641SAndroid Build Coastguard Worker 
201*635a8641SAndroid Build Coastguard Worker   span<const int, 6> static_span(vector);
202*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), static_span.data());
203*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), static_span.size());
204*635a8641SAndroid Build Coastguard Worker 
205*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i)
206*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], static_span[i]);
207*635a8641SAndroid Build Coastguard Worker }
208*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromContainer)209*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromContainer) {
210*635a8641SAndroid Build Coastguard Worker   std::vector<int> vector = {1, 1, 2, 3, 5, 8};
211*635a8641SAndroid Build Coastguard Worker 
212*635a8641SAndroid Build Coastguard Worker   span<const int> const_span(vector);
213*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), const_span.data());
214*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), const_span.size());
215*635a8641SAndroid Build Coastguard Worker 
216*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < const_span.size(); ++i)
217*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], const_span[i]);
218*635a8641SAndroid Build Coastguard Worker 
219*635a8641SAndroid Build Coastguard Worker   span<int> dynamic_span(vector);
220*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), dynamic_span.data());
221*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), dynamic_span.size());
222*635a8641SAndroid Build Coastguard Worker 
223*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < dynamic_span.size(); ++i)
224*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], dynamic_span[i]);
225*635a8641SAndroid Build Coastguard Worker 
226*635a8641SAndroid Build Coastguard Worker   span<int, 6> static_span(vector);
227*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), static_span.data());
228*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), static_span.size());
229*635a8641SAndroid Build Coastguard Worker 
230*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i)
231*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], static_span[i]);
232*635a8641SAndroid Build Coastguard Worker }
233*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,ConvertNonConstIntegralToConst)234*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, ConvertNonConstIntegralToConst) {
235*635a8641SAndroid Build Coastguard Worker   std::vector<int> vector = {1, 1, 2, 3, 5, 8};
236*635a8641SAndroid Build Coastguard Worker 
237*635a8641SAndroid Build Coastguard Worker   span<int> int_span(vector.data(), vector.size());
238*635a8641SAndroid Build Coastguard Worker   span<const int> const_span(int_span);
239*635a8641SAndroid Build Coastguard Worker   EXPECT_THAT(const_span, Pointwise(Eq(), int_span));
240*635a8641SAndroid Build Coastguard Worker 
241*635a8641SAndroid Build Coastguard Worker   span<int, 6> static_int_span(vector.data(), vector.size());
242*635a8641SAndroid Build Coastguard Worker   span<const int, 6> static_const_span(static_int_span);
243*635a8641SAndroid Build Coastguard Worker   EXPECT_THAT(static_const_span, Pointwise(Eq(), static_int_span));
244*635a8641SAndroid Build Coastguard Worker }
245*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,ConvertNonConstPointerToConst)246*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, ConvertNonConstPointerToConst) {
247*635a8641SAndroid Build Coastguard Worker   auto a = std::make_unique<int>(11);
248*635a8641SAndroid Build Coastguard Worker   auto b = std::make_unique<int>(22);
249*635a8641SAndroid Build Coastguard Worker   auto c = std::make_unique<int>(33);
250*635a8641SAndroid Build Coastguard Worker   std::vector<int*> vector = {a.get(), b.get(), c.get()};
251*635a8641SAndroid Build Coastguard Worker 
252*635a8641SAndroid Build Coastguard Worker   span<int*> non_const_pointer_span(vector);
253*635a8641SAndroid Build Coastguard Worker   EXPECT_THAT(non_const_pointer_span, Pointwise(Eq(), vector));
254*635a8641SAndroid Build Coastguard Worker   span<int* const> const_pointer_span(non_const_pointer_span);
255*635a8641SAndroid Build Coastguard Worker   EXPECT_THAT(const_pointer_span, Pointwise(Eq(), non_const_pointer_span));
256*635a8641SAndroid Build Coastguard Worker   // Note: no test for conversion from span<int> to span<const int*>, since that
257*635a8641SAndroid Build Coastguard Worker   // would imply a conversion from int** to const int**, which is unsafe.
258*635a8641SAndroid Build Coastguard Worker   //
259*635a8641SAndroid Build Coastguard Worker   // Note: no test for conversion from span<int*> to span<const int* const>,
260*635a8641SAndroid Build Coastguard Worker   // due to CWG Defect 330:
261*635a8641SAndroid Build Coastguard Worker   // http://open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#330
262*635a8641SAndroid Build Coastguard Worker 
263*635a8641SAndroid Build Coastguard Worker   span<int*, 3> static_non_const_pointer_span(vector);
264*635a8641SAndroid Build Coastguard Worker   EXPECT_THAT(static_non_const_pointer_span, Pointwise(Eq(), vector));
265*635a8641SAndroid Build Coastguard Worker   span<int* const, 3> static_const_pointer_span(static_non_const_pointer_span);
266*635a8641SAndroid Build Coastguard Worker   EXPECT_THAT(static_const_pointer_span,
267*635a8641SAndroid Build Coastguard Worker               Pointwise(Eq(), static_non_const_pointer_span));
268*635a8641SAndroid Build Coastguard Worker }
269*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,ConvertBetweenEquivalentTypes)270*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, ConvertBetweenEquivalentTypes) {
271*635a8641SAndroid Build Coastguard Worker   std::vector<int32_t> vector = {2, 4, 8, 16, 32};
272*635a8641SAndroid Build Coastguard Worker 
273*635a8641SAndroid Build Coastguard Worker   span<int32_t> int32_t_span(vector);
274*635a8641SAndroid Build Coastguard Worker   span<int> converted_span(int32_t_span);
275*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(int32_t_span, converted_span);
276*635a8641SAndroid Build Coastguard Worker 
277*635a8641SAndroid Build Coastguard Worker   span<int32_t, 5> static_int32_t_span(vector);
278*635a8641SAndroid Build Coastguard Worker   span<int, 5> static_converted_span(static_int32_t_span);
279*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(static_int32_t_span, static_converted_span);
280*635a8641SAndroid Build Coastguard Worker }
281*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,TemplatedFirst)282*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, TemplatedFirst) {
283*635a8641SAndroid Build Coastguard Worker   static constexpr int array[] = {1, 2, 3};
284*635a8641SAndroid Build Coastguard Worker   constexpr span<const int, 3> span(array);
285*635a8641SAndroid Build Coastguard Worker 
286*635a8641SAndroid Build Coastguard Worker   {
287*635a8641SAndroid Build Coastguard Worker     constexpr auto subspan = span.first<0>();
288*635a8641SAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
289*635a8641SAndroid Build Coastguard Worker     static_assert(0u == subspan.size(), "");
290*635a8641SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
291*635a8641SAndroid Build Coastguard Worker   }
292*635a8641SAndroid Build Coastguard Worker 
293*635a8641SAndroid Build Coastguard Worker   {
294*635a8641SAndroid Build Coastguard Worker     constexpr auto subspan = span.first<1>();
295*635a8641SAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
296*635a8641SAndroid Build Coastguard Worker     static_assert(1u == subspan.size(), "");
297*635a8641SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
298*635a8641SAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
299*635a8641SAndroid Build Coastguard Worker   }
300*635a8641SAndroid Build Coastguard Worker 
301*635a8641SAndroid Build Coastguard Worker   {
302*635a8641SAndroid Build Coastguard Worker     constexpr auto subspan = span.first<2>();
303*635a8641SAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
304*635a8641SAndroid Build Coastguard Worker     static_assert(2u == subspan.size(), "");
305*635a8641SAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
306*635a8641SAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
307*635a8641SAndroid Build Coastguard Worker     static_assert(2 == subspan[1], "");
308*635a8641SAndroid Build Coastguard Worker   }
309*635a8641SAndroid Build Coastguard Worker 
310*635a8641SAndroid Build Coastguard Worker   {
311*635a8641SAndroid Build Coastguard Worker     constexpr auto subspan = span.first<3>();
312*635a8641SAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
313*635a8641SAndroid Build Coastguard Worker     static_assert(3u == subspan.size(), "");
314*635a8641SAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
315*635a8641SAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
316*635a8641SAndroid Build Coastguard Worker     static_assert(2 == subspan[1], "");
317*635a8641SAndroid Build Coastguard Worker     static_assert(3 == subspan[2], "");
318*635a8641SAndroid Build Coastguard Worker   }
319*635a8641SAndroid Build Coastguard Worker }
320*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,TemplatedLast)321*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, TemplatedLast) {
322*635a8641SAndroid Build Coastguard Worker   static constexpr int array[] = {1, 2, 3};
323*635a8641SAndroid Build Coastguard Worker   constexpr span<const int, 3> span(array);
324*635a8641SAndroid Build Coastguard Worker 
325*635a8641SAndroid Build Coastguard Worker   {
326*635a8641SAndroid Build Coastguard Worker     constexpr auto subspan = span.last<0>();
327*635a8641SAndroid Build Coastguard Worker     static_assert(span.data() + 3 == subspan.data(), "");
328*635a8641SAndroid Build Coastguard Worker     static_assert(0u == subspan.size(), "");
329*635a8641SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
330*635a8641SAndroid Build Coastguard Worker   }
331*635a8641SAndroid Build Coastguard Worker 
332*635a8641SAndroid Build Coastguard Worker   {
333*635a8641SAndroid Build Coastguard Worker     constexpr auto subspan = span.last<1>();
334*635a8641SAndroid Build Coastguard Worker     static_assert(span.data() + 2 == subspan.data(), "");
335*635a8641SAndroid Build Coastguard Worker     static_assert(1u == subspan.size(), "");
336*635a8641SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
337*635a8641SAndroid Build Coastguard Worker     static_assert(3 == subspan[0], "");
338*635a8641SAndroid Build Coastguard Worker   }
339*635a8641SAndroid Build Coastguard Worker 
340*635a8641SAndroid Build Coastguard Worker   {
341*635a8641SAndroid Build Coastguard Worker     constexpr auto subspan = span.last<2>();
342*635a8641SAndroid Build Coastguard Worker     static_assert(span.data() + 1 == subspan.data(), "");
343*635a8641SAndroid Build Coastguard Worker     static_assert(2u == subspan.size(), "");
344*635a8641SAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
345*635a8641SAndroid Build Coastguard Worker     static_assert(2 == subspan[0], "");
346*635a8641SAndroid Build Coastguard Worker     static_assert(3 == subspan[1], "");
347*635a8641SAndroid Build Coastguard Worker   }
348*635a8641SAndroid Build Coastguard Worker 
349*635a8641SAndroid Build Coastguard Worker   {
350*635a8641SAndroid Build Coastguard Worker     constexpr auto subspan = span.last<3>();
351*635a8641SAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
352*635a8641SAndroid Build Coastguard Worker     static_assert(3u == subspan.size(), "");
353*635a8641SAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
354*635a8641SAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
355*635a8641SAndroid Build Coastguard Worker     static_assert(2 == subspan[1], "");
356*635a8641SAndroid Build Coastguard Worker     static_assert(3 == subspan[2], "");
357*635a8641SAndroid Build Coastguard Worker   }
358*635a8641SAndroid Build Coastguard Worker }
359*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,TemplatedSubspan)360*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, TemplatedSubspan) {
361*635a8641SAndroid Build Coastguard Worker   static constexpr int array[] = {1, 2, 3};
362*635a8641SAndroid Build Coastguard Worker   constexpr span<const int, 3> span(array);
363*635a8641SAndroid Build Coastguard Worker 
364*635a8641SAndroid Build Coastguard Worker   {
365*635a8641SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<0>();
366*635a8641SAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
367*635a8641SAndroid Build Coastguard Worker     static_assert(3u == subspan.size(), "");
368*635a8641SAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
369*635a8641SAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
370*635a8641SAndroid Build Coastguard Worker     static_assert(2 == subspan[1], "");
371*635a8641SAndroid Build Coastguard Worker     static_assert(3 == subspan[2], "");
372*635a8641SAndroid Build Coastguard Worker   }
373*635a8641SAndroid Build Coastguard Worker 
374*635a8641SAndroid Build Coastguard Worker   {
375*635a8641SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<1>();
376*635a8641SAndroid Build Coastguard Worker     static_assert(span.data() + 1 == subspan.data(), "");
377*635a8641SAndroid Build Coastguard Worker     static_assert(2u == subspan.size(), "");
378*635a8641SAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
379*635a8641SAndroid Build Coastguard Worker     static_assert(2 == subspan[0], "");
380*635a8641SAndroid Build Coastguard Worker     static_assert(3 == subspan[1], "");
381*635a8641SAndroid Build Coastguard Worker   }
382*635a8641SAndroid Build Coastguard Worker 
383*635a8641SAndroid Build Coastguard Worker   {
384*635a8641SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<2>();
385*635a8641SAndroid Build Coastguard Worker     static_assert(span.data() + 2 == subspan.data(), "");
386*635a8641SAndroid Build Coastguard Worker     static_assert(1u == subspan.size(), "");
387*635a8641SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
388*635a8641SAndroid Build Coastguard Worker     static_assert(3 == subspan[0], "");
389*635a8641SAndroid Build Coastguard Worker   }
390*635a8641SAndroid Build Coastguard Worker 
391*635a8641SAndroid Build Coastguard Worker   {
392*635a8641SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<3>();
393*635a8641SAndroid Build Coastguard Worker     static_assert(span.data() + 3 == subspan.data(), "");
394*635a8641SAndroid Build Coastguard Worker     static_assert(0u == subspan.size(), "");
395*635a8641SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
396*635a8641SAndroid Build Coastguard Worker   }
397*635a8641SAndroid Build Coastguard Worker 
398*635a8641SAndroid Build Coastguard Worker   {
399*635a8641SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<0, 0>();
400*635a8641SAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
401*635a8641SAndroid Build Coastguard Worker     static_assert(0u == subspan.size(), "");
402*635a8641SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
403*635a8641SAndroid Build Coastguard Worker   }
404*635a8641SAndroid Build Coastguard Worker 
405*635a8641SAndroid Build Coastguard Worker   {
406*635a8641SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<1, 0>();
407*635a8641SAndroid Build Coastguard Worker     static_assert(span.data() + 1 == subspan.data(), "");
408*635a8641SAndroid Build Coastguard Worker     static_assert(0u == subspan.size(), "");
409*635a8641SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
410*635a8641SAndroid Build Coastguard Worker   }
411*635a8641SAndroid Build Coastguard Worker 
412*635a8641SAndroid Build Coastguard Worker   {
413*635a8641SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<2, 0>();
414*635a8641SAndroid Build Coastguard Worker     static_assert(span.data() + 2 == subspan.data(), "");
415*635a8641SAndroid Build Coastguard Worker     static_assert(0u == subspan.size(), "");
416*635a8641SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
417*635a8641SAndroid Build Coastguard Worker   }
418*635a8641SAndroid Build Coastguard Worker 
419*635a8641SAndroid Build Coastguard Worker   {
420*635a8641SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<0, 1>();
421*635a8641SAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
422*635a8641SAndroid Build Coastguard Worker     static_assert(1u == subspan.size(), "");
423*635a8641SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
424*635a8641SAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
425*635a8641SAndroid Build Coastguard Worker   }
426*635a8641SAndroid Build Coastguard Worker 
427*635a8641SAndroid Build Coastguard Worker   {
428*635a8641SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<1, 1>();
429*635a8641SAndroid Build Coastguard Worker     static_assert(span.data() + 1 == subspan.data(), "");
430*635a8641SAndroid Build Coastguard Worker     static_assert(1u == subspan.size(), "");
431*635a8641SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
432*635a8641SAndroid Build Coastguard Worker     static_assert(2 == subspan[0], "");
433*635a8641SAndroid Build Coastguard Worker   }
434*635a8641SAndroid Build Coastguard Worker 
435*635a8641SAndroid Build Coastguard Worker   {
436*635a8641SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<2, 1>();
437*635a8641SAndroid Build Coastguard Worker     static_assert(span.data() + 2 == subspan.data(), "");
438*635a8641SAndroid Build Coastguard Worker     static_assert(1u == subspan.size(), "");
439*635a8641SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
440*635a8641SAndroid Build Coastguard Worker     static_assert(3 == subspan[0], "");
441*635a8641SAndroid Build Coastguard Worker   }
442*635a8641SAndroid Build Coastguard Worker 
443*635a8641SAndroid Build Coastguard Worker   {
444*635a8641SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<0, 2>();
445*635a8641SAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
446*635a8641SAndroid Build Coastguard Worker     static_assert(2u == subspan.size(), "");
447*635a8641SAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
448*635a8641SAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
449*635a8641SAndroid Build Coastguard Worker     static_assert(2 == subspan[1], "");
450*635a8641SAndroid Build Coastguard Worker   }
451*635a8641SAndroid Build Coastguard Worker 
452*635a8641SAndroid Build Coastguard Worker   {
453*635a8641SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<1, 2>();
454*635a8641SAndroid Build Coastguard Worker     static_assert(span.data() + 1 == subspan.data(), "");
455*635a8641SAndroid Build Coastguard Worker     static_assert(2u == subspan.size(), "");
456*635a8641SAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
457*635a8641SAndroid Build Coastguard Worker     static_assert(2 == subspan[0], "");
458*635a8641SAndroid Build Coastguard Worker     static_assert(3 == subspan[1], "");
459*635a8641SAndroid Build Coastguard Worker   }
460*635a8641SAndroid Build Coastguard Worker 
461*635a8641SAndroid Build Coastguard Worker   {
462*635a8641SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<0, 3>();
463*635a8641SAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
464*635a8641SAndroid Build Coastguard Worker     static_assert(3u == subspan.size(), "");
465*635a8641SAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
466*635a8641SAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
467*635a8641SAndroid Build Coastguard Worker     static_assert(2 == subspan[1], "");
468*635a8641SAndroid Build Coastguard Worker     static_assert(3 == subspan[2], "");
469*635a8641SAndroid Build Coastguard Worker   }
470*635a8641SAndroid Build Coastguard Worker }
471*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,TemplatedFirstOnDynamicSpan)472*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, TemplatedFirstOnDynamicSpan) {
473*635a8641SAndroid Build Coastguard Worker   int array[] = {1, 2, 3};
474*635a8641SAndroid Build Coastguard Worker   span<const int> span(array);
475*635a8641SAndroid Build Coastguard Worker 
476*635a8641SAndroid Build Coastguard Worker   {
477*635a8641SAndroid Build Coastguard Worker     auto subspan = span.first<0>();
478*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
479*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
480*635a8641SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
481*635a8641SAndroid Build Coastguard Worker   }
482*635a8641SAndroid Build Coastguard Worker 
483*635a8641SAndroid Build Coastguard Worker   {
484*635a8641SAndroid Build Coastguard Worker     auto subspan = span.first<1>();
485*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
486*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
487*635a8641SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
488*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
489*635a8641SAndroid Build Coastguard Worker   }
490*635a8641SAndroid Build Coastguard Worker 
491*635a8641SAndroid Build Coastguard Worker   {
492*635a8641SAndroid Build Coastguard Worker     auto subspan = span.first<2>();
493*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
494*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
495*635a8641SAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
496*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
497*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
498*635a8641SAndroid Build Coastguard Worker   }
499*635a8641SAndroid Build Coastguard Worker 
500*635a8641SAndroid Build Coastguard Worker   {
501*635a8641SAndroid Build Coastguard Worker     auto subspan = span.first<3>();
502*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
503*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3u, subspan.size());
504*635a8641SAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
505*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
506*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
507*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
508*635a8641SAndroid Build Coastguard Worker   }
509*635a8641SAndroid Build Coastguard Worker }
510*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,TemplatedLastOnDynamicSpan)511*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, TemplatedLastOnDynamicSpan) {
512*635a8641SAndroid Build Coastguard Worker   int array[] = {1, 2, 3};
513*635a8641SAndroid Build Coastguard Worker   span<int> span(array);
514*635a8641SAndroid Build Coastguard Worker 
515*635a8641SAndroid Build Coastguard Worker   {
516*635a8641SAndroid Build Coastguard Worker     auto subspan = span.last<0>();
517*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 3, subspan.data());
518*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
519*635a8641SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
520*635a8641SAndroid Build Coastguard Worker   }
521*635a8641SAndroid Build Coastguard Worker 
522*635a8641SAndroid Build Coastguard Worker   {
523*635a8641SAndroid Build Coastguard Worker     auto subspan = span.last<1>();
524*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
525*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
526*635a8641SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
527*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[0]);
528*635a8641SAndroid Build Coastguard Worker   }
529*635a8641SAndroid Build Coastguard Worker 
530*635a8641SAndroid Build Coastguard Worker   {
531*635a8641SAndroid Build Coastguard Worker     auto subspan = span.last<2>();
532*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
533*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
534*635a8641SAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
535*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
536*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[1]);
537*635a8641SAndroid Build Coastguard Worker   }
538*635a8641SAndroid Build Coastguard Worker 
539*635a8641SAndroid Build Coastguard Worker   {
540*635a8641SAndroid Build Coastguard Worker     auto subspan = span.last<3>();
541*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
542*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3u, subspan.size());
543*635a8641SAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
544*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
545*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
546*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
547*635a8641SAndroid Build Coastguard Worker   }
548*635a8641SAndroid Build Coastguard Worker }
549*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,TemplatedSubspanFromDynamicSpan)550*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, TemplatedSubspanFromDynamicSpan) {
551*635a8641SAndroid Build Coastguard Worker   int array[] = {1, 2, 3};
552*635a8641SAndroid Build Coastguard Worker   span<int, 3> span(array);
553*635a8641SAndroid Build Coastguard Worker 
554*635a8641SAndroid Build Coastguard Worker   {
555*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan<0>();
556*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
557*635a8641SAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
558*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3u, subspan.size());
559*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
560*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
561*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
562*635a8641SAndroid Build Coastguard Worker   }
563*635a8641SAndroid Build Coastguard Worker 
564*635a8641SAndroid Build Coastguard Worker   {
565*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan<1>();
566*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
567*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
568*635a8641SAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
569*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
570*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[1]);
571*635a8641SAndroid Build Coastguard Worker   }
572*635a8641SAndroid Build Coastguard Worker 
573*635a8641SAndroid Build Coastguard Worker   {
574*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan<2>();
575*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
576*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
577*635a8641SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
578*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[0]);
579*635a8641SAndroid Build Coastguard Worker   }
580*635a8641SAndroid Build Coastguard Worker 
581*635a8641SAndroid Build Coastguard Worker   {
582*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan<3>();
583*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 3, subspan.data());
584*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
585*635a8641SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
586*635a8641SAndroid Build Coastguard Worker   }
587*635a8641SAndroid Build Coastguard Worker 
588*635a8641SAndroid Build Coastguard Worker   {
589*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan<0, 0>();
590*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
591*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
592*635a8641SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
593*635a8641SAndroid Build Coastguard Worker   }
594*635a8641SAndroid Build Coastguard Worker 
595*635a8641SAndroid Build Coastguard Worker   {
596*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan<1, 0>();
597*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
598*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
599*635a8641SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
600*635a8641SAndroid Build Coastguard Worker   }
601*635a8641SAndroid Build Coastguard Worker 
602*635a8641SAndroid Build Coastguard Worker   {
603*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan<2, 0>();
604*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
605*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
606*635a8641SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
607*635a8641SAndroid Build Coastguard Worker   }
608*635a8641SAndroid Build Coastguard Worker 
609*635a8641SAndroid Build Coastguard Worker   {
610*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan<0, 1>();
611*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
612*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
613*635a8641SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
614*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
615*635a8641SAndroid Build Coastguard Worker   }
616*635a8641SAndroid Build Coastguard Worker 
617*635a8641SAndroid Build Coastguard Worker   {
618*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan<1, 1>();
619*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
620*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
621*635a8641SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
622*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
623*635a8641SAndroid Build Coastguard Worker   }
624*635a8641SAndroid Build Coastguard Worker 
625*635a8641SAndroid Build Coastguard Worker   {
626*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan<2, 1>();
627*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
628*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
629*635a8641SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
630*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[0]);
631*635a8641SAndroid Build Coastguard Worker   }
632*635a8641SAndroid Build Coastguard Worker 
633*635a8641SAndroid Build Coastguard Worker   {
634*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan<0, 2>();
635*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
636*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
637*635a8641SAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
638*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
639*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
640*635a8641SAndroid Build Coastguard Worker   }
641*635a8641SAndroid Build Coastguard Worker 
642*635a8641SAndroid Build Coastguard Worker   {
643*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan<1, 2>();
644*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
645*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
646*635a8641SAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
647*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
648*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[1]);
649*635a8641SAndroid Build Coastguard Worker   }
650*635a8641SAndroid Build Coastguard Worker 
651*635a8641SAndroid Build Coastguard Worker   {
652*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan<0, 3>();
653*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
654*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3u, subspan.size());
655*635a8641SAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
656*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
657*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
658*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
659*635a8641SAndroid Build Coastguard Worker   }
660*635a8641SAndroid Build Coastguard Worker }
661*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,First)662*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, First) {
663*635a8641SAndroid Build Coastguard Worker   int array[] = {1, 2, 3};
664*635a8641SAndroid Build Coastguard Worker   span<int> span(array);
665*635a8641SAndroid Build Coastguard Worker 
666*635a8641SAndroid Build Coastguard Worker   {
667*635a8641SAndroid Build Coastguard Worker     auto subspan = span.first(0);
668*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
669*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
670*635a8641SAndroid Build Coastguard Worker   }
671*635a8641SAndroid Build Coastguard Worker 
672*635a8641SAndroid Build Coastguard Worker   {
673*635a8641SAndroid Build Coastguard Worker     auto subspan = span.first(1);
674*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
675*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
676*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
677*635a8641SAndroid Build Coastguard Worker   }
678*635a8641SAndroid Build Coastguard Worker 
679*635a8641SAndroid Build Coastguard Worker   {
680*635a8641SAndroid Build Coastguard Worker     auto subspan = span.first(2);
681*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
682*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
683*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
684*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
685*635a8641SAndroid Build Coastguard Worker   }
686*635a8641SAndroid Build Coastguard Worker 
687*635a8641SAndroid Build Coastguard Worker   {
688*635a8641SAndroid Build Coastguard Worker     auto subspan = span.first(3);
689*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
690*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3u, subspan.size());
691*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
692*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
693*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
694*635a8641SAndroid Build Coastguard Worker   }
695*635a8641SAndroid Build Coastguard Worker }
696*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,Last)697*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, Last) {
698*635a8641SAndroid Build Coastguard Worker   int array[] = {1, 2, 3};
699*635a8641SAndroid Build Coastguard Worker   span<int> span(array);
700*635a8641SAndroid Build Coastguard Worker 
701*635a8641SAndroid Build Coastguard Worker   {
702*635a8641SAndroid Build Coastguard Worker     auto subspan = span.last(0);
703*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 3, subspan.data());
704*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
705*635a8641SAndroid Build Coastguard Worker   }
706*635a8641SAndroid Build Coastguard Worker 
707*635a8641SAndroid Build Coastguard Worker   {
708*635a8641SAndroid Build Coastguard Worker     auto subspan = span.last(1);
709*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
710*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
711*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[0]);
712*635a8641SAndroid Build Coastguard Worker   }
713*635a8641SAndroid Build Coastguard Worker 
714*635a8641SAndroid Build Coastguard Worker   {
715*635a8641SAndroid Build Coastguard Worker     auto subspan = span.last(2);
716*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
717*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
718*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
719*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[1]);
720*635a8641SAndroid Build Coastguard Worker   }
721*635a8641SAndroid Build Coastguard Worker 
722*635a8641SAndroid Build Coastguard Worker   {
723*635a8641SAndroid Build Coastguard Worker     auto subspan = span.last(3);
724*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
725*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3u, subspan.size());
726*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
727*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
728*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
729*635a8641SAndroid Build Coastguard Worker   }
730*635a8641SAndroid Build Coastguard Worker }
731*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,Subspan)732*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, Subspan) {
733*635a8641SAndroid Build Coastguard Worker   int array[] = {1, 2, 3};
734*635a8641SAndroid Build Coastguard Worker   span<int> span(array);
735*635a8641SAndroid Build Coastguard Worker 
736*635a8641SAndroid Build Coastguard Worker   {
737*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan(0);
738*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
739*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3u, subspan.size());
740*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
741*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
742*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
743*635a8641SAndroid Build Coastguard Worker   }
744*635a8641SAndroid Build Coastguard Worker 
745*635a8641SAndroid Build Coastguard Worker   {
746*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan(1);
747*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
748*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
749*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
750*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[1]);
751*635a8641SAndroid Build Coastguard Worker   }
752*635a8641SAndroid Build Coastguard Worker 
753*635a8641SAndroid Build Coastguard Worker   {
754*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan(2);
755*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
756*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
757*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[0]);
758*635a8641SAndroid Build Coastguard Worker   }
759*635a8641SAndroid Build Coastguard Worker 
760*635a8641SAndroid Build Coastguard Worker   {
761*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan(3);
762*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 3, subspan.data());
763*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
764*635a8641SAndroid Build Coastguard Worker   }
765*635a8641SAndroid Build Coastguard Worker 
766*635a8641SAndroid Build Coastguard Worker   {
767*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan(0, 0);
768*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
769*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
770*635a8641SAndroid Build Coastguard Worker   }
771*635a8641SAndroid Build Coastguard Worker 
772*635a8641SAndroid Build Coastguard Worker   {
773*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan(1, 0);
774*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
775*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
776*635a8641SAndroid Build Coastguard Worker   }
777*635a8641SAndroid Build Coastguard Worker 
778*635a8641SAndroid Build Coastguard Worker   {
779*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan(2, 0);
780*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
781*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
782*635a8641SAndroid Build Coastguard Worker   }
783*635a8641SAndroid Build Coastguard Worker 
784*635a8641SAndroid Build Coastguard Worker   {
785*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan(0, 1);
786*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
787*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
788*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
789*635a8641SAndroid Build Coastguard Worker   }
790*635a8641SAndroid Build Coastguard Worker 
791*635a8641SAndroid Build Coastguard Worker   {
792*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan(1, 1);
793*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
794*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
795*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
796*635a8641SAndroid Build Coastguard Worker   }
797*635a8641SAndroid Build Coastguard Worker 
798*635a8641SAndroid Build Coastguard Worker   {
799*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan(2, 1);
800*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
801*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
802*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[0]);
803*635a8641SAndroid Build Coastguard Worker   }
804*635a8641SAndroid Build Coastguard Worker 
805*635a8641SAndroid Build Coastguard Worker   {
806*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan(0, 2);
807*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
808*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
809*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
810*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
811*635a8641SAndroid Build Coastguard Worker   }
812*635a8641SAndroid Build Coastguard Worker 
813*635a8641SAndroid Build Coastguard Worker   {
814*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan(1, 2);
815*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
816*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
817*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
818*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[1]);
819*635a8641SAndroid Build Coastguard Worker   }
820*635a8641SAndroid Build Coastguard Worker 
821*635a8641SAndroid Build Coastguard Worker   {
822*635a8641SAndroid Build Coastguard Worker     auto subspan = span.subspan(0, 3);
823*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
824*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(span.size(), subspan.size());
825*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
826*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
827*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
828*635a8641SAndroid Build Coastguard Worker   }
829*635a8641SAndroid Build Coastguard Worker }
830*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,Size)831*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, Size) {
832*635a8641SAndroid Build Coastguard Worker   {
833*635a8641SAndroid Build Coastguard Worker     span<int> span;
834*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(0u, span.size());
835*635a8641SAndroid Build Coastguard Worker   }
836*635a8641SAndroid Build Coastguard Worker 
837*635a8641SAndroid Build Coastguard Worker   {
838*635a8641SAndroid Build Coastguard Worker     int array[] = {1, 2, 3};
839*635a8641SAndroid Build Coastguard Worker     span<int> span(array);
840*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3u, span.size());
841*635a8641SAndroid Build Coastguard Worker   }
842*635a8641SAndroid Build Coastguard Worker }
843*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,SizeBytes)844*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, SizeBytes) {
845*635a8641SAndroid Build Coastguard Worker   {
846*635a8641SAndroid Build Coastguard Worker     span<int> span;
847*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(0u, span.size_bytes());
848*635a8641SAndroid Build Coastguard Worker   }
849*635a8641SAndroid Build Coastguard Worker 
850*635a8641SAndroid Build Coastguard Worker   {
851*635a8641SAndroid Build Coastguard Worker     int array[] = {1, 2, 3};
852*635a8641SAndroid Build Coastguard Worker     span<int> span(array);
853*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3u * sizeof(int), span.size_bytes());
854*635a8641SAndroid Build Coastguard Worker   }
855*635a8641SAndroid Build Coastguard Worker }
856*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,Empty)857*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, Empty) {
858*635a8641SAndroid Build Coastguard Worker   {
859*635a8641SAndroid Build Coastguard Worker     span<int> span;
860*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(span.empty());
861*635a8641SAndroid Build Coastguard Worker   }
862*635a8641SAndroid Build Coastguard Worker 
863*635a8641SAndroid Build Coastguard Worker   {
864*635a8641SAndroid Build Coastguard Worker     int array[] = {1, 2, 3};
865*635a8641SAndroid Build Coastguard Worker     span<int> span(array);
866*635a8641SAndroid Build Coastguard Worker     EXPECT_FALSE(span.empty());
867*635a8641SAndroid Build Coastguard Worker   }
868*635a8641SAndroid Build Coastguard Worker }
869*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,OperatorAt)870*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, OperatorAt) {
871*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 6, 1, 8, 0};
872*635a8641SAndroid Build Coastguard Worker   constexpr span<const int> span(kArray);
873*635a8641SAndroid Build Coastguard Worker 
874*635a8641SAndroid Build Coastguard Worker   static_assert(kArray[0] == span[0], "span[0] does not equal kArray[0]");
875*635a8641SAndroid Build Coastguard Worker   static_assert(kArray[1] == span[1], "span[1] does not equal kArray[1]");
876*635a8641SAndroid Build Coastguard Worker   static_assert(kArray[2] == span[2], "span[2] does not equal kArray[2]");
877*635a8641SAndroid Build Coastguard Worker   static_assert(kArray[3] == span[3], "span[3] does not equal kArray[3]");
878*635a8641SAndroid Build Coastguard Worker   static_assert(kArray[4] == span[4], "span[4] does not equal kArray[4]");
879*635a8641SAndroid Build Coastguard Worker 
880*635a8641SAndroid Build Coastguard Worker   static_assert(kArray[0] == span(0), "span(0) does not equal kArray[0]");
881*635a8641SAndroid Build Coastguard Worker   static_assert(kArray[1] == span(1), "span(1) does not equal kArray[1]");
882*635a8641SAndroid Build Coastguard Worker   static_assert(kArray[2] == span(2), "span(2) does not equal kArray[2]");
883*635a8641SAndroid Build Coastguard Worker   static_assert(kArray[3] == span(3), "span(3) does not equal kArray[3]");
884*635a8641SAndroid Build Coastguard Worker   static_assert(kArray[4] == span(4), "span(4) does not equal kArray[4]");
885*635a8641SAndroid Build Coastguard Worker }
886*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,Iterator)887*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, Iterator) {
888*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 6, 1, 8, 0};
889*635a8641SAndroid Build Coastguard Worker   constexpr span<const int> span(kArray);
890*635a8641SAndroid Build Coastguard Worker 
891*635a8641SAndroid Build Coastguard Worker   std::vector<int> results;
892*635a8641SAndroid Build Coastguard Worker   for (int i : span)
893*635a8641SAndroid Build Coastguard Worker     results.emplace_back(i);
894*635a8641SAndroid Build Coastguard Worker   EXPECT_THAT(results, ElementsAre(1, 6, 1, 8, 0));
895*635a8641SAndroid Build Coastguard Worker }
896*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,ReverseIterator)897*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, ReverseIterator) {
898*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 6, 1, 8, 0};
899*635a8641SAndroid Build Coastguard Worker   constexpr span<const int> span(kArray);
900*635a8641SAndroid Build Coastguard Worker 
901*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(std::equal(std::rbegin(kArray), std::rend(kArray), span.rbegin(),
902*635a8641SAndroid Build Coastguard Worker                          span.rend()));
903*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(std::equal(std::crbegin(kArray), std::crend(kArray),
904*635a8641SAndroid Build Coastguard Worker                          span.crbegin(), span.crend()));
905*635a8641SAndroid Build Coastguard Worker }
906*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,Equality)907*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, Equality) {
908*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray1[] = {3, 1, 4, 1, 5};
909*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray2[] = {3, 1, 4, 1, 5};
910*635a8641SAndroid Build Coastguard Worker   constexpr span<const int> span1(kArray1);
911*635a8641SAndroid Build Coastguard Worker   constexpr span<const int, 5> span2(kArray2);
912*635a8641SAndroid Build Coastguard Worker 
913*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(span1, span2);
914*635a8641SAndroid Build Coastguard Worker 
915*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray3[] = {2, 7, 1, 8, 3};
916*635a8641SAndroid Build Coastguard Worker   constexpr span<const int> span3(kArray3);
917*635a8641SAndroid Build Coastguard Worker 
918*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(span1 == span3);
919*635a8641SAndroid Build Coastguard Worker 
920*635a8641SAndroid Build Coastguard Worker   static double kArray4[] = {2.0, 7.0, 1.0, 8.0, 3.0};
921*635a8641SAndroid Build Coastguard Worker   span<double, 5> span4(kArray4);
922*635a8641SAndroid Build Coastguard Worker 
923*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(span3, span4);
924*635a8641SAndroid Build Coastguard Worker }
925*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,Inequality)926*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, Inequality) {
927*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray1[] = {2, 3, 5, 7, 11};
928*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray2[] = {1, 4, 6, 8, 9};
929*635a8641SAndroid Build Coastguard Worker   constexpr span<const int> span1(kArray1);
930*635a8641SAndroid Build Coastguard Worker   constexpr span<const int, 5> span2(kArray2);
931*635a8641SAndroid Build Coastguard Worker 
932*635a8641SAndroid Build Coastguard Worker   EXPECT_NE(span1, span2);
933*635a8641SAndroid Build Coastguard Worker 
934*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray3[] = {2, 3, 5, 7, 11};
935*635a8641SAndroid Build Coastguard Worker   constexpr span<const int> span3(kArray3);
936*635a8641SAndroid Build Coastguard Worker 
937*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(span1 != span3);
938*635a8641SAndroid Build Coastguard Worker 
939*635a8641SAndroid Build Coastguard Worker   static double kArray4[] = {1.0, 4.0, 6.0, 8.0, 9.0};
940*635a8641SAndroid Build Coastguard Worker   span<double, 5> span4(kArray4);
941*635a8641SAndroid Build Coastguard Worker 
942*635a8641SAndroid Build Coastguard Worker   EXPECT_NE(span3, span4);
943*635a8641SAndroid Build Coastguard Worker }
944*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,LessThan)945*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, LessThan) {
946*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray1[] = {2, 3, 5, 7, 11};
947*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray2[] = {2, 3, 5, 7, 11, 13};
948*635a8641SAndroid Build Coastguard Worker   constexpr span<const int> span1(kArray1);
949*635a8641SAndroid Build Coastguard Worker   constexpr span<const int, 6> span2(kArray2);
950*635a8641SAndroid Build Coastguard Worker 
951*635a8641SAndroid Build Coastguard Worker   EXPECT_LT(span1, span2);
952*635a8641SAndroid Build Coastguard Worker 
953*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray3[] = {2, 3, 5, 7, 11};
954*635a8641SAndroid Build Coastguard Worker   constexpr span<const int> span3(kArray3);
955*635a8641SAndroid Build Coastguard Worker 
956*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(span1 < span3);
957*635a8641SAndroid Build Coastguard Worker 
958*635a8641SAndroid Build Coastguard Worker   static double kArray4[] = {2.0, 3.0, 5.0, 7.0, 11.0, 13.0};
959*635a8641SAndroid Build Coastguard Worker   span<double, 6> span4(kArray4);
960*635a8641SAndroid Build Coastguard Worker 
961*635a8641SAndroid Build Coastguard Worker   EXPECT_LT(span3, span4);
962*635a8641SAndroid Build Coastguard Worker }
963*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,LessEqual)964*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, LessEqual) {
965*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray1[] = {2, 3, 5, 7, 11};
966*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray2[] = {2, 3, 5, 7, 11, 13};
967*635a8641SAndroid Build Coastguard Worker   constexpr span<const int> span1(kArray1);
968*635a8641SAndroid Build Coastguard Worker   constexpr span<const int, 6> span2(kArray2);
969*635a8641SAndroid Build Coastguard Worker 
970*635a8641SAndroid Build Coastguard Worker   EXPECT_LE(span1, span1);
971*635a8641SAndroid Build Coastguard Worker   EXPECT_LE(span1, span2);
972*635a8641SAndroid Build Coastguard Worker 
973*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray3[] = {2, 3, 5, 7, 10};
974*635a8641SAndroid Build Coastguard Worker   constexpr span<const int> span3(kArray3);
975*635a8641SAndroid Build Coastguard Worker 
976*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(span1 <= span3);
977*635a8641SAndroid Build Coastguard Worker 
978*635a8641SAndroid Build Coastguard Worker   static double kArray4[] = {2.0, 3.0, 5.0, 7.0, 11.0, 13.0};
979*635a8641SAndroid Build Coastguard Worker   span<double, 6> span4(kArray4);
980*635a8641SAndroid Build Coastguard Worker 
981*635a8641SAndroid Build Coastguard Worker   EXPECT_LE(span3, span4);
982*635a8641SAndroid Build Coastguard Worker }
983*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,GreaterThan)984*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, GreaterThan) {
985*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray1[] = {2, 3, 5, 7, 11, 13};
986*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray2[] = {2, 3, 5, 7, 11};
987*635a8641SAndroid Build Coastguard Worker   constexpr span<const int> span1(kArray1);
988*635a8641SAndroid Build Coastguard Worker   constexpr span<const int, 5> span2(kArray2);
989*635a8641SAndroid Build Coastguard Worker 
990*635a8641SAndroid Build Coastguard Worker   EXPECT_GT(span1, span2);
991*635a8641SAndroid Build Coastguard Worker 
992*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray3[] = {2, 3, 5, 7, 11, 13};
993*635a8641SAndroid Build Coastguard Worker   constexpr span<const int> span3(kArray3);
994*635a8641SAndroid Build Coastguard Worker 
995*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(span1 > span3);
996*635a8641SAndroid Build Coastguard Worker 
997*635a8641SAndroid Build Coastguard Worker   static double kArray4[] = {2.0, 3.0, 5.0, 7.0, 11.0};
998*635a8641SAndroid Build Coastguard Worker   span<double, 5> span4(kArray4);
999*635a8641SAndroid Build Coastguard Worker 
1000*635a8641SAndroid Build Coastguard Worker   EXPECT_GT(span3, span4);
1001*635a8641SAndroid Build Coastguard Worker }
1002*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,GreaterEqual)1003*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, GreaterEqual) {
1004*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray1[] = {2, 3, 5, 7, 11, 13};
1005*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray2[] = {2, 3, 5, 7, 11};
1006*635a8641SAndroid Build Coastguard Worker   constexpr span<const int> span1(kArray1);
1007*635a8641SAndroid Build Coastguard Worker   constexpr span<const int, 5> span2(kArray2);
1008*635a8641SAndroid Build Coastguard Worker 
1009*635a8641SAndroid Build Coastguard Worker   EXPECT_GE(span1, span1);
1010*635a8641SAndroid Build Coastguard Worker   EXPECT_GE(span1, span2);
1011*635a8641SAndroid Build Coastguard Worker 
1012*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray3[] = {2, 3, 5, 7, 12};
1013*635a8641SAndroid Build Coastguard Worker   constexpr span<const int> span3(kArray3);
1014*635a8641SAndroid Build Coastguard Worker 
1015*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(span1 >= span3);
1016*635a8641SAndroid Build Coastguard Worker 
1017*635a8641SAndroid Build Coastguard Worker   static double kArray4[] = {2.0, 3.0, 5.0, 7.0, 11.0};
1018*635a8641SAndroid Build Coastguard Worker   span<double, 5> span4(kArray4);
1019*635a8641SAndroid Build Coastguard Worker 
1020*635a8641SAndroid Build Coastguard Worker   EXPECT_GE(span3, span4);
1021*635a8641SAndroid Build Coastguard Worker }
1022*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,AsBytes)1023*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, AsBytes) {
1024*635a8641SAndroid Build Coastguard Worker   {
1025*635a8641SAndroid Build Coastguard Worker     constexpr int kArray[] = {2, 3, 5, 7, 11, 13};
1026*635a8641SAndroid Build Coastguard Worker     span<const uint8_t, sizeof(kArray)> bytes_span =
1027*635a8641SAndroid Build Coastguard Worker         as_bytes(make_span(kArray));
1028*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(reinterpret_cast<const uint8_t*>(kArray), bytes_span.data());
1029*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(sizeof(kArray), bytes_span.size());
1030*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(bytes_span.size(), bytes_span.size_bytes());
1031*635a8641SAndroid Build Coastguard Worker   }
1032*635a8641SAndroid Build Coastguard Worker 
1033*635a8641SAndroid Build Coastguard Worker   {
1034*635a8641SAndroid Build Coastguard Worker     std::vector<int> vec = {1, 1, 2, 3, 5, 8};
1035*635a8641SAndroid Build Coastguard Worker     span<int> mutable_span(vec);
1036*635a8641SAndroid Build Coastguard Worker     span<const uint8_t> bytes_span = as_bytes(mutable_span);
1037*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(reinterpret_cast<const uint8_t*>(vec.data()), bytes_span.data());
1038*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(sizeof(int) * vec.size(), bytes_span.size());
1039*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(bytes_span.size(), bytes_span.size_bytes());
1040*635a8641SAndroid Build Coastguard Worker   }
1041*635a8641SAndroid Build Coastguard Worker }
1042*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,AsWritableBytes)1043*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, AsWritableBytes) {
1044*635a8641SAndroid Build Coastguard Worker   std::vector<int> vec = {1, 1, 2, 3, 5, 8};
1045*635a8641SAndroid Build Coastguard Worker   span<int> mutable_span(vec);
1046*635a8641SAndroid Build Coastguard Worker   span<uint8_t> writable_bytes_span = as_writable_bytes(mutable_span);
1047*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(reinterpret_cast<uint8_t*>(vec.data()), writable_bytes_span.data());
1048*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(sizeof(int) * vec.size(), writable_bytes_span.size());
1049*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(writable_bytes_span.size(), writable_bytes_span.size_bytes());
1050*635a8641SAndroid Build Coastguard Worker 
1051*635a8641SAndroid Build Coastguard Worker   // Set the first entry of vec to zero while writing through the span.
1052*635a8641SAndroid Build Coastguard Worker   std::fill(writable_bytes_span.data(),
1053*635a8641SAndroid Build Coastguard Worker             writable_bytes_span.data() + sizeof(int), 0);
1054*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, vec[0]);
1055*635a8641SAndroid Build Coastguard Worker }
1056*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,MakeSpanFromDataAndSize)1057*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromDataAndSize) {
1058*635a8641SAndroid Build Coastguard Worker   int* nullint = nullptr;
1059*635a8641SAndroid Build Coastguard Worker   auto empty_span = make_span(nullint, 0);
1060*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(empty_span.empty());
1061*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, empty_span.data());
1062*635a8641SAndroid Build Coastguard Worker 
1063*635a8641SAndroid Build Coastguard Worker   std::vector<int> vector = {1, 1, 2, 3, 5, 8};
1064*635a8641SAndroid Build Coastguard Worker   span<int> span(vector.data(), vector.size());
1065*635a8641SAndroid Build Coastguard Worker   auto made_span = make_span(vector.data(), vector.size());
1066*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(span, made_span);
1067*635a8641SAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == dynamic_extent, "");
1068*635a8641SAndroid Build Coastguard Worker }
1069*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,MakeSpanFromPointerPair)1070*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromPointerPair) {
1071*635a8641SAndroid Build Coastguard Worker   int* nullint = nullptr;
1072*635a8641SAndroid Build Coastguard Worker   auto empty_span = make_span(nullint, nullint);
1073*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(empty_span.empty());
1074*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, empty_span.data());
1075*635a8641SAndroid Build Coastguard Worker 
1076*635a8641SAndroid Build Coastguard Worker   std::vector<int> vector = {1, 1, 2, 3, 5, 8};
1077*635a8641SAndroid Build Coastguard Worker   span<int> span(vector.data(), vector.size());
1078*635a8641SAndroid Build Coastguard Worker   auto made_span = make_span(vector.data(), vector.data() + vector.size());
1079*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(span, made_span);
1080*635a8641SAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == dynamic_extent, "");
1081*635a8641SAndroid Build Coastguard Worker }
1082*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,MakeSpanFromConstexprArray)1083*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromConstexprArray) {
1084*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 2, 3, 4, 5};
1085*635a8641SAndroid Build Coastguard Worker   constexpr span<const int> span(kArray);
1086*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(span, make_span(kArray));
1087*635a8641SAndroid Build Coastguard Worker   static_assert(decltype(make_span(kArray))::extent == 5, "");
1088*635a8641SAndroid Build Coastguard Worker }
1089*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,MakeSpanFromStdArray)1090*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromStdArray) {
1091*635a8641SAndroid Build Coastguard Worker   const std::array<int, 5> kArray = {{1, 2, 3, 4, 5}};
1092*635a8641SAndroid Build Coastguard Worker   span<const int> span(kArray);
1093*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(span, make_span(kArray));
1094*635a8641SAndroid Build Coastguard Worker   static_assert(decltype(make_span(kArray))::extent == 5, "");
1095*635a8641SAndroid Build Coastguard Worker }
1096*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,MakeSpanFromConstContainer)1097*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromConstContainer) {
1098*635a8641SAndroid Build Coastguard Worker   const std::vector<int> vector = {-1, -2, -3, -4, -5};
1099*635a8641SAndroid Build Coastguard Worker   span<const int> span(vector);
1100*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(span, make_span(vector));
1101*635a8641SAndroid Build Coastguard Worker   static_assert(decltype(make_span(vector))::extent == dynamic_extent, "");
1102*635a8641SAndroid Build Coastguard Worker }
1103*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,MakeSpanFromContainer)1104*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromContainer) {
1105*635a8641SAndroid Build Coastguard Worker   std::vector<int> vector = {-1, -2, -3, -4, -5};
1106*635a8641SAndroid Build Coastguard Worker   span<int> span(vector);
1107*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(span, make_span(vector));
1108*635a8641SAndroid Build Coastguard Worker   static_assert(decltype(make_span(vector))::extent == dynamic_extent, "");
1109*635a8641SAndroid Build Coastguard Worker }
1110*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,MakeSpanFromDynamicSpan)1111*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromDynamicSpan) {
1112*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 2, 3, 4, 5};
1113*635a8641SAndroid Build Coastguard Worker   constexpr span<const int> span(kArray);
1114*635a8641SAndroid Build Coastguard Worker   static_assert(std::is_same<decltype(span)::element_type,
1115*635a8641SAndroid Build Coastguard Worker                              decltype(make_span(span))::element_type>::value,
1116*635a8641SAndroid Build Coastguard Worker                 "make_span(span) should have the same element_type as span");
1117*635a8641SAndroid Build Coastguard Worker 
1118*635a8641SAndroid Build Coastguard Worker   static_assert(span.data() == make_span(span).data(),
1119*635a8641SAndroid Build Coastguard Worker                 "make_span(span) should have the same data() as span");
1120*635a8641SAndroid Build Coastguard Worker 
1121*635a8641SAndroid Build Coastguard Worker   static_assert(span.size() == make_span(span).size(),
1122*635a8641SAndroid Build Coastguard Worker                 "make_span(span) should have the same size() as span");
1123*635a8641SAndroid Build Coastguard Worker 
1124*635a8641SAndroid Build Coastguard Worker   static_assert(decltype(make_span(span))::extent == decltype(span)::extent,
1125*635a8641SAndroid Build Coastguard Worker                 "make_span(span) should have the same extent as span");
1126*635a8641SAndroid Build Coastguard Worker }
1127*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,MakeSpanFromStaticSpan)1128*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromStaticSpan) {
1129*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 2, 3, 4, 5};
1130*635a8641SAndroid Build Coastguard Worker   constexpr span<const int, 5> span(kArray);
1131*635a8641SAndroid Build Coastguard Worker   static_assert(std::is_same<decltype(span)::element_type,
1132*635a8641SAndroid Build Coastguard Worker                              decltype(make_span(span))::element_type>::value,
1133*635a8641SAndroid Build Coastguard Worker                 "make_span(span) should have the same element_type as span");
1134*635a8641SAndroid Build Coastguard Worker 
1135*635a8641SAndroid Build Coastguard Worker   static_assert(span.data() == make_span(span).data(),
1136*635a8641SAndroid Build Coastguard Worker                 "make_span(span) should have the same data() as span");
1137*635a8641SAndroid Build Coastguard Worker 
1138*635a8641SAndroid Build Coastguard Worker   static_assert(span.size() == make_span(span).size(),
1139*635a8641SAndroid Build Coastguard Worker                 "make_span(span) should have the same size() as span");
1140*635a8641SAndroid Build Coastguard Worker 
1141*635a8641SAndroid Build Coastguard Worker   static_assert(decltype(make_span(span))::extent == decltype(span)::extent,
1142*635a8641SAndroid Build Coastguard Worker                 "make_span(span) should have the same extent as span");
1143*635a8641SAndroid Build Coastguard Worker }
1144*635a8641SAndroid Build Coastguard Worker 
TEST(SpanTest,EnsureConstexprGoodness)1145*635a8641SAndroid Build Coastguard Worker TEST(SpanTest, EnsureConstexprGoodness) {
1146*635a8641SAndroid Build Coastguard Worker   static constexpr int kArray[] = {5, 4, 3, 2, 1};
1147*635a8641SAndroid Build Coastguard Worker   constexpr span<const int> constexpr_span(kArray);
1148*635a8641SAndroid Build Coastguard Worker   const size_t size = 2;
1149*635a8641SAndroid Build Coastguard Worker 
1150*635a8641SAndroid Build Coastguard Worker   const size_t start = 1;
1151*635a8641SAndroid Build Coastguard Worker   constexpr span<const int> subspan =
1152*635a8641SAndroid Build Coastguard Worker       constexpr_span.subspan(start, start + size);
1153*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < subspan.size(); ++i)
1154*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(kArray[start + i], subspan[i]);
1155*635a8641SAndroid Build Coastguard Worker 
1156*635a8641SAndroid Build Coastguard Worker   constexpr span<const int> firsts = constexpr_span.first(size);
1157*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < firsts.size(); ++i)
1158*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(kArray[i], firsts[i]);
1159*635a8641SAndroid Build Coastguard Worker 
1160*635a8641SAndroid Build Coastguard Worker   constexpr span<const int> lasts = constexpr_span.last(size);
1161*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < lasts.size(); ++i) {
1162*635a8641SAndroid Build Coastguard Worker     const size_t j = (arraysize(kArray) - size) + i;
1163*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(kArray[j], lasts[i]);
1164*635a8641SAndroid Build Coastguard Worker   }
1165*635a8641SAndroid Build Coastguard Worker 
1166*635a8641SAndroid Build Coastguard Worker   constexpr int item = constexpr_span[size];
1167*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(kArray[size], item);
1168*635a8641SAndroid Build Coastguard Worker }
1169*635a8641SAndroid Build Coastguard Worker 
1170*635a8641SAndroid Build Coastguard Worker }  // namespace base
1171