xref: /aosp_15_r20/external/cronet/base/containers/span_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include <algorithm>
10*6777b538SAndroid Build Coastguard Worker #include <concepts>
11*6777b538SAndroid Build Coastguard Worker #include <iterator>
12*6777b538SAndroid Build Coastguard Worker #include <memory>
13*6777b538SAndroid Build Coastguard Worker #include <span>
14*6777b538SAndroid Build Coastguard Worker #include <string>
15*6777b538SAndroid Build Coastguard Worker #include <string_view>
16*6777b538SAndroid Build Coastguard Worker #include <type_traits>
17*6777b538SAndroid Build Coastguard Worker #include <utility>
18*6777b538SAndroid Build Coastguard Worker #include <vector>
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker #include "base/containers/adapters.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/containers/checked_iterators.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/ranges/algorithm.h"
23*6777b538SAndroid Build Coastguard Worker #include "base/test/gtest_util.h"
24*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
25*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
26*6777b538SAndroid Build Coastguard Worker 
27*6777b538SAndroid Build Coastguard Worker using ::testing::ElementsAre;
28*6777b538SAndroid Build Coastguard Worker using ::testing::Eq;
29*6777b538SAndroid Build Coastguard Worker using ::testing::Pointwise;
30*6777b538SAndroid Build Coastguard Worker 
31*6777b538SAndroid Build Coastguard Worker namespace base {
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker namespace {
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker // Tests for span(It, StrictNumeric<size_t>) deduction guide. These tests use a
36*6777b538SAndroid Build Coastguard Worker // helper function to wrap the static_asserts, as most STL containers don't work
37*6777b538SAndroid Build Coastguard Worker // well in a constexpr context. std::array<T, N> does, but base::span has
38*6777b538SAndroid Build Coastguard Worker // specific overloads for std::array<T, n>, so that ends up being less helpful
39*6777b538SAndroid Build Coastguard Worker // than it would initially appear.
40*6777b538SAndroid Build Coastguard Worker //
41*6777b538SAndroid Build Coastguard Worker // Another alternative would be to use std::declval, but that would be fairly
42*6777b538SAndroid Build Coastguard Worker // verbose.
TestDeductionGuides()43*6777b538SAndroid Build Coastguard Worker [[maybe_unused]] void TestDeductionGuides() {
44*6777b538SAndroid Build Coastguard Worker   // Tests for span(It, EndOrSize) deduction guide.
45*6777b538SAndroid Build Coastguard Worker   {
46*6777b538SAndroid Build Coastguard Worker     const std::vector<int> v;
47*6777b538SAndroid Build Coastguard Worker     static_assert(
48*6777b538SAndroid Build Coastguard Worker         std::is_same_v<decltype(span(v.cbegin(), v.size())), span<const int>>);
49*6777b538SAndroid Build Coastguard Worker     static_assert(
50*6777b538SAndroid Build Coastguard Worker         std::is_same_v<decltype(span(v.begin(), v.size())), span<const int>>);
51*6777b538SAndroid Build Coastguard Worker     static_assert(
52*6777b538SAndroid Build Coastguard Worker         std::is_same_v<decltype(span(v.data(), v.size())), span<const int>>);
53*6777b538SAndroid Build Coastguard Worker   }
54*6777b538SAndroid Build Coastguard Worker 
55*6777b538SAndroid Build Coastguard Worker   {
56*6777b538SAndroid Build Coastguard Worker     std::vector<int> v;
57*6777b538SAndroid Build Coastguard Worker     static_assert(
58*6777b538SAndroid Build Coastguard Worker         std::is_same_v<decltype(span(v.cbegin(), v.size())), span<const int>>);
59*6777b538SAndroid Build Coastguard Worker     static_assert(
60*6777b538SAndroid Build Coastguard Worker         std::is_same_v<decltype(span(v.begin(), v.size())), span<int>>);
61*6777b538SAndroid Build Coastguard Worker     static_assert(
62*6777b538SAndroid Build Coastguard Worker         std::is_same_v<decltype(span(v.data(), v.size())), span<int>>);
63*6777b538SAndroid Build Coastguard Worker   }
64*6777b538SAndroid Build Coastguard Worker 
65*6777b538SAndroid Build Coastguard Worker   {
66*6777b538SAndroid Build Coastguard Worker     const std::vector<int> v;
67*6777b538SAndroid Build Coastguard Worker     static_assert(
68*6777b538SAndroid Build Coastguard Worker         std::is_same_v<decltype(span(v.cbegin(), v.cend())), span<const int>>);
69*6777b538SAndroid Build Coastguard Worker     static_assert(
70*6777b538SAndroid Build Coastguard Worker         std::is_same_v<decltype(span(v.begin(), v.end())), span<const int>>);
71*6777b538SAndroid Build Coastguard Worker   }
72*6777b538SAndroid Build Coastguard Worker 
73*6777b538SAndroid Build Coastguard Worker   {
74*6777b538SAndroid Build Coastguard Worker     std::vector<int> v;
75*6777b538SAndroid Build Coastguard Worker     static_assert(
76*6777b538SAndroid Build Coastguard Worker         std::is_same_v<decltype(span(v.cbegin(), v.cend())), span<const int>>);
77*6777b538SAndroid Build Coastguard Worker     static_assert(
78*6777b538SAndroid Build Coastguard Worker         std::is_same_v<decltype(span(v.begin(), v.end())), span<int>>);
79*6777b538SAndroid Build Coastguard Worker   }
80*6777b538SAndroid Build Coastguard Worker 
81*6777b538SAndroid Build Coastguard Worker   // Tests for span(Range&&) deduction guide.
82*6777b538SAndroid Build Coastguard Worker   {
83*6777b538SAndroid Build Coastguard Worker     const int kArray[] = {1, 2, 3};
84*6777b538SAndroid Build Coastguard Worker     static_assert(std::is_same_v<decltype(span(kArray)), span<const int, 3>>);
85*6777b538SAndroid Build Coastguard Worker   }
86*6777b538SAndroid Build Coastguard Worker   {
87*6777b538SAndroid Build Coastguard Worker     int kArray[] = {1, 2, 3};
88*6777b538SAndroid Build Coastguard Worker     static_assert(std::is_same_v<decltype(span(kArray)), span<int, 3>>);
89*6777b538SAndroid Build Coastguard Worker   }
90*6777b538SAndroid Build Coastguard Worker   // We also deduce an rvalue array to make a fixed-span over const values,
91*6777b538SAndroid Build Coastguard Worker   // which matches the span<const T> constructor from an array.
92*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(span({1, 2, 3})), span<const int, 3>>);
93*6777b538SAndroid Build Coastguard Worker 
94*6777b538SAndroid Build Coastguard Worker   static_assert(
95*6777b538SAndroid Build Coastguard Worker       std::is_same_v<decltype(span(std::declval<std::array<const bool, 3>&>())),
96*6777b538SAndroid Build Coastguard Worker                      span<const bool, 3>>);
97*6777b538SAndroid Build Coastguard Worker   static_assert(
98*6777b538SAndroid Build Coastguard Worker       std::is_same_v<decltype(span(std::declval<std::array<bool, 3>&>())),
99*6777b538SAndroid Build Coastguard Worker                      span<bool, 3>>);
100*6777b538SAndroid Build Coastguard Worker 
101*6777b538SAndroid Build Coastguard Worker   static_assert(
102*6777b538SAndroid Build Coastguard Worker       std::is_same_v<decltype(span(
103*6777b538SAndroid Build Coastguard Worker                          std::declval<const std::array<const bool, 3>&>())),
104*6777b538SAndroid Build Coastguard Worker                      span<const bool, 3>>);
105*6777b538SAndroid Build Coastguard Worker   static_assert(
106*6777b538SAndroid Build Coastguard Worker       std::is_same_v<decltype(span(
107*6777b538SAndroid Build Coastguard Worker                          std::declval<const std::array<const bool, 3>&&>())),
108*6777b538SAndroid Build Coastguard Worker                      span<const bool, 3>>);
109*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<
110*6777b538SAndroid Build Coastguard Worker                 decltype(span(std::declval<std::array<const bool, 3>&&>())),
111*6777b538SAndroid Build Coastguard Worker                 span<const bool, 3>>);
112*6777b538SAndroid Build Coastguard Worker   static_assert(
113*6777b538SAndroid Build Coastguard Worker       std::is_same_v<decltype(span(std::declval<const std::array<bool, 3>&>())),
114*6777b538SAndroid Build Coastguard Worker                      span<const bool, 3>>);
115*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<
116*6777b538SAndroid Build Coastguard Worker                 decltype(span(std::declval<const std::array<bool, 3>&&>())),
117*6777b538SAndroid Build Coastguard Worker                 span<const bool, 3>>);
118*6777b538SAndroid Build Coastguard Worker   static_assert(
119*6777b538SAndroid Build Coastguard Worker       std::is_same_v<decltype(span(std::declval<std::array<bool, 3>&&>())),
120*6777b538SAndroid Build Coastguard Worker                      span<const bool, 3>>);
121*6777b538SAndroid Build Coastguard Worker 
122*6777b538SAndroid Build Coastguard Worker   static_assert(
123*6777b538SAndroid Build Coastguard Worker       std::is_same_v<decltype(span(std::declval<const std::string&>())),
124*6777b538SAndroid Build Coastguard Worker                      span<const char>>);
125*6777b538SAndroid Build Coastguard Worker   static_assert(
126*6777b538SAndroid Build Coastguard Worker       std::is_same_v<decltype(span(std::declval<const std::string&&>())),
127*6777b538SAndroid Build Coastguard Worker                      span<const char>>);
128*6777b538SAndroid Build Coastguard Worker   static_assert(
129*6777b538SAndroid Build Coastguard Worker       std::is_same_v<decltype(span(std::declval<std::string&>())), span<char>>);
130*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(span(std::declval<std::string&&>())),
131*6777b538SAndroid Build Coastguard Worker                                span<const char>>);
132*6777b538SAndroid Build Coastguard Worker   static_assert(
133*6777b538SAndroid Build Coastguard Worker       std::is_same_v<decltype(span(std::declval<const std::u16string&>())),
134*6777b538SAndroid Build Coastguard Worker                      span<const char16_t>>);
135*6777b538SAndroid Build Coastguard Worker   static_assert(
136*6777b538SAndroid Build Coastguard Worker       std::is_same_v<decltype(span(std::declval<const std::u16string&&>())),
137*6777b538SAndroid Build Coastguard Worker                      span<const char16_t>>);
138*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(span(std::declval<std::u16string&>())),
139*6777b538SAndroid Build Coastguard Worker                                span<char16_t>>);
140*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(span(std::declval<std::u16string&&>())),
141*6777b538SAndroid Build Coastguard Worker                                span<const char16_t>>);
142*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<
143*6777b538SAndroid Build Coastguard Worker                 decltype(span(std::declval<const std::array<float, 9>&>())),
144*6777b538SAndroid Build Coastguard Worker                 span<const float, 9>>);
145*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<
146*6777b538SAndroid Build Coastguard Worker                 decltype(span(std::declval<const std::array<float, 9>&&>())),
147*6777b538SAndroid Build Coastguard Worker                 span<const float, 9>>);
148*6777b538SAndroid Build Coastguard Worker   static_assert(
149*6777b538SAndroid Build Coastguard Worker       std::is_same_v<decltype(span(std::declval<std::array<float, 9>&>())),
150*6777b538SAndroid Build Coastguard Worker                      span<float, 9>>);
151*6777b538SAndroid Build Coastguard Worker   static_assert(
152*6777b538SAndroid Build Coastguard Worker       std::is_same_v<decltype(span(std::declval<std::array<float, 9>&&>())),
153*6777b538SAndroid Build Coastguard Worker                      span<const float, 9>>);
154*6777b538SAndroid Build Coastguard Worker }
155*6777b538SAndroid Build Coastguard Worker 
156*6777b538SAndroid Build Coastguard Worker }  // namespace
157*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,DefaultConstructor)158*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, DefaultConstructor) {
159*6777b538SAndroid Build Coastguard Worker   span<int> dynamic_span;
160*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dynamic_span.data());
161*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0u, dynamic_span.size());
162*6777b538SAndroid Build Coastguard Worker 
163*6777b538SAndroid Build Coastguard Worker   constexpr span<int, 0> static_span;
164*6777b538SAndroid Build Coastguard Worker   static_assert(nullptr == static_span.data(), "");
165*6777b538SAndroid Build Coastguard Worker   static_assert(0u == static_span.size(), "");
166*6777b538SAndroid Build Coastguard Worker }
167*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromDataAndSize)168*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromDataAndSize) {
169*6777b538SAndroid Build Coastguard Worker   constexpr int* kNull = nullptr;
170*6777b538SAndroid Build Coastguard Worker   constexpr span<int> empty_span(kNull, 0u);
171*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(empty_span.empty());
172*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, empty_span.data());
173*6777b538SAndroid Build Coastguard Worker 
174*6777b538SAndroid Build Coastguard Worker   std::vector<int> vector = {1, 1, 2, 3, 5, 8};
175*6777b538SAndroid Build Coastguard Worker 
176*6777b538SAndroid Build Coastguard Worker   span<int> dynamic_span(vector.data(), vector.size());
177*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), dynamic_span.data());
178*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), dynamic_span.size());
179*6777b538SAndroid Build Coastguard Worker 
180*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < dynamic_span.size(); ++i) {
181*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], dynamic_span[i]);
182*6777b538SAndroid Build Coastguard Worker   }
183*6777b538SAndroid Build Coastguard Worker 
184*6777b538SAndroid Build Coastguard Worker   span<int, 6> static_span(vector.data(), vector.size());
185*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), static_span.data());
186*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), static_span.size());
187*6777b538SAndroid Build Coastguard Worker 
188*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i) {
189*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], static_span[i]);
190*6777b538SAndroid Build Coastguard Worker   }
191*6777b538SAndroid Build Coastguard Worker }
192*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromIterAndSize)193*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromIterAndSize) {
194*6777b538SAndroid Build Coastguard Worker   constexpr int* kNull = nullptr;
195*6777b538SAndroid Build Coastguard Worker   constexpr span<int> empty_span(kNull, 0u);
196*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(empty_span.empty());
197*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, empty_span.data());
198*6777b538SAndroid Build Coastguard Worker 
199*6777b538SAndroid Build Coastguard Worker   std::vector<int> vector = {1, 1, 2, 3, 5, 8};
200*6777b538SAndroid Build Coastguard Worker 
201*6777b538SAndroid Build Coastguard Worker   span<int> dynamic_span(vector.begin(), vector.size());
202*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), dynamic_span.data());
203*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), dynamic_span.size());
204*6777b538SAndroid Build Coastguard Worker 
205*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < dynamic_span.size(); ++i) {
206*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], dynamic_span[i]);
207*6777b538SAndroid Build Coastguard Worker   }
208*6777b538SAndroid Build Coastguard Worker 
209*6777b538SAndroid Build Coastguard Worker   span<int, 6> static_span(vector.begin(), vector.size());
210*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), static_span.data());
211*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), static_span.size());
212*6777b538SAndroid Build Coastguard Worker 
213*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i) {
214*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], static_span[i]);
215*6777b538SAndroid Build Coastguard Worker   }
216*6777b538SAndroid Build Coastguard Worker }
217*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromIterPair)218*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromIterPair) {
219*6777b538SAndroid Build Coastguard Worker   constexpr int* kNull = nullptr;
220*6777b538SAndroid Build Coastguard Worker   constexpr span<int> empty_span(kNull, kNull);
221*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(empty_span.empty());
222*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, empty_span.data());
223*6777b538SAndroid Build Coastguard Worker 
224*6777b538SAndroid Build Coastguard Worker   std::vector<int> vector = {1, 1, 2, 3, 5, 8};
225*6777b538SAndroid Build Coastguard Worker 
226*6777b538SAndroid Build Coastguard Worker   span<int> dynamic_span(vector.begin(), vector.begin() + vector.size() / 2);
227*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), dynamic_span.data());
228*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(vector.size() / 2, dynamic_span.size());
229*6777b538SAndroid Build Coastguard Worker 
230*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < dynamic_span.size(); ++i) {
231*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], dynamic_span[i]);
232*6777b538SAndroid Build Coastguard Worker   }
233*6777b538SAndroid Build Coastguard Worker 
234*6777b538SAndroid Build Coastguard Worker   span<int, 3> static_span(vector.begin(), vector.begin() + vector.size() / 2);
235*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), static_span.data());
236*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(vector.size() / 2, static_span.size());
237*6777b538SAndroid Build Coastguard Worker 
238*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i) {
239*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], static_span[i]);
240*6777b538SAndroid Build Coastguard Worker   }
241*6777b538SAndroid Build Coastguard Worker }
242*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,AllowedConversionsFromStdArray)243*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, AllowedConversionsFromStdArray) {
244*6777b538SAndroid Build Coastguard Worker   // In the following assertions we use std::is_convertible_v<From, To>, which
245*6777b538SAndroid Build Coastguard Worker   // for non-void types is equivalent to checking whether the following
246*6777b538SAndroid Build Coastguard Worker   // expression is well-formed:
247*6777b538SAndroid Build Coastguard Worker   //
248*6777b538SAndroid Build Coastguard Worker   // T obj = std::declval<From>();
249*6777b538SAndroid Build Coastguard Worker   //
250*6777b538SAndroid Build Coastguard Worker   // In particular we are checking whether From is implicitly convertible to To,
251*6777b538SAndroid Build Coastguard Worker   // which also implies that To is explicitly constructible from From.
252*6777b538SAndroid Build Coastguard Worker   static_assert(
253*6777b538SAndroid Build Coastguard Worker       std::is_convertible_v<std::array<int, 3>&, base::span<int>>,
254*6777b538SAndroid Build Coastguard Worker       "Error: l-value reference to std::array<int> should be convertible to "
255*6777b538SAndroid Build Coastguard Worker       "base::span<int> with dynamic extent.");
256*6777b538SAndroid Build Coastguard Worker   static_assert(
257*6777b538SAndroid Build Coastguard Worker       std::is_convertible_v<std::array<int, 3>&, base::span<int, 3>>,
258*6777b538SAndroid Build Coastguard Worker       "Error: l-value reference to std::array<int> should be convertible to "
259*6777b538SAndroid Build Coastguard Worker       "base::span<int> with the same static extent.");
260*6777b538SAndroid Build Coastguard Worker   static_assert(
261*6777b538SAndroid Build Coastguard Worker       std::is_convertible_v<std::array<int, 3>&, base::span<const int>>,
262*6777b538SAndroid Build Coastguard Worker       "Error: l-value reference to std::array<int> should be convertible to "
263*6777b538SAndroid Build Coastguard Worker       "base::span<const int> with dynamic extent.");
264*6777b538SAndroid Build Coastguard Worker   static_assert(
265*6777b538SAndroid Build Coastguard Worker       std::is_convertible_v<std::array<int, 3>&, base::span<const int, 3>>,
266*6777b538SAndroid Build Coastguard Worker       "Error: l-value reference to std::array<int> should be convertible to "
267*6777b538SAndroid Build Coastguard Worker       "base::span<const int> with the same static extent.");
268*6777b538SAndroid Build Coastguard Worker   static_assert(
269*6777b538SAndroid Build Coastguard Worker       std::is_convertible_v<const std::array<int, 3>&, base::span<const int>>,
270*6777b538SAndroid Build Coastguard Worker       "Error: const l-value reference to std::array<int> should be "
271*6777b538SAndroid Build Coastguard Worker       "convertible to base::span<const int> with dynamic extent.");
272*6777b538SAndroid Build Coastguard Worker   static_assert(
273*6777b538SAndroid Build Coastguard Worker       std::is_convertible_v<const std::array<int, 3>&,
274*6777b538SAndroid Build Coastguard Worker                             base::span<const int, 3>>,
275*6777b538SAndroid Build Coastguard Worker       "Error: const l-value reference to std::array<int> should be convertible "
276*6777b538SAndroid Build Coastguard Worker       "to base::span<const int> with the same static extent.");
277*6777b538SAndroid Build Coastguard Worker   static_assert(
278*6777b538SAndroid Build Coastguard Worker       std::is_convertible_v<std::array<const int, 3>&, base::span<const int>>,
279*6777b538SAndroid Build Coastguard Worker       "Error: l-value reference to std::array<const int> should be "
280*6777b538SAndroid Build Coastguard Worker       "convertible to base::span<const int> with dynamic extent.");
281*6777b538SAndroid Build Coastguard Worker   static_assert(
282*6777b538SAndroid Build Coastguard Worker       std::is_convertible_v<std::array<const int, 3>&,
283*6777b538SAndroid Build Coastguard Worker                             base::span<const int, 3>>,
284*6777b538SAndroid Build Coastguard Worker       "Error: l-value reference to std::array<const int> should be convertible "
285*6777b538SAndroid Build Coastguard Worker       "to base::span<const int> with the same static extent.");
286*6777b538SAndroid Build Coastguard Worker   static_assert(
287*6777b538SAndroid Build Coastguard Worker       std::is_convertible_v<const std::array<const int, 3>&,
288*6777b538SAndroid Build Coastguard Worker                             base::span<const int>>,
289*6777b538SAndroid Build Coastguard Worker       "Error: const l-value reference to std::array<const int> should be "
290*6777b538SAndroid Build Coastguard Worker       "convertible to base::span<const int> with dynamic extent.");
291*6777b538SAndroid Build Coastguard Worker   static_assert(
292*6777b538SAndroid Build Coastguard Worker       std::is_convertible_v<const std::array<const int, 3>&,
293*6777b538SAndroid Build Coastguard Worker                             base::span<const int, 3>>,
294*6777b538SAndroid Build Coastguard Worker       "Error: const l-value reference to std::array<const int> should be "
295*6777b538SAndroid Build Coastguard Worker       "convertible to base::span<const int> with the same static extent.");
296*6777b538SAndroid Build Coastguard Worker }
297*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,DisallowedConstructionsFromStdArray)298*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, DisallowedConstructionsFromStdArray) {
299*6777b538SAndroid Build Coastguard Worker   // In the following assertions we use !std::is_constructible_v<T, Args>, which
300*6777b538SAndroid Build Coastguard Worker   // is equivalent to checking whether the following expression is malformed:
301*6777b538SAndroid Build Coastguard Worker   //
302*6777b538SAndroid Build Coastguard Worker   // T obj(std::declval<Args>()...);
303*6777b538SAndroid Build Coastguard Worker   //
304*6777b538SAndroid Build Coastguard Worker   // In particular we are checking that T is not explicitly constructible from
305*6777b538SAndroid Build Coastguard Worker   // Args, which also implies that T is not implicitly constructible from Args
306*6777b538SAndroid Build Coastguard Worker   // as well.
307*6777b538SAndroid Build Coastguard Worker   static_assert(
308*6777b538SAndroid Build Coastguard Worker       !std::is_constructible_v<base::span<int>, const std::array<int, 3>&>,
309*6777b538SAndroid Build Coastguard Worker       "Error: base::span<int> with dynamic extent should not be constructible "
310*6777b538SAndroid Build Coastguard Worker       "from const l-value reference to std::array<int>");
311*6777b538SAndroid Build Coastguard Worker 
312*6777b538SAndroid Build Coastguard Worker   static_assert(
313*6777b538SAndroid Build Coastguard Worker       !std::is_constructible_v<base::span<int>, std::array<const int, 3>&>,
314*6777b538SAndroid Build Coastguard Worker       "Error: base::span<int> with dynamic extent should not be constructible "
315*6777b538SAndroid Build Coastguard Worker       "from l-value reference to std::array<const int>");
316*6777b538SAndroid Build Coastguard Worker 
317*6777b538SAndroid Build Coastguard Worker   static_assert(
318*6777b538SAndroid Build Coastguard Worker       !std::is_constructible_v<base::span<int>,
319*6777b538SAndroid Build Coastguard Worker                                const std::array<const int, 3>&>,
320*6777b538SAndroid Build Coastguard Worker       "Error: base::span<int> with dynamic extent should not be constructible "
321*6777b538SAndroid Build Coastguard Worker       "const from l-value reference to std::array<const int>");
322*6777b538SAndroid Build Coastguard Worker 
323*6777b538SAndroid Build Coastguard Worker   static_assert(
324*6777b538SAndroid Build Coastguard Worker       !std::is_constructible_v<base::span<int, 2>, std::array<int, 3>&>,
325*6777b538SAndroid Build Coastguard Worker       "Error: base::span<int> with static extent should not be constructible "
326*6777b538SAndroid Build Coastguard Worker       "from l-value reference to std::array<int> with different extent");
327*6777b538SAndroid Build Coastguard Worker 
328*6777b538SAndroid Build Coastguard Worker   static_assert(
329*6777b538SAndroid Build Coastguard Worker       !std::is_constructible_v<base::span<int, 4>, std::array<int, 3>&>,
330*6777b538SAndroid Build Coastguard Worker       "Error: base::span<int> with dynamic extent should not be constructible "
331*6777b538SAndroid Build Coastguard Worker       "from l-value reference to std::array<int> with different extent");
332*6777b538SAndroid Build Coastguard Worker 
333*6777b538SAndroid Build Coastguard Worker   static_assert(
334*6777b538SAndroid Build Coastguard Worker       !std::is_constructible_v<base::span<int>, std::array<bool, 3>&>,
335*6777b538SAndroid Build Coastguard Worker       "Error: base::span<int> with dynamic extent should not be constructible "
336*6777b538SAndroid Build Coastguard Worker       "from l-value reference to std::array<bool>");
337*6777b538SAndroid Build Coastguard Worker }
338*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromConstexprArray)339*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromConstexprArray) {
340*6777b538SAndroid Build Coastguard Worker   static constexpr int kArray[] = {5, 4, 3, 2, 1};
341*6777b538SAndroid Build Coastguard Worker 
342*6777b538SAndroid Build Coastguard Worker   constexpr span<const int> dynamic_span(kArray);
343*6777b538SAndroid Build Coastguard Worker   static_assert(kArray == dynamic_span.data(), "");
344*6777b538SAndroid Build Coastguard Worker   static_assert(std::size(kArray) == dynamic_span.size(), "");
345*6777b538SAndroid Build Coastguard Worker 
346*6777b538SAndroid Build Coastguard Worker   static_assert(kArray[0] == dynamic_span[0], "");
347*6777b538SAndroid Build Coastguard Worker   static_assert(kArray[1] == dynamic_span[1], "");
348*6777b538SAndroid Build Coastguard Worker   static_assert(kArray[2] == dynamic_span[2], "");
349*6777b538SAndroid Build Coastguard Worker   static_assert(kArray[3] == dynamic_span[3], "");
350*6777b538SAndroid Build Coastguard Worker   static_assert(kArray[4] == dynamic_span[4], "");
351*6777b538SAndroid Build Coastguard Worker 
352*6777b538SAndroid Build Coastguard Worker   constexpr span<const int, std::size(kArray)> static_span(kArray);
353*6777b538SAndroid Build Coastguard Worker   static_assert(kArray == static_span.data(), "");
354*6777b538SAndroid Build Coastguard Worker   static_assert(std::size(kArray) == static_span.size(), "");
355*6777b538SAndroid Build Coastguard Worker 
356*6777b538SAndroid Build Coastguard Worker   static_assert(kArray[0] == static_span[0], "");
357*6777b538SAndroid Build Coastguard Worker   static_assert(kArray[1] == static_span[1], "");
358*6777b538SAndroid Build Coastguard Worker   static_assert(kArray[2] == static_span[2], "");
359*6777b538SAndroid Build Coastguard Worker   static_assert(kArray[3] == static_span[3], "");
360*6777b538SAndroid Build Coastguard Worker   static_assert(kArray[4] == static_span[4], "");
361*6777b538SAndroid Build Coastguard Worker }
362*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromArray)363*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromArray) {
364*6777b538SAndroid Build Coastguard Worker   int array[] = {5, 4, 3, 2, 1};
365*6777b538SAndroid Build Coastguard Worker 
366*6777b538SAndroid Build Coastguard Worker   span<const int> const_span = array;
367*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array, const_span.data());
368*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::size(array), const_span.size());
369*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < const_span.size(); ++i) {
370*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(array[i], const_span[i]);
371*6777b538SAndroid Build Coastguard Worker   }
372*6777b538SAndroid Build Coastguard Worker 
373*6777b538SAndroid Build Coastguard Worker   span<int> dynamic_span = array;
374*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array, dynamic_span.data());
375*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::size(array), dynamic_span.size());
376*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < dynamic_span.size(); ++i) {
377*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(array[i], dynamic_span[i]);
378*6777b538SAndroid Build Coastguard Worker   }
379*6777b538SAndroid Build Coastguard Worker 
380*6777b538SAndroid Build Coastguard Worker   span<int, std::size(array)> static_span = array;
381*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array, static_span.data());
382*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::size(array), static_span.size());
383*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i) {
384*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(array[i], static_span[i]);
385*6777b538SAndroid Build Coastguard Worker   }
386*6777b538SAndroid Build Coastguard Worker 
387*6777b538SAndroid Build Coastguard Worker   [](span<const int> dynamic_span) {
388*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(dynamic_span.size(), 5u);
389*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(dynamic_span[0u], 5);
390*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(dynamic_span[4u], 1);
391*6777b538SAndroid Build Coastguard Worker   }({{5, 4, 3, 2, 1}});
392*6777b538SAndroid Build Coastguard Worker 
393*6777b538SAndroid Build Coastguard Worker   [](span<const int, 5u> static_span) {
394*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(static_span.size(), 5u);
395*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(static_span[0u], 5);
396*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(static_span[4u], 1);
397*6777b538SAndroid Build Coastguard Worker   }({{5, 4, 3, 2, 1}});
398*6777b538SAndroid Build Coastguard Worker }
399*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromVolatileArray)400*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromVolatileArray) {
401*6777b538SAndroid Build Coastguard Worker   static volatile int array[] = {5, 4, 3, 2, 1};
402*6777b538SAndroid Build Coastguard Worker 
403*6777b538SAndroid Build Coastguard Worker   span<const volatile int> const_span(array);
404*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(&const_span[1]), const volatile int*>);
405*6777b538SAndroid Build Coastguard Worker   static_assert(
406*6777b538SAndroid Build Coastguard Worker       std::is_same_v<decltype(const_span.data()), const volatile int*>);
407*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array, const_span.data());
408*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::size(array), const_span.size());
409*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < const_span.size(); ++i) {
410*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(array[i], const_span[i]);
411*6777b538SAndroid Build Coastguard Worker   }
412*6777b538SAndroid Build Coastguard Worker 
413*6777b538SAndroid Build Coastguard Worker   span<volatile int> dynamic_span(array);
414*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(&dynamic_span[1]), volatile int*>);
415*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(dynamic_span.data()), volatile int*>);
416*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array, dynamic_span.data());
417*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::size(array), dynamic_span.size());
418*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < dynamic_span.size(); ++i) {
419*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(array[i], dynamic_span[i]);
420*6777b538SAndroid Build Coastguard Worker   }
421*6777b538SAndroid Build Coastguard Worker 
422*6777b538SAndroid Build Coastguard Worker   span<volatile int, std::size(array)> static_span(array);
423*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(&static_span[1]), volatile int*>);
424*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(static_span.data()), volatile int*>);
425*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array, static_span.data());
426*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::size(array), static_span.size());
427*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i) {
428*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(array[i], static_span[i]);
429*6777b538SAndroid Build Coastguard Worker   }
430*6777b538SAndroid Build Coastguard Worker }
431*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromStdArray)432*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromStdArray) {
433*6777b538SAndroid Build Coastguard Worker   // Note: Constructing a constexpr span from a constexpr std::array does not
434*6777b538SAndroid Build Coastguard Worker   // work prior to C++17 due to non-constexpr std::array::data.
435*6777b538SAndroid Build Coastguard Worker   std::array<int, 5> array = {{5, 4, 3, 2, 1}};
436*6777b538SAndroid Build Coastguard Worker 
437*6777b538SAndroid Build Coastguard Worker   span<const int> const_span(array);
438*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array.data(), const_span.data());
439*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array.size(), const_span.size());
440*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < const_span.size(); ++i) {
441*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(array[i], const_span[i]);
442*6777b538SAndroid Build Coastguard Worker   }
443*6777b538SAndroid Build Coastguard Worker 
444*6777b538SAndroid Build Coastguard Worker   span<int> dynamic_span(array);
445*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array.data(), dynamic_span.data());
446*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array.size(), dynamic_span.size());
447*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < dynamic_span.size(); ++i) {
448*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(array[i], dynamic_span[i]);
449*6777b538SAndroid Build Coastguard Worker   }
450*6777b538SAndroid Build Coastguard Worker 
451*6777b538SAndroid Build Coastguard Worker   span<int, std::size(array)> static_span(array);
452*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array.data(), static_span.data());
453*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array.size(), static_span.size());
454*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i) {
455*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(array[i], static_span[i]);
456*6777b538SAndroid Build Coastguard Worker   }
457*6777b538SAndroid Build Coastguard Worker }
458*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromInitializerList)459*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromInitializerList) {
460*6777b538SAndroid Build Coastguard Worker   std::initializer_list<int> il = {1, 1, 2, 3, 5, 8};
461*6777b538SAndroid Build Coastguard Worker 
462*6777b538SAndroid Build Coastguard Worker   span<const int> const_span(il);
463*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(il.begin(), const_span.data());
464*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(il.size(), const_span.size());
465*6777b538SAndroid Build Coastguard Worker 
466*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < const_span.size(); ++i) {
467*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(il.begin()[i], const_span[i]);
468*6777b538SAndroid Build Coastguard Worker   }
469*6777b538SAndroid Build Coastguard Worker 
470*6777b538SAndroid Build Coastguard Worker   span<const int, 6> static_span(il.begin(), il.end());
471*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(il.begin(), static_span.data());
472*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(il.size(), static_span.size());
473*6777b538SAndroid Build Coastguard Worker 
474*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i) {
475*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(il.begin()[i], static_span[i]);
476*6777b538SAndroid Build Coastguard Worker   }
477*6777b538SAndroid Build Coastguard Worker }
478*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromStdString)479*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromStdString) {
480*6777b538SAndroid Build Coastguard Worker   std::string str = "foobar";
481*6777b538SAndroid Build Coastguard Worker 
482*6777b538SAndroid Build Coastguard Worker   span<const char> const_span(str);
483*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(str.data(), const_span.data());
484*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(str.size(), const_span.size());
485*6777b538SAndroid Build Coastguard Worker 
486*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < const_span.size(); ++i) {
487*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(str[i], const_span[i]);
488*6777b538SAndroid Build Coastguard Worker   }
489*6777b538SAndroid Build Coastguard Worker 
490*6777b538SAndroid Build Coastguard Worker   span<char> dynamic_span(str);
491*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(str.data(), dynamic_span.data());
492*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(str.size(), dynamic_span.size());
493*6777b538SAndroid Build Coastguard Worker 
494*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < dynamic_span.size(); ++i) {
495*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(str[i], dynamic_span[i]);
496*6777b538SAndroid Build Coastguard Worker   }
497*6777b538SAndroid Build Coastguard Worker 
498*6777b538SAndroid Build Coastguard Worker   span<char, 6> static_span(data(str), str.size());
499*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(str.data(), static_span.data());
500*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(str.size(), static_span.size());
501*6777b538SAndroid Build Coastguard Worker 
502*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i) {
503*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(str[i], static_span[i]);
504*6777b538SAndroid Build Coastguard Worker   }
505*6777b538SAndroid Build Coastguard Worker }
506*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromConstContainer)507*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromConstContainer) {
508*6777b538SAndroid Build Coastguard Worker   const std::vector<int> vector = {1, 1, 2, 3, 5, 8};
509*6777b538SAndroid Build Coastguard Worker 
510*6777b538SAndroid Build Coastguard Worker   span<const int> const_span(vector);
511*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), const_span.data());
512*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), const_span.size());
513*6777b538SAndroid Build Coastguard Worker 
514*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < const_span.size(); ++i) {
515*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], const_span[i]);
516*6777b538SAndroid Build Coastguard Worker   }
517*6777b538SAndroid Build Coastguard Worker 
518*6777b538SAndroid Build Coastguard Worker   span<const int, 6> static_span(vector.data(), vector.size());
519*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), static_span.data());
520*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), static_span.size());
521*6777b538SAndroid Build Coastguard Worker 
522*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i) {
523*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], static_span[i]);
524*6777b538SAndroid Build Coastguard Worker   }
525*6777b538SAndroid Build Coastguard Worker }
526*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromContainer)527*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromContainer) {
528*6777b538SAndroid Build Coastguard Worker   std::vector<int> vector = {1, 1, 2, 3, 5, 8};
529*6777b538SAndroid Build Coastguard Worker 
530*6777b538SAndroid Build Coastguard Worker   span<const int> const_span(vector);
531*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), const_span.data());
532*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), const_span.size());
533*6777b538SAndroid Build Coastguard Worker 
534*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < const_span.size(); ++i) {
535*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], const_span[i]);
536*6777b538SAndroid Build Coastguard Worker   }
537*6777b538SAndroid Build Coastguard Worker 
538*6777b538SAndroid Build Coastguard Worker   span<int> dynamic_span(vector);
539*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), dynamic_span.data());
540*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), dynamic_span.size());
541*6777b538SAndroid Build Coastguard Worker 
542*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < dynamic_span.size(); ++i) {
543*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], dynamic_span[i]);
544*6777b538SAndroid Build Coastguard Worker   }
545*6777b538SAndroid Build Coastguard Worker 
546*6777b538SAndroid Build Coastguard Worker   span<int, 6> static_span(vector.data(), vector.size());
547*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), static_span.data());
548*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), static_span.size());
549*6777b538SAndroid Build Coastguard Worker 
550*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i) {
551*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], static_span[i]);
552*6777b538SAndroid Build Coastguard Worker   }
553*6777b538SAndroid Build Coastguard Worker }
554*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromRange)555*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromRange) {
556*6777b538SAndroid Build Coastguard Worker   struct Range {
557*6777b538SAndroid Build Coastguard Worker     using iterator = base::span<const int>::iterator;
558*6777b538SAndroid Build Coastguard Worker     iterator begin() const { return base::span(arr_).begin(); }
559*6777b538SAndroid Build Coastguard Worker     iterator end() const { return base::span(arr_).end(); }
560*6777b538SAndroid Build Coastguard Worker 
561*6777b538SAndroid Build Coastguard Worker     std::array<const int, 3u> arr_ = {1, 2, 3};
562*6777b538SAndroid Build Coastguard Worker   };
563*6777b538SAndroid Build Coastguard Worker   static_assert(std::ranges::contiguous_range<Range>);
564*6777b538SAndroid Build Coastguard Worker   {
565*6777b538SAndroid Build Coastguard Worker     Range r;
566*6777b538SAndroid Build Coastguard Worker     auto s = base::span(r);
567*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(s), base::span<const int>>);
568*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, base::span({1, 2, 3}));
569*6777b538SAndroid Build Coastguard Worker   }
570*6777b538SAndroid Build Coastguard Worker 
571*6777b538SAndroid Build Coastguard Worker   struct LegacyRange {
572*6777b538SAndroid Build Coastguard Worker     const int* data() const { return arr_.data(); }
573*6777b538SAndroid Build Coastguard Worker     size_t size() const { return arr_.size(); }
574*6777b538SAndroid Build Coastguard Worker 
575*6777b538SAndroid Build Coastguard Worker     std::array<const int, 3u> arr_ = {1, 2, 3};
576*6777b538SAndroid Build Coastguard Worker   };
577*6777b538SAndroid Build Coastguard Worker   static_assert(!std::ranges::contiguous_range<LegacyRange>);
578*6777b538SAndroid Build Coastguard Worker   static_assert(base::internal::LegacyRange<LegacyRange>);
579*6777b538SAndroid Build Coastguard Worker   {
580*6777b538SAndroid Build Coastguard Worker     LegacyRange r;
581*6777b538SAndroid Build Coastguard Worker     auto s = base::span(r);
582*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(s), base::span<const int>>);
583*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, base::span({1, 2, 3}));
584*6777b538SAndroid Build Coastguard Worker   }
585*6777b538SAndroid Build Coastguard Worker }
586*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,FromRefOfMutableStackVariable)587*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, FromRefOfMutableStackVariable) {
588*6777b538SAndroid Build Coastguard Worker   int x = 123;
589*6777b538SAndroid Build Coastguard Worker 
590*6777b538SAndroid Build Coastguard Worker   auto s = span_from_ref(x);
591*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(s), span<int, 1u>>);
592*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(&x, s.data());
593*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1u, s.size());
594*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(sizeof(int), s.size_bytes());
595*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(123, s[0]);
596*6777b538SAndroid Build Coastguard Worker 
597*6777b538SAndroid Build Coastguard Worker   s[0] = 456;
598*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(456, x);
599*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(456, s[0]);
600*6777b538SAndroid Build Coastguard Worker 
601*6777b538SAndroid Build Coastguard Worker   auto b = byte_span_from_ref(x);
602*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(b), span<uint8_t, sizeof(int)>>);
603*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(reinterpret_cast<uint8_t*>(&x), b.data());
604*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(sizeof(int), b.size());
605*6777b538SAndroid Build Coastguard Worker }
606*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,FromRefOfConstStackVariable)607*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, FromRefOfConstStackVariable) {
608*6777b538SAndroid Build Coastguard Worker   const int x = 123;
609*6777b538SAndroid Build Coastguard Worker 
610*6777b538SAndroid Build Coastguard Worker   auto s = span_from_ref(x);
611*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(s), span<const int, 1u>>);
612*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(&x, s.data());
613*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1u, s.size());
614*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(sizeof(int), s.size_bytes());
615*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(123, s[0]);
616*6777b538SAndroid Build Coastguard Worker 
617*6777b538SAndroid Build Coastguard Worker   auto b = byte_span_from_ref(x);
618*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(b), span<const uint8_t, sizeof(int)>>);
619*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(reinterpret_cast<const uint8_t*>(&x), b.data());
620*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(sizeof(int), b.size());
621*6777b538SAndroid Build Coastguard Worker }
622*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,FromCString)623*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, FromCString) {
624*6777b538SAndroid Build Coastguard Worker   // No terminating null, size known at compile time.
625*6777b538SAndroid Build Coastguard Worker   {
626*6777b538SAndroid Build Coastguard Worker     auto s = base::span_from_cstring("hello");
627*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(s), span<const char, 5u>>);
628*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s[0u], 'h');
629*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s[1u], 'e');
630*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s[4u], 'o');
631*6777b538SAndroid Build Coastguard Worker   }
632*6777b538SAndroid Build Coastguard Worker   // No terminating null, size not known at compile time. string_view loses
633*6777b538SAndroid Build Coastguard Worker   // the size.
634*6777b538SAndroid Build Coastguard Worker   {
635*6777b538SAndroid Build Coastguard Worker     auto s = base::span(std::string_view("hello"));
636*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(s), span<const char>>);
637*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s[0u], 'h');
638*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s[1u], 'e');
639*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s[4u], 'o');
640*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s.size(), 5u);
641*6777b538SAndroid Build Coastguard Worker   }
642*6777b538SAndroid Build Coastguard Worker   // Includes the terminating null, size known at compile time.
643*6777b538SAndroid Build Coastguard Worker   {
644*6777b538SAndroid Build Coastguard Worker     auto s = base::span("hello");
645*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(s), span<const char, 6u>>);
646*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s[0u], 'h');
647*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s[1u], 'e');
648*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s[4u], 'o');
649*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s[5u], '\0');
650*6777b538SAndroid Build Coastguard Worker   }
651*6777b538SAndroid Build Coastguard Worker 
652*6777b538SAndroid Build Coastguard Worker   // No terminating null, size known at compile time. Converted to a span of
653*6777b538SAndroid Build Coastguard Worker   // uint8_t bytes.
654*6777b538SAndroid Build Coastguard Worker   {
655*6777b538SAndroid Build Coastguard Worker     auto s = base::byte_span_from_cstring("hello");
656*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(s), span<const uint8_t, 5u>>);
657*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s[0u], 'h');
658*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s[1u], 'e');
659*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s[4u], 'o');
660*6777b538SAndroid Build Coastguard Worker   }
661*6777b538SAndroid Build Coastguard Worker }
662*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,ConvertNonConstIntegralToConst)663*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, ConvertNonConstIntegralToConst) {
664*6777b538SAndroid Build Coastguard Worker   std::vector<int> vector = {1, 1, 2, 3, 5, 8};
665*6777b538SAndroid Build Coastguard Worker 
666*6777b538SAndroid Build Coastguard Worker   span<int> int_span(vector.data(), vector.size());
667*6777b538SAndroid Build Coastguard Worker   span<const int> const_span(int_span);
668*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(int_span.size(), const_span.size());
669*6777b538SAndroid Build Coastguard Worker 
670*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(const_span, Pointwise(Eq(), int_span));
671*6777b538SAndroid Build Coastguard Worker 
672*6777b538SAndroid Build Coastguard Worker   span<int, 6> static_int_span(vector.data(), vector.size());
673*6777b538SAndroid Build Coastguard Worker   span<const int, 6> static_const_span(static_int_span);
674*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(static_const_span, Pointwise(Eq(), static_int_span));
675*6777b538SAndroid Build Coastguard Worker }
676*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,ConvertNonConstPointerToConst)677*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, ConvertNonConstPointerToConst) {
678*6777b538SAndroid Build Coastguard Worker   auto a = std::make_unique<int>(11);
679*6777b538SAndroid Build Coastguard Worker   auto b = std::make_unique<int>(22);
680*6777b538SAndroid Build Coastguard Worker   auto c = std::make_unique<int>(33);
681*6777b538SAndroid Build Coastguard Worker   std::vector<int*> vector = {a.get(), b.get(), c.get()};
682*6777b538SAndroid Build Coastguard Worker 
683*6777b538SAndroid Build Coastguard Worker   span<int*> non_const_pointer_span(vector);
684*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(non_const_pointer_span, Pointwise(Eq(), vector));
685*6777b538SAndroid Build Coastguard Worker   span<int* const> const_pointer_span(non_const_pointer_span);
686*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(const_pointer_span, Pointwise(Eq(), non_const_pointer_span));
687*6777b538SAndroid Build Coastguard Worker   // Note: no test for conversion from span<int> to span<const int*>, since that
688*6777b538SAndroid Build Coastguard Worker   // would imply a conversion from int** to const int**, which is unsafe.
689*6777b538SAndroid Build Coastguard Worker   //
690*6777b538SAndroid Build Coastguard Worker   // Note: no test for conversion from span<int*> to span<const int* const>,
691*6777b538SAndroid Build Coastguard Worker   // due to CWG Defect 330:
692*6777b538SAndroid Build Coastguard Worker   // http://open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#330
693*6777b538SAndroid Build Coastguard Worker 
694*6777b538SAndroid Build Coastguard Worker   span<int*, 3> static_non_const_pointer_span(vector.data(), vector.size());
695*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(static_non_const_pointer_span, Pointwise(Eq(), vector));
696*6777b538SAndroid Build Coastguard Worker   span<int* const, 3> static_const_pointer_span(static_non_const_pointer_span);
697*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(static_const_pointer_span,
698*6777b538SAndroid Build Coastguard Worker               Pointwise(Eq(), static_non_const_pointer_span));
699*6777b538SAndroid Build Coastguard Worker }
700*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,ConvertBetweenEquivalentTypes)701*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, ConvertBetweenEquivalentTypes) {
702*6777b538SAndroid Build Coastguard Worker   std::vector<int32_t> vector = {2, 4, 8, 16, 32};
703*6777b538SAndroid Build Coastguard Worker 
704*6777b538SAndroid Build Coastguard Worker   span<int32_t> int32_t_span(vector);
705*6777b538SAndroid Build Coastguard Worker   span<int> converted_span(int32_t_span);
706*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(int32_t_span.data(), converted_span.data());
707*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(int32_t_span.size(), converted_span.size());
708*6777b538SAndroid Build Coastguard Worker 
709*6777b538SAndroid Build Coastguard Worker   span<int32_t, 5> static_int32_t_span(vector.data(), vector.size());
710*6777b538SAndroid Build Coastguard Worker   span<int, 5> static_converted_span(static_int32_t_span);
711*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(static_int32_t_span.data(), static_converted_span.data());
712*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(static_int32_t_span.size(), static_converted_span.size());
713*6777b538SAndroid Build Coastguard Worker }
714*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,TemplatedFirst)715*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, TemplatedFirst) {
716*6777b538SAndroid Build Coastguard Worker   static constexpr int array[] = {1, 2, 3};
717*6777b538SAndroid Build Coastguard Worker   constexpr span<const int, 3> span(array);
718*6777b538SAndroid Build Coastguard Worker 
719*6777b538SAndroid Build Coastguard Worker   {
720*6777b538SAndroid Build Coastguard Worker     constexpr auto subspan = span.first<0>();
721*6777b538SAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
722*6777b538SAndroid Build Coastguard Worker     static_assert(0u == subspan.size(), "");
723*6777b538SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
724*6777b538SAndroid Build Coastguard Worker   }
725*6777b538SAndroid Build Coastguard Worker 
726*6777b538SAndroid Build Coastguard Worker   {
727*6777b538SAndroid Build Coastguard Worker     constexpr auto subspan = span.first<1>();
728*6777b538SAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
729*6777b538SAndroid Build Coastguard Worker     static_assert(1u == subspan.size(), "");
730*6777b538SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
731*6777b538SAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
732*6777b538SAndroid Build Coastguard Worker   }
733*6777b538SAndroid Build Coastguard Worker 
734*6777b538SAndroid Build Coastguard Worker   {
735*6777b538SAndroid Build Coastguard Worker     constexpr auto subspan = span.first<2>();
736*6777b538SAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
737*6777b538SAndroid Build Coastguard Worker     static_assert(2u == subspan.size(), "");
738*6777b538SAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
739*6777b538SAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
740*6777b538SAndroid Build Coastguard Worker     static_assert(2 == subspan[1], "");
741*6777b538SAndroid Build Coastguard Worker   }
742*6777b538SAndroid Build Coastguard Worker 
743*6777b538SAndroid Build Coastguard Worker   {
744*6777b538SAndroid Build Coastguard Worker     constexpr auto subspan = span.first<3>();
745*6777b538SAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
746*6777b538SAndroid Build Coastguard Worker     static_assert(3u == subspan.size(), "");
747*6777b538SAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
748*6777b538SAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
749*6777b538SAndroid Build Coastguard Worker     static_assert(2 == subspan[1], "");
750*6777b538SAndroid Build Coastguard Worker     static_assert(3 == subspan[2], "");
751*6777b538SAndroid Build Coastguard Worker   }
752*6777b538SAndroid Build Coastguard Worker }
753*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,TemplatedLast)754*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, TemplatedLast) {
755*6777b538SAndroid Build Coastguard Worker   static constexpr int array[] = {1, 2, 3};
756*6777b538SAndroid Build Coastguard Worker   constexpr span<const int, 3> span(array);
757*6777b538SAndroid Build Coastguard Worker 
758*6777b538SAndroid Build Coastguard Worker   {
759*6777b538SAndroid Build Coastguard Worker     constexpr auto subspan = span.last<0>();
760*6777b538SAndroid Build Coastguard Worker     static_assert(span.data() + 3 == subspan.data(), "");
761*6777b538SAndroid Build Coastguard Worker     static_assert(0u == subspan.size(), "");
762*6777b538SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
763*6777b538SAndroid Build Coastguard Worker   }
764*6777b538SAndroid Build Coastguard Worker 
765*6777b538SAndroid Build Coastguard Worker   {
766*6777b538SAndroid Build Coastguard Worker     constexpr auto subspan = span.last<1>();
767*6777b538SAndroid Build Coastguard Worker     static_assert(span.data() + 2 == subspan.data(), "");
768*6777b538SAndroid Build Coastguard Worker     static_assert(1u == subspan.size(), "");
769*6777b538SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
770*6777b538SAndroid Build Coastguard Worker     static_assert(3 == subspan[0], "");
771*6777b538SAndroid Build Coastguard Worker   }
772*6777b538SAndroid Build Coastguard Worker 
773*6777b538SAndroid Build Coastguard Worker   {
774*6777b538SAndroid Build Coastguard Worker     constexpr auto subspan = span.last<2>();
775*6777b538SAndroid Build Coastguard Worker     static_assert(span.data() + 1 == subspan.data(), "");
776*6777b538SAndroid Build Coastguard Worker     static_assert(2u == subspan.size(), "");
777*6777b538SAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
778*6777b538SAndroid Build Coastguard Worker     static_assert(2 == subspan[0], "");
779*6777b538SAndroid Build Coastguard Worker     static_assert(3 == subspan[1], "");
780*6777b538SAndroid Build Coastguard Worker   }
781*6777b538SAndroid Build Coastguard Worker 
782*6777b538SAndroid Build Coastguard Worker   {
783*6777b538SAndroid Build Coastguard Worker     constexpr auto subspan = span.last<3>();
784*6777b538SAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
785*6777b538SAndroid Build Coastguard Worker     static_assert(3u == subspan.size(), "");
786*6777b538SAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
787*6777b538SAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
788*6777b538SAndroid Build Coastguard Worker     static_assert(2 == subspan[1], "");
789*6777b538SAndroid Build Coastguard Worker     static_assert(3 == subspan[2], "");
790*6777b538SAndroid Build Coastguard Worker   }
791*6777b538SAndroid Build Coastguard Worker }
792*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,TemplatedSubspan)793*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, TemplatedSubspan) {
794*6777b538SAndroid Build Coastguard Worker   static constexpr int array[] = {1, 2, 3};
795*6777b538SAndroid Build Coastguard Worker   constexpr span<const int, 3> span(array);
796*6777b538SAndroid Build Coastguard Worker 
797*6777b538SAndroid Build Coastguard Worker   {
798*6777b538SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<0>();
799*6777b538SAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
800*6777b538SAndroid Build Coastguard Worker     static_assert(3u == subspan.size(), "");
801*6777b538SAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
802*6777b538SAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
803*6777b538SAndroid Build Coastguard Worker     static_assert(2 == subspan[1], "");
804*6777b538SAndroid Build Coastguard Worker     static_assert(3 == subspan[2], "");
805*6777b538SAndroid Build Coastguard Worker   }
806*6777b538SAndroid Build Coastguard Worker 
807*6777b538SAndroid Build Coastguard Worker   {
808*6777b538SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<1>();
809*6777b538SAndroid Build Coastguard Worker     static_assert(span.data() + 1 == subspan.data(), "");
810*6777b538SAndroid Build Coastguard Worker     static_assert(2u == subspan.size(), "");
811*6777b538SAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
812*6777b538SAndroid Build Coastguard Worker     static_assert(2 == subspan[0], "");
813*6777b538SAndroid Build Coastguard Worker     static_assert(3 == subspan[1], "");
814*6777b538SAndroid Build Coastguard Worker   }
815*6777b538SAndroid Build Coastguard Worker 
816*6777b538SAndroid Build Coastguard Worker   {
817*6777b538SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<2>();
818*6777b538SAndroid Build Coastguard Worker     static_assert(span.data() + 2 == subspan.data(), "");
819*6777b538SAndroid Build Coastguard Worker     static_assert(1u == subspan.size(), "");
820*6777b538SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
821*6777b538SAndroid Build Coastguard Worker     static_assert(3 == subspan[0], "");
822*6777b538SAndroid Build Coastguard Worker   }
823*6777b538SAndroid Build Coastguard Worker 
824*6777b538SAndroid Build Coastguard Worker   {
825*6777b538SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<3>();
826*6777b538SAndroid Build Coastguard Worker     static_assert(span.data() + 3 == subspan.data(), "");
827*6777b538SAndroid Build Coastguard Worker     static_assert(0u == subspan.size(), "");
828*6777b538SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
829*6777b538SAndroid Build Coastguard Worker   }
830*6777b538SAndroid Build Coastguard Worker 
831*6777b538SAndroid Build Coastguard Worker   {
832*6777b538SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<0, 0>();
833*6777b538SAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
834*6777b538SAndroid Build Coastguard Worker     static_assert(0u == subspan.size(), "");
835*6777b538SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
836*6777b538SAndroid Build Coastguard Worker   }
837*6777b538SAndroid Build Coastguard Worker 
838*6777b538SAndroid Build Coastguard Worker   {
839*6777b538SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<1, 0>();
840*6777b538SAndroid Build Coastguard Worker     static_assert(span.data() + 1 == subspan.data(), "");
841*6777b538SAndroid Build Coastguard Worker     static_assert(0u == subspan.size(), "");
842*6777b538SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
843*6777b538SAndroid Build Coastguard Worker   }
844*6777b538SAndroid Build Coastguard Worker 
845*6777b538SAndroid Build Coastguard Worker   {
846*6777b538SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<2, 0>();
847*6777b538SAndroid Build Coastguard Worker     static_assert(span.data() + 2 == subspan.data(), "");
848*6777b538SAndroid Build Coastguard Worker     static_assert(0u == subspan.size(), "");
849*6777b538SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
850*6777b538SAndroid Build Coastguard Worker   }
851*6777b538SAndroid Build Coastguard Worker 
852*6777b538SAndroid Build Coastguard Worker   {
853*6777b538SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<0, 1>();
854*6777b538SAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
855*6777b538SAndroid Build Coastguard Worker     static_assert(1u == subspan.size(), "");
856*6777b538SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
857*6777b538SAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
858*6777b538SAndroid Build Coastguard Worker   }
859*6777b538SAndroid Build Coastguard Worker 
860*6777b538SAndroid Build Coastguard Worker   {
861*6777b538SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<1, 1>();
862*6777b538SAndroid Build Coastguard Worker     static_assert(span.data() + 1 == subspan.data(), "");
863*6777b538SAndroid Build Coastguard Worker     static_assert(1u == subspan.size(), "");
864*6777b538SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
865*6777b538SAndroid Build Coastguard Worker     static_assert(2 == subspan[0], "");
866*6777b538SAndroid Build Coastguard Worker   }
867*6777b538SAndroid Build Coastguard Worker 
868*6777b538SAndroid Build Coastguard Worker   {
869*6777b538SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<2, 1>();
870*6777b538SAndroid Build Coastguard Worker     static_assert(span.data() + 2 == subspan.data(), "");
871*6777b538SAndroid Build Coastguard Worker     static_assert(1u == subspan.size(), "");
872*6777b538SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
873*6777b538SAndroid Build Coastguard Worker     static_assert(3 == subspan[0], "");
874*6777b538SAndroid Build Coastguard Worker   }
875*6777b538SAndroid Build Coastguard Worker 
876*6777b538SAndroid Build Coastguard Worker   {
877*6777b538SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<0, 2>();
878*6777b538SAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
879*6777b538SAndroid Build Coastguard Worker     static_assert(2u == subspan.size(), "");
880*6777b538SAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
881*6777b538SAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
882*6777b538SAndroid Build Coastguard Worker     static_assert(2 == subspan[1], "");
883*6777b538SAndroid Build Coastguard Worker   }
884*6777b538SAndroid Build Coastguard Worker 
885*6777b538SAndroid Build Coastguard Worker   {
886*6777b538SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<1, 2>();
887*6777b538SAndroid Build Coastguard Worker     static_assert(span.data() + 1 == subspan.data(), "");
888*6777b538SAndroid Build Coastguard Worker     static_assert(2u == subspan.size(), "");
889*6777b538SAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
890*6777b538SAndroid Build Coastguard Worker     static_assert(2 == subspan[0], "");
891*6777b538SAndroid Build Coastguard Worker     static_assert(3 == subspan[1], "");
892*6777b538SAndroid Build Coastguard Worker   }
893*6777b538SAndroid Build Coastguard Worker 
894*6777b538SAndroid Build Coastguard Worker   {
895*6777b538SAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<0, 3>();
896*6777b538SAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
897*6777b538SAndroid Build Coastguard Worker     static_assert(3u == subspan.size(), "");
898*6777b538SAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
899*6777b538SAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
900*6777b538SAndroid Build Coastguard Worker     static_assert(2 == subspan[1], "");
901*6777b538SAndroid Build Coastguard Worker     static_assert(3 == subspan[2], "");
902*6777b538SAndroid Build Coastguard Worker   }
903*6777b538SAndroid Build Coastguard Worker }
904*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,SubscriptedBeginIterator)905*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, SubscriptedBeginIterator) {
906*6777b538SAndroid Build Coastguard Worker   int array[] = {1, 2, 3};
907*6777b538SAndroid Build Coastguard Worker   span<const int> const_span(array);
908*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < const_span.size(); ++i) {
909*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(array[i], const_span.begin()[i]);
910*6777b538SAndroid Build Coastguard Worker   }
911*6777b538SAndroid Build Coastguard Worker 
912*6777b538SAndroid Build Coastguard Worker   span<int> mutable_span(array);
913*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < mutable_span.size(); ++i) {
914*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(array[i], mutable_span.begin()[i]);
915*6777b538SAndroid Build Coastguard Worker   }
916*6777b538SAndroid Build Coastguard Worker }
917*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,TemplatedFirstOnDynamicSpan)918*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, TemplatedFirstOnDynamicSpan) {
919*6777b538SAndroid Build Coastguard Worker   int array[] = {1, 2, 3};
920*6777b538SAndroid Build Coastguard Worker   span<const int> span(array);
921*6777b538SAndroid Build Coastguard Worker 
922*6777b538SAndroid Build Coastguard Worker   {
923*6777b538SAndroid Build Coastguard Worker     auto subspan = span.first<0>();
924*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
925*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
926*6777b538SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
927*6777b538SAndroid Build Coastguard Worker   }
928*6777b538SAndroid Build Coastguard Worker 
929*6777b538SAndroid Build Coastguard Worker   {
930*6777b538SAndroid Build Coastguard Worker     auto subspan = span.first<1>();
931*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
932*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
933*6777b538SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
934*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
935*6777b538SAndroid Build Coastguard Worker   }
936*6777b538SAndroid Build Coastguard Worker 
937*6777b538SAndroid Build Coastguard Worker   {
938*6777b538SAndroid Build Coastguard Worker     auto subspan = span.first<2>();
939*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
940*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
941*6777b538SAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
942*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
943*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
944*6777b538SAndroid Build Coastguard Worker   }
945*6777b538SAndroid Build Coastguard Worker 
946*6777b538SAndroid Build Coastguard Worker   {
947*6777b538SAndroid Build Coastguard Worker     auto subspan = span.first<3>();
948*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
949*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3u, subspan.size());
950*6777b538SAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
951*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
952*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
953*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
954*6777b538SAndroid Build Coastguard Worker   }
955*6777b538SAndroid Build Coastguard Worker }
956*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,TemplatedLastOnDynamicSpan)957*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, TemplatedLastOnDynamicSpan) {
958*6777b538SAndroid Build Coastguard Worker   int array[] = {1, 2, 3};
959*6777b538SAndroid Build Coastguard Worker   span<int> span(array);
960*6777b538SAndroid Build Coastguard Worker 
961*6777b538SAndroid Build Coastguard Worker   {
962*6777b538SAndroid Build Coastguard Worker     auto subspan = span.last<0>();
963*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 3, subspan.data());
964*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
965*6777b538SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
966*6777b538SAndroid Build Coastguard Worker   }
967*6777b538SAndroid Build Coastguard Worker 
968*6777b538SAndroid Build Coastguard Worker   {
969*6777b538SAndroid Build Coastguard Worker     auto subspan = span.last<1>();
970*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
971*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
972*6777b538SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
973*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[0]);
974*6777b538SAndroid Build Coastguard Worker   }
975*6777b538SAndroid Build Coastguard Worker 
976*6777b538SAndroid Build Coastguard Worker   {
977*6777b538SAndroid Build Coastguard Worker     auto subspan = span.last<2>();
978*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
979*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
980*6777b538SAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
981*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
982*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[1]);
983*6777b538SAndroid Build Coastguard Worker   }
984*6777b538SAndroid Build Coastguard Worker 
985*6777b538SAndroid Build Coastguard Worker   {
986*6777b538SAndroid Build Coastguard Worker     auto subspan = span.last<3>();
987*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
988*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3u, subspan.size());
989*6777b538SAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
990*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
991*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
992*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
993*6777b538SAndroid Build Coastguard Worker   }
994*6777b538SAndroid Build Coastguard Worker }
995*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,TemplatedSubspanFromDynamicSpan)996*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, TemplatedSubspanFromDynamicSpan) {
997*6777b538SAndroid Build Coastguard Worker   int array[] = {1, 2, 3};
998*6777b538SAndroid Build Coastguard Worker   span<int, 3> span(array);
999*6777b538SAndroid Build Coastguard Worker 
1000*6777b538SAndroid Build Coastguard Worker   {
1001*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan<0>();
1002*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
1003*6777b538SAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
1004*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3u, subspan.size());
1005*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
1006*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
1007*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
1008*6777b538SAndroid Build Coastguard Worker   }
1009*6777b538SAndroid Build Coastguard Worker 
1010*6777b538SAndroid Build Coastguard Worker   {
1011*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan<1>();
1012*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
1013*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
1014*6777b538SAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
1015*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
1016*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[1]);
1017*6777b538SAndroid Build Coastguard Worker   }
1018*6777b538SAndroid Build Coastguard Worker 
1019*6777b538SAndroid Build Coastguard Worker   {
1020*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan<2>();
1021*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
1022*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
1023*6777b538SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
1024*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[0]);
1025*6777b538SAndroid Build Coastguard Worker   }
1026*6777b538SAndroid Build Coastguard Worker 
1027*6777b538SAndroid Build Coastguard Worker   {
1028*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan<3>();
1029*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 3, subspan.data());
1030*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
1031*6777b538SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
1032*6777b538SAndroid Build Coastguard Worker   }
1033*6777b538SAndroid Build Coastguard Worker 
1034*6777b538SAndroid Build Coastguard Worker   {
1035*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan<0, 0>();
1036*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
1037*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
1038*6777b538SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
1039*6777b538SAndroid Build Coastguard Worker   }
1040*6777b538SAndroid Build Coastguard Worker 
1041*6777b538SAndroid Build Coastguard Worker   {
1042*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan<1, 0>();
1043*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
1044*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
1045*6777b538SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
1046*6777b538SAndroid Build Coastguard Worker   }
1047*6777b538SAndroid Build Coastguard Worker 
1048*6777b538SAndroid Build Coastguard Worker   {
1049*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan<2, 0>();
1050*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
1051*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
1052*6777b538SAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
1053*6777b538SAndroid Build Coastguard Worker   }
1054*6777b538SAndroid Build Coastguard Worker 
1055*6777b538SAndroid Build Coastguard Worker   {
1056*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan<0, 1>();
1057*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
1058*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
1059*6777b538SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
1060*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
1061*6777b538SAndroid Build Coastguard Worker   }
1062*6777b538SAndroid Build Coastguard Worker 
1063*6777b538SAndroid Build Coastguard Worker   {
1064*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan<1, 1>();
1065*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
1066*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
1067*6777b538SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
1068*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
1069*6777b538SAndroid Build Coastguard Worker   }
1070*6777b538SAndroid Build Coastguard Worker 
1071*6777b538SAndroid Build Coastguard Worker   {
1072*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan<2, 1>();
1073*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
1074*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
1075*6777b538SAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
1076*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[0]);
1077*6777b538SAndroid Build Coastguard Worker   }
1078*6777b538SAndroid Build Coastguard Worker 
1079*6777b538SAndroid Build Coastguard Worker   {
1080*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan<0, 2>();
1081*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
1082*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
1083*6777b538SAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
1084*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
1085*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
1086*6777b538SAndroid Build Coastguard Worker   }
1087*6777b538SAndroid Build Coastguard Worker 
1088*6777b538SAndroid Build Coastguard Worker   {
1089*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan<1, 2>();
1090*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
1091*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
1092*6777b538SAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
1093*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
1094*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[1]);
1095*6777b538SAndroid Build Coastguard Worker   }
1096*6777b538SAndroid Build Coastguard Worker 
1097*6777b538SAndroid Build Coastguard Worker   {
1098*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan<0, 3>();
1099*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
1100*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3u, subspan.size());
1101*6777b538SAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
1102*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
1103*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
1104*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
1105*6777b538SAndroid Build Coastguard Worker   }
1106*6777b538SAndroid Build Coastguard Worker }
1107*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,First)1108*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, First) {
1109*6777b538SAndroid Build Coastguard Worker   int array[] = {1, 2, 3};
1110*6777b538SAndroid Build Coastguard Worker   span<int> span(array);
1111*6777b538SAndroid Build Coastguard Worker 
1112*6777b538SAndroid Build Coastguard Worker   {
1113*6777b538SAndroid Build Coastguard Worker     auto subspan = span.first(0u);
1114*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
1115*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
1116*6777b538SAndroid Build Coastguard Worker   }
1117*6777b538SAndroid Build Coastguard Worker 
1118*6777b538SAndroid Build Coastguard Worker   {
1119*6777b538SAndroid Build Coastguard Worker     auto subspan = span.first(1u);
1120*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
1121*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
1122*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
1123*6777b538SAndroid Build Coastguard Worker   }
1124*6777b538SAndroid Build Coastguard Worker 
1125*6777b538SAndroid Build Coastguard Worker   {
1126*6777b538SAndroid Build Coastguard Worker     auto subspan = span.first(2u);
1127*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
1128*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
1129*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
1130*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
1131*6777b538SAndroid Build Coastguard Worker   }
1132*6777b538SAndroid Build Coastguard Worker 
1133*6777b538SAndroid Build Coastguard Worker   {
1134*6777b538SAndroid Build Coastguard Worker     auto subspan = span.first(3u);
1135*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
1136*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3u, subspan.size());
1137*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
1138*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
1139*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
1140*6777b538SAndroid Build Coastguard Worker   }
1141*6777b538SAndroid Build Coastguard Worker }
1142*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,Last)1143*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, Last) {
1144*6777b538SAndroid Build Coastguard Worker   int array[] = {1, 2, 3};
1145*6777b538SAndroid Build Coastguard Worker   span<int> span(array);
1146*6777b538SAndroid Build Coastguard Worker 
1147*6777b538SAndroid Build Coastguard Worker   {
1148*6777b538SAndroid Build Coastguard Worker     auto subspan = span.last(0u);
1149*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 3, subspan.data());
1150*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
1151*6777b538SAndroid Build Coastguard Worker   }
1152*6777b538SAndroid Build Coastguard Worker 
1153*6777b538SAndroid Build Coastguard Worker   {
1154*6777b538SAndroid Build Coastguard Worker     auto subspan = span.last(1u);
1155*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
1156*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
1157*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[0]);
1158*6777b538SAndroid Build Coastguard Worker   }
1159*6777b538SAndroid Build Coastguard Worker 
1160*6777b538SAndroid Build Coastguard Worker   {
1161*6777b538SAndroid Build Coastguard Worker     auto subspan = span.last(2u);
1162*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
1163*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
1164*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
1165*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[1]);
1166*6777b538SAndroid Build Coastguard Worker   }
1167*6777b538SAndroid Build Coastguard Worker 
1168*6777b538SAndroid Build Coastguard Worker   {
1169*6777b538SAndroid Build Coastguard Worker     auto subspan = span.last(3u);
1170*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
1171*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3u, subspan.size());
1172*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
1173*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
1174*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
1175*6777b538SAndroid Build Coastguard Worker   }
1176*6777b538SAndroid Build Coastguard Worker }
1177*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,Subspan)1178*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, Subspan) {
1179*6777b538SAndroid Build Coastguard Worker   int array[] = {1, 2, 3};
1180*6777b538SAndroid Build Coastguard Worker   span<int> span(array);
1181*6777b538SAndroid Build Coastguard Worker 
1182*6777b538SAndroid Build Coastguard Worker   {
1183*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan(0);
1184*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
1185*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3u, subspan.size());
1186*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
1187*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
1188*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
1189*6777b538SAndroid Build Coastguard Worker   }
1190*6777b538SAndroid Build Coastguard Worker 
1191*6777b538SAndroid Build Coastguard Worker   {
1192*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan(1);
1193*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
1194*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
1195*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
1196*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[1]);
1197*6777b538SAndroid Build Coastguard Worker   }
1198*6777b538SAndroid Build Coastguard Worker 
1199*6777b538SAndroid Build Coastguard Worker   {
1200*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan(2);
1201*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
1202*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
1203*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[0]);
1204*6777b538SAndroid Build Coastguard Worker   }
1205*6777b538SAndroid Build Coastguard Worker 
1206*6777b538SAndroid Build Coastguard Worker   {
1207*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan(3);
1208*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 3, subspan.data());
1209*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
1210*6777b538SAndroid Build Coastguard Worker   }
1211*6777b538SAndroid Build Coastguard Worker 
1212*6777b538SAndroid Build Coastguard Worker   {
1213*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan(0, 0);
1214*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
1215*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
1216*6777b538SAndroid Build Coastguard Worker   }
1217*6777b538SAndroid Build Coastguard Worker 
1218*6777b538SAndroid Build Coastguard Worker   {
1219*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan(1, 0);
1220*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
1221*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
1222*6777b538SAndroid Build Coastguard Worker   }
1223*6777b538SAndroid Build Coastguard Worker 
1224*6777b538SAndroid Build Coastguard Worker   {
1225*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan(2, 0);
1226*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
1227*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
1228*6777b538SAndroid Build Coastguard Worker   }
1229*6777b538SAndroid Build Coastguard Worker 
1230*6777b538SAndroid Build Coastguard Worker   {
1231*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan(0, 1);
1232*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
1233*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
1234*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
1235*6777b538SAndroid Build Coastguard Worker   }
1236*6777b538SAndroid Build Coastguard Worker 
1237*6777b538SAndroid Build Coastguard Worker   {
1238*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan(1, 1);
1239*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
1240*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
1241*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
1242*6777b538SAndroid Build Coastguard Worker   }
1243*6777b538SAndroid Build Coastguard Worker 
1244*6777b538SAndroid Build Coastguard Worker   {
1245*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan(2, 1);
1246*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
1247*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
1248*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[0]);
1249*6777b538SAndroid Build Coastguard Worker   }
1250*6777b538SAndroid Build Coastguard Worker 
1251*6777b538SAndroid Build Coastguard Worker   {
1252*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan(0, 2);
1253*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
1254*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
1255*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
1256*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
1257*6777b538SAndroid Build Coastguard Worker   }
1258*6777b538SAndroid Build Coastguard Worker 
1259*6777b538SAndroid Build Coastguard Worker   {
1260*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan(1, 2);
1261*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
1262*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
1263*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
1264*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[1]);
1265*6777b538SAndroid Build Coastguard Worker   }
1266*6777b538SAndroid Build Coastguard Worker 
1267*6777b538SAndroid Build Coastguard Worker   {
1268*6777b538SAndroid Build Coastguard Worker     auto subspan = span.subspan(0, 3);
1269*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
1270*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(span.size(), subspan.size());
1271*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
1272*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
1273*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
1274*6777b538SAndroid Build Coastguard Worker   }
1275*6777b538SAndroid Build Coastguard Worker }
1276*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,Size)1277*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, Size) {
1278*6777b538SAndroid Build Coastguard Worker   {
1279*6777b538SAndroid Build Coastguard Worker     span<int> span;
1280*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(0u, span.size());
1281*6777b538SAndroid Build Coastguard Worker   }
1282*6777b538SAndroid Build Coastguard Worker 
1283*6777b538SAndroid Build Coastguard Worker   {
1284*6777b538SAndroid Build Coastguard Worker     int array[] = {1, 2, 3};
1285*6777b538SAndroid Build Coastguard Worker     span<int> span(array);
1286*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3u, span.size());
1287*6777b538SAndroid Build Coastguard Worker   }
1288*6777b538SAndroid Build Coastguard Worker }
1289*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,SizeBytes)1290*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, SizeBytes) {
1291*6777b538SAndroid Build Coastguard Worker   {
1292*6777b538SAndroid Build Coastguard Worker     span<int> span;
1293*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(0u, span.size_bytes());
1294*6777b538SAndroid Build Coastguard Worker   }
1295*6777b538SAndroid Build Coastguard Worker 
1296*6777b538SAndroid Build Coastguard Worker   {
1297*6777b538SAndroid Build Coastguard Worker     int array[] = {1, 2, 3};
1298*6777b538SAndroid Build Coastguard Worker     span<int> span(array);
1299*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3u * sizeof(int), span.size_bytes());
1300*6777b538SAndroid Build Coastguard Worker   }
1301*6777b538SAndroid Build Coastguard Worker }
1302*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,Empty)1303*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, Empty) {
1304*6777b538SAndroid Build Coastguard Worker   {
1305*6777b538SAndroid Build Coastguard Worker     span<int> span;
1306*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(span.empty());
1307*6777b538SAndroid Build Coastguard Worker   }
1308*6777b538SAndroid Build Coastguard Worker 
1309*6777b538SAndroid Build Coastguard Worker   {
1310*6777b538SAndroid Build Coastguard Worker     int array[] = {1, 2, 3};
1311*6777b538SAndroid Build Coastguard Worker     span<int> span(array);
1312*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(span.empty());
1313*6777b538SAndroid Build Coastguard Worker   }
1314*6777b538SAndroid Build Coastguard Worker 
1315*6777b538SAndroid Build Coastguard Worker   {
1316*6777b538SAndroid Build Coastguard Worker     std::vector<int> vector = {1, 2, 3};
1317*6777b538SAndroid Build Coastguard Worker     span<int> s = vector;
1318*6777b538SAndroid Build Coastguard Worker     span<int> span_of_checked_iterators = {s.end(), s.end()};
1319*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(span_of_checked_iterators.empty());
1320*6777b538SAndroid Build Coastguard Worker   }
1321*6777b538SAndroid Build Coastguard Worker }
1322*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,OperatorAt)1323*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, OperatorAt) {
1324*6777b538SAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 6, 1, 8, 0};
1325*6777b538SAndroid Build Coastguard Worker   constexpr span<const int> span(kArray);
1326*6777b538SAndroid Build Coastguard Worker 
1327*6777b538SAndroid Build Coastguard Worker   static_assert(&kArray[0] == &span[0],
1328*6777b538SAndroid Build Coastguard Worker                 "span[0] does not refer to the same element as kArray[0]");
1329*6777b538SAndroid Build Coastguard Worker   static_assert(&kArray[1] == &span[1],
1330*6777b538SAndroid Build Coastguard Worker                 "span[1] does not refer to the same element as kArray[1]");
1331*6777b538SAndroid Build Coastguard Worker   static_assert(&kArray[2] == &span[2],
1332*6777b538SAndroid Build Coastguard Worker                 "span[2] does not refer to the same element as kArray[2]");
1333*6777b538SAndroid Build Coastguard Worker   static_assert(&kArray[3] == &span[3],
1334*6777b538SAndroid Build Coastguard Worker                 "span[3] does not refer to the same element as kArray[3]");
1335*6777b538SAndroid Build Coastguard Worker   static_assert(&kArray[4] == &span[4],
1336*6777b538SAndroid Build Coastguard Worker                 "span[4] does not refer to the same element as kArray[4]");
1337*6777b538SAndroid Build Coastguard Worker }
1338*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,Front)1339*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, Front) {
1340*6777b538SAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 6, 1, 8, 0};
1341*6777b538SAndroid Build Coastguard Worker   constexpr span<const int> span(kArray);
1342*6777b538SAndroid Build Coastguard Worker   static_assert(&kArray[0] == &span.front(),
1343*6777b538SAndroid Build Coastguard Worker                 "span.front() does not refer to the same element as kArray[0]");
1344*6777b538SAndroid Build Coastguard Worker }
1345*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,Back)1346*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, Back) {
1347*6777b538SAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 6, 1, 8, 0};
1348*6777b538SAndroid Build Coastguard Worker   constexpr span<const int> span(kArray);
1349*6777b538SAndroid Build Coastguard Worker   static_assert(&kArray[4] == &span.back(),
1350*6777b538SAndroid Build Coastguard Worker                 "span.back() does not refer to the same element as kArray[4]");
1351*6777b538SAndroid Build Coastguard Worker }
1352*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,Iterator)1353*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, Iterator) {
1354*6777b538SAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 6, 1, 8, 0};
1355*6777b538SAndroid Build Coastguard Worker   constexpr span<const int> span(kArray);
1356*6777b538SAndroid Build Coastguard Worker 
1357*6777b538SAndroid Build Coastguard Worker   std::vector<int> results;
1358*6777b538SAndroid Build Coastguard Worker   for (int i : span) {
1359*6777b538SAndroid Build Coastguard Worker     results.emplace_back(i);
1360*6777b538SAndroid Build Coastguard Worker   }
1361*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(results, ElementsAre(1, 6, 1, 8, 0));
1362*6777b538SAndroid Build Coastguard Worker }
1363*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,ConstexprIterator)1364*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, ConstexprIterator) {
1365*6777b538SAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 6, 1, 8, 0};
1366*6777b538SAndroid Build Coastguard Worker   constexpr span<const int> span(kArray);
1367*6777b538SAndroid Build Coastguard Worker 
1368*6777b538SAndroid Build Coastguard Worker   static_assert(ranges::equal(kArray, span), "");
1369*6777b538SAndroid Build Coastguard Worker   static_assert(1 == span.begin()[0], "");
1370*6777b538SAndroid Build Coastguard Worker   static_assert(1 == *(span.begin() += 0), "");
1371*6777b538SAndroid Build Coastguard Worker   static_assert(6 == *(span.begin() += 1), "");
1372*6777b538SAndroid Build Coastguard Worker 
1373*6777b538SAndroid Build Coastguard Worker   static_assert(1 == *((span.begin() + 1) -= 1), "");
1374*6777b538SAndroid Build Coastguard Worker   static_assert(6 == *((span.begin() + 1) -= 0), "");
1375*6777b538SAndroid Build Coastguard Worker 
1376*6777b538SAndroid Build Coastguard Worker   static_assert(0 + span.begin() == span.begin() + 0);
1377*6777b538SAndroid Build Coastguard Worker   static_assert(1 + span.begin() == span.begin() + 1);
1378*6777b538SAndroid Build Coastguard Worker }
1379*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,ReverseIterator)1380*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, ReverseIterator) {
1381*6777b538SAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 6, 1, 8, 0};
1382*6777b538SAndroid Build Coastguard Worker   constexpr span<const int> span(kArray);
1383*6777b538SAndroid Build Coastguard Worker 
1384*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::equal(Reversed(kArray), Reversed(span)));
1385*6777b538SAndroid Build Coastguard Worker }
1386*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,AsBytes)1387*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, AsBytes) {
1388*6777b538SAndroid Build Coastguard Worker   {
1389*6777b538SAndroid Build Coastguard Worker     constexpr int kArray[] = {2, 3, 5, 7, 11, 13};
1390*6777b538SAndroid Build Coastguard Worker     auto bytes_span = as_bytes(make_span(kArray));
1391*6777b538SAndroid Build Coastguard Worker     static_assert(std::is_same_v<decltype(bytes_span),
1392*6777b538SAndroid Build Coastguard Worker                                  base::span<const uint8_t, sizeof(kArray)>>);
1393*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(reinterpret_cast<const uint8_t*>(kArray), bytes_span.data());
1394*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(sizeof(kArray), bytes_span.size());
1395*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(bytes_span.size(), bytes_span.size_bytes());
1396*6777b538SAndroid Build Coastguard Worker   }
1397*6777b538SAndroid Build Coastguard Worker   {
1398*6777b538SAndroid Build Coastguard Worker     std::vector<int> vec = {1, 1, 2, 3, 5, 8};
1399*6777b538SAndroid Build Coastguard Worker     span<int> mutable_span(vec);
1400*6777b538SAndroid Build Coastguard Worker     auto bytes_span = as_bytes(mutable_span);
1401*6777b538SAndroid Build Coastguard Worker     static_assert(
1402*6777b538SAndroid Build Coastguard Worker         std::is_same_v<decltype(bytes_span), base::span<const uint8_t>>);
1403*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(reinterpret_cast<const uint8_t*>(vec.data()), bytes_span.data());
1404*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(sizeof(int) * vec.size(), bytes_span.size());
1405*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(bytes_span.size(), bytes_span.size_bytes());
1406*6777b538SAndroid Build Coastguard Worker   }
1407*6777b538SAndroid Build Coastguard Worker }
1408*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,AsWritableBytes)1409*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, AsWritableBytes) {
1410*6777b538SAndroid Build Coastguard Worker   std::vector<int> vec = {1, 1, 2, 3, 5, 8};
1411*6777b538SAndroid Build Coastguard Worker   span<int> mutable_span(vec);
1412*6777b538SAndroid Build Coastguard Worker   auto writable_bytes_span = as_writable_bytes(mutable_span);
1413*6777b538SAndroid Build Coastguard Worker   static_assert(
1414*6777b538SAndroid Build Coastguard Worker       std::is_same_v<decltype(writable_bytes_span), base::span<uint8_t>>);
1415*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(reinterpret_cast<uint8_t*>(vec.data()), writable_bytes_span.data());
1416*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(sizeof(int) * vec.size(), writable_bytes_span.size());
1417*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(writable_bytes_span.size(), writable_bytes_span.size_bytes());
1418*6777b538SAndroid Build Coastguard Worker 
1419*6777b538SAndroid Build Coastguard Worker   // Set the first entry of vec by writing through the span.
1420*6777b538SAndroid Build Coastguard Worker   std::fill(writable_bytes_span.data(),
1421*6777b538SAndroid Build Coastguard Worker             writable_bytes_span.data() + sizeof(int), 'a');
1422*6777b538SAndroid Build Coastguard Worker   static_assert(sizeof(int) == 4u);  // Otherwise char literal wrong below.
1423*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ('aaaa', vec[0]);
1424*6777b538SAndroid Build Coastguard Worker }
1425*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,AsChars)1426*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, AsChars) {
1427*6777b538SAndroid Build Coastguard Worker   {
1428*6777b538SAndroid Build Coastguard Worker     constexpr int kArray[] = {2, 3, 5, 7, 11, 13};
1429*6777b538SAndroid Build Coastguard Worker     auto chars_span = as_chars(make_span(kArray));
1430*6777b538SAndroid Build Coastguard Worker     static_assert(std::is_same_v<decltype(chars_span),
1431*6777b538SAndroid Build Coastguard Worker                                  base::span<const char, sizeof(kArray)>>);
1432*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(reinterpret_cast<const char*>(kArray), chars_span.data());
1433*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(sizeof(kArray), chars_span.size());
1434*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(chars_span.size(), chars_span.size_bytes());
1435*6777b538SAndroid Build Coastguard Worker   }
1436*6777b538SAndroid Build Coastguard Worker   {
1437*6777b538SAndroid Build Coastguard Worker     std::vector<int> vec = {1, 1, 2, 3, 5, 8};
1438*6777b538SAndroid Build Coastguard Worker     span<int> mutable_span(vec);
1439*6777b538SAndroid Build Coastguard Worker     auto chars_span = as_chars(mutable_span);
1440*6777b538SAndroid Build Coastguard Worker     static_assert(std::is_same_v<decltype(chars_span), base::span<const char>>);
1441*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(reinterpret_cast<const char*>(vec.data()), chars_span.data());
1442*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(sizeof(int) * vec.size(), chars_span.size());
1443*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(chars_span.size(), chars_span.size_bytes());
1444*6777b538SAndroid Build Coastguard Worker   }
1445*6777b538SAndroid Build Coastguard Worker }
1446*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,AsWritableChars)1447*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, AsWritableChars) {
1448*6777b538SAndroid Build Coastguard Worker   std::vector<int> vec = {1, 1, 2, 3, 5, 8};
1449*6777b538SAndroid Build Coastguard Worker   span<int> mutable_span(vec);
1450*6777b538SAndroid Build Coastguard Worker   auto writable_chars_span = as_writable_chars(mutable_span);
1451*6777b538SAndroid Build Coastguard Worker   static_assert(
1452*6777b538SAndroid Build Coastguard Worker       std::is_same_v<decltype(writable_chars_span), base::span<char>>);
1453*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(reinterpret_cast<char*>(vec.data()), writable_chars_span.data());
1454*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(sizeof(int) * vec.size(), writable_chars_span.size());
1455*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(writable_chars_span.size(), writable_chars_span.size_bytes());
1456*6777b538SAndroid Build Coastguard Worker 
1457*6777b538SAndroid Build Coastguard Worker   // Set the first entry of vec by writing through the span.
1458*6777b538SAndroid Build Coastguard Worker   std::fill(writable_chars_span.data(),
1459*6777b538SAndroid Build Coastguard Worker             writable_chars_span.data() + sizeof(int), 'a');
1460*6777b538SAndroid Build Coastguard Worker   static_assert(sizeof(int) == 4u);  // Otherwise char literal wrong below.
1461*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ('aaaa', vec[0]);
1462*6777b538SAndroid Build Coastguard Worker }
1463*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,AsByteSpan)1464*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, AsByteSpan) {
1465*6777b538SAndroid Build Coastguard Worker   {
1466*6777b538SAndroid Build Coastguard Worker     constexpr int kArray[] = {2, 3, 5, 7, 11, 13};
1467*6777b538SAndroid Build Coastguard Worker     auto byte_span = as_byte_span(kArray);
1468*6777b538SAndroid Build Coastguard Worker     static_assert(std::is_same_v<decltype(byte_span),
1469*6777b538SAndroid Build Coastguard Worker                                  span<const uint8_t, 6u * sizeof(int)>>);
1470*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(byte_span.data(), reinterpret_cast<const uint8_t*>(kArray));
1471*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(byte_span.size(), sizeof(kArray));
1472*6777b538SAndroid Build Coastguard Worker   }
1473*6777b538SAndroid Build Coastguard Worker   {
1474*6777b538SAndroid Build Coastguard Worker     const std::vector<int> kVec({2, 3, 5, 7, 11, 13});
1475*6777b538SAndroid Build Coastguard Worker     auto byte_span = as_byte_span(kVec);
1476*6777b538SAndroid Build Coastguard Worker     static_assert(std::is_same_v<decltype(byte_span), span<const uint8_t>>);
1477*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(byte_span.data(), reinterpret_cast<const uint8_t*>(kVec.data()));
1478*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(byte_span.size(), kVec.size() * sizeof(int));
1479*6777b538SAndroid Build Coastguard Worker   }
1480*6777b538SAndroid Build Coastguard Worker   {
1481*6777b538SAndroid Build Coastguard Worker     int kMutArray[] = {2, 3, 5, 7};
1482*6777b538SAndroid Build Coastguard Worker     auto byte_span = as_byte_span(kMutArray);
1483*6777b538SAndroid Build Coastguard Worker     static_assert(std::is_same_v<decltype(byte_span),
1484*6777b538SAndroid Build Coastguard Worker                                  span<const uint8_t, 4u * sizeof(int)>>);
1485*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(byte_span.data(), reinterpret_cast<const uint8_t*>(kMutArray));
1486*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(byte_span.size(), sizeof(kMutArray));
1487*6777b538SAndroid Build Coastguard Worker   }
1488*6777b538SAndroid Build Coastguard Worker   {
1489*6777b538SAndroid Build Coastguard Worker     std::vector<int> kMutVec({2, 3, 5, 7});
1490*6777b538SAndroid Build Coastguard Worker     auto byte_span = as_byte_span(kMutVec);
1491*6777b538SAndroid Build Coastguard Worker     static_assert(std::is_same_v<decltype(byte_span), span<const uint8_t>>);
1492*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(byte_span.data(),
1493*6777b538SAndroid Build Coastguard Worker               reinterpret_cast<const uint8_t*>(kMutVec.data()));
1494*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(byte_span.size(), kMutVec.size() * sizeof(int));
1495*6777b538SAndroid Build Coastguard Worker   }
1496*6777b538SAndroid Build Coastguard Worker   // Rvalue input.
1497*6777b538SAndroid Build Coastguard Worker   {
1498*6777b538SAndroid Build Coastguard Worker     [](auto byte_span) {
1499*6777b538SAndroid Build Coastguard Worker       static_assert(std::is_same_v<decltype(byte_span),
1500*6777b538SAndroid Build Coastguard Worker                                    span<const uint8_t, 6u * sizeof(int)>>);
1501*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ(byte_span.size(), 6u * sizeof(int));
1502*6777b538SAndroid Build Coastguard Worker       // Little endian puts the low bits in the first byte.
1503*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ(byte_span[0u], 2);
1504*6777b538SAndroid Build Coastguard Worker     }(as_byte_span({2, 3, 5, 7, 11, 13}));
1505*6777b538SAndroid Build Coastguard Worker   }
1506*6777b538SAndroid Build Coastguard Worker }
1507*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,AsWritableByteSpan)1508*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, AsWritableByteSpan) {
1509*6777b538SAndroid Build Coastguard Worker   {
1510*6777b538SAndroid Build Coastguard Worker     int kMutArray[] = {2, 3, 5, 7};
1511*6777b538SAndroid Build Coastguard Worker     auto byte_span = as_writable_byte_span(kMutArray);
1512*6777b538SAndroid Build Coastguard Worker     static_assert(
1513*6777b538SAndroid Build Coastguard Worker         std::is_same_v<decltype(byte_span), span<uint8_t, 4u * sizeof(int)>>);
1514*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(byte_span.data(), reinterpret_cast<uint8_t*>(kMutArray));
1515*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(byte_span.size(), sizeof(kMutArray));
1516*6777b538SAndroid Build Coastguard Worker   }
1517*6777b538SAndroid Build Coastguard Worker   {
1518*6777b538SAndroid Build Coastguard Worker     std::vector<int> kMutVec({2, 3, 5, 7});
1519*6777b538SAndroid Build Coastguard Worker     auto byte_span = as_writable_byte_span(kMutVec);
1520*6777b538SAndroid Build Coastguard Worker     static_assert(std::is_same_v<decltype(byte_span), span<uint8_t>>);
1521*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(byte_span.data(), reinterpret_cast<uint8_t*>(kMutVec.data()));
1522*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(byte_span.size(), kMutVec.size() * sizeof(int));
1523*6777b538SAndroid Build Coastguard Worker   }
1524*6777b538SAndroid Build Coastguard Worker   // Rvalue input.
1525*6777b538SAndroid Build Coastguard Worker   {
1526*6777b538SAndroid Build Coastguard Worker     [](auto byte_span) {
1527*6777b538SAndroid Build Coastguard Worker       static_assert(
1528*6777b538SAndroid Build Coastguard Worker           std::is_same_v<decltype(byte_span), span<uint8_t, 6u * sizeof(int)>>);
1529*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ(byte_span.size(), 6u * sizeof(int));
1530*6777b538SAndroid Build Coastguard Worker       // Little endian puts the low bits in the first byte.
1531*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ(byte_span[0u], 2);
1532*6777b538SAndroid Build Coastguard Worker     }(as_writable_byte_span({2, 3, 5, 7, 11, 13}));
1533*6777b538SAndroid Build Coastguard Worker   }
1534*6777b538SAndroid Build Coastguard Worker }
1535*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,AsStringView)1536*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, AsStringView) {
1537*6777b538SAndroid Build Coastguard Worker   {
1538*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t kArray[] = {'h', 'e', 'l', 'l', 'o'};
1539*6777b538SAndroid Build Coastguard Worker     // Fixed size span.
1540*6777b538SAndroid Build Coastguard Worker     auto s = as_string_view(kArray);
1541*6777b538SAndroid Build Coastguard Worker     static_assert(std::is_same_v<decltype(s), std::string_view>);
1542*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s.data(), reinterpret_cast<const char*>(&kArray[0u]));
1543*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s.size(), std::size(kArray));
1544*6777b538SAndroid Build Coastguard Worker 
1545*6777b538SAndroid Build Coastguard Worker     // Dynamic size span.
1546*6777b538SAndroid Build Coastguard Worker     auto s2 = as_string_view(base::span<const uint8_t>(kArray));
1547*6777b538SAndroid Build Coastguard Worker     static_assert(std::is_same_v<decltype(s2), std::string_view>);
1548*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s2.data(), reinterpret_cast<const char*>(&kArray[0u]));
1549*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s2.size(), std::size(kArray));
1550*6777b538SAndroid Build Coastguard Worker   }
1551*6777b538SAndroid Build Coastguard Worker   {
1552*6777b538SAndroid Build Coastguard Worker     constexpr char kArray[] = {'h', 'e', 'l', 'l', 'o'};
1553*6777b538SAndroid Build Coastguard Worker     // Fixed size span.
1554*6777b538SAndroid Build Coastguard Worker     auto s = as_string_view(kArray);
1555*6777b538SAndroid Build Coastguard Worker     static_assert(std::is_same_v<decltype(s), std::string_view>);
1556*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s.data(), &kArray[0u]);
1557*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s.size(), std::size(kArray));
1558*6777b538SAndroid Build Coastguard Worker 
1559*6777b538SAndroid Build Coastguard Worker     // Dynamic size span.
1560*6777b538SAndroid Build Coastguard Worker     auto s2 = as_string_view(base::span<const char>(kArray));
1561*6777b538SAndroid Build Coastguard Worker     static_assert(std::is_same_v<decltype(s2), std::string_view>);
1562*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s2.data(), &kArray[0u]);
1563*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s2.size(), std::size(kArray));
1564*6777b538SAndroid Build Coastguard Worker   }
1565*6777b538SAndroid Build Coastguard Worker }
1566*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,MakeSpanFromDataAndSize)1567*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromDataAndSize) {
1568*6777b538SAndroid Build Coastguard Worker   int* nullint = nullptr;
1569*6777b538SAndroid Build Coastguard Worker   auto empty_span = make_span(nullint, 0u);
1570*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(empty_span.empty());
1571*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, empty_span.data());
1572*6777b538SAndroid Build Coastguard Worker 
1573*6777b538SAndroid Build Coastguard Worker   std::vector<int> vector = {1, 1, 2, 3, 5, 8};
1574*6777b538SAndroid Build Coastguard Worker   span<int> expected_span(vector.data(), vector.size());
1575*6777b538SAndroid Build Coastguard Worker   auto made_span = make_span(vector.data(), vector.size());
1576*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.data(), made_span.data());
1577*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.size(), made_span.size());
1578*6777b538SAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == dynamic_extent, "");
1579*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(expected_span), decltype(made_span)>,
1580*6777b538SAndroid Build Coastguard Worker                 "the type of made_span differs from expected_span!");
1581*6777b538SAndroid Build Coastguard Worker }
1582*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,MakeSpanFromPointerPair)1583*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromPointerPair) {
1584*6777b538SAndroid Build Coastguard Worker   int* nullint = nullptr;
1585*6777b538SAndroid Build Coastguard Worker   auto empty_span = make_span(nullint, nullint);
1586*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(empty_span.empty());
1587*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, empty_span.data());
1588*6777b538SAndroid Build Coastguard Worker 
1589*6777b538SAndroid Build Coastguard Worker   std::vector<int> vector = {1, 1, 2, 3, 5, 8};
1590*6777b538SAndroid Build Coastguard Worker   span<int> expected_span(vector.data(), vector.size());
1591*6777b538SAndroid Build Coastguard Worker   auto made_span = make_span(vector.data(), vector.data() + vector.size());
1592*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.data(), made_span.data());
1593*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.size(), made_span.size());
1594*6777b538SAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == dynamic_extent, "");
1595*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(expected_span), decltype(made_span)>,
1596*6777b538SAndroid Build Coastguard Worker                 "the type of made_span differs from expected_span!");
1597*6777b538SAndroid Build Coastguard Worker }
1598*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,MakeSpanFromConstexprArray)1599*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromConstexprArray) {
1600*6777b538SAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 2, 3, 4, 5};
1601*6777b538SAndroid Build Coastguard Worker   constexpr span<const int, 5> expected_span(kArray);
1602*6777b538SAndroid Build Coastguard Worker   constexpr auto made_span = make_span(kArray);
1603*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.data(), made_span.data());
1604*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.size(), made_span.size());
1605*6777b538SAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == 5, "");
1606*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(expected_span), decltype(made_span)>,
1607*6777b538SAndroid Build Coastguard Worker                 "the type of made_span differs from expected_span!");
1608*6777b538SAndroid Build Coastguard Worker }
1609*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,MakeSpanFromStdArray)1610*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromStdArray) {
1611*6777b538SAndroid Build Coastguard Worker   const std::array<int, 5> kArray = {{1, 2, 3, 4, 5}};
1612*6777b538SAndroid Build Coastguard Worker   span<const int, 5> expected_span(kArray);
1613*6777b538SAndroid Build Coastguard Worker   auto made_span = make_span(kArray);
1614*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.data(), made_span.data());
1615*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.size(), made_span.size());
1616*6777b538SAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == 5, "");
1617*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(expected_span), decltype(made_span)>,
1618*6777b538SAndroid Build Coastguard Worker                 "the type of made_span differs from expected_span!");
1619*6777b538SAndroid Build Coastguard Worker }
1620*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,MakeSpanFromConstContainer)1621*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromConstContainer) {
1622*6777b538SAndroid Build Coastguard Worker   const std::vector<int> vector = {-1, -2, -3, -4, -5};
1623*6777b538SAndroid Build Coastguard Worker   span<const int> expected_span(vector);
1624*6777b538SAndroid Build Coastguard Worker   auto made_span = make_span(vector);
1625*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.data(), made_span.data());
1626*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.size(), made_span.size());
1627*6777b538SAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == dynamic_extent, "");
1628*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(expected_span), decltype(made_span)>,
1629*6777b538SAndroid Build Coastguard Worker                 "the type of made_span differs from expected_span!");
1630*6777b538SAndroid Build Coastguard Worker }
1631*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,MakeStaticSpanFromConstContainer)1632*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, MakeStaticSpanFromConstContainer) {
1633*6777b538SAndroid Build Coastguard Worker   const std::vector<int> vector = {-1, -2, -3, -4, -5};
1634*6777b538SAndroid Build Coastguard Worker   span<const int, 5> expected_span(vector.data(), vector.size());
1635*6777b538SAndroid Build Coastguard Worker   auto made_span = make_span<5>(vector);
1636*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.data(), made_span.data());
1637*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.size(), made_span.size());
1638*6777b538SAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == 5, "");
1639*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(expected_span), decltype(made_span)>,
1640*6777b538SAndroid Build Coastguard Worker                 "the type of made_span differs from expected_span!");
1641*6777b538SAndroid Build Coastguard Worker }
1642*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,MakeSpanFromContainer)1643*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromContainer) {
1644*6777b538SAndroid Build Coastguard Worker   std::vector<int> vector = {-1, -2, -3, -4, -5};
1645*6777b538SAndroid Build Coastguard Worker   span<int> expected_span(vector);
1646*6777b538SAndroid Build Coastguard Worker   auto made_span = make_span(vector);
1647*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.data(), made_span.data());
1648*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.size(), made_span.size());
1649*6777b538SAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == dynamic_extent, "");
1650*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(expected_span), decltype(made_span)>,
1651*6777b538SAndroid Build Coastguard Worker                 "the type of made_span differs from expected_span!");
1652*6777b538SAndroid Build Coastguard Worker }
1653*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,MakeStaticSpanFromContainer)1654*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, MakeStaticSpanFromContainer) {
1655*6777b538SAndroid Build Coastguard Worker   std::vector<int> vector = {-1, -2, -3, -4, -5};
1656*6777b538SAndroid Build Coastguard Worker   span<int, 5> expected_span(vector.data(), vector.size());
1657*6777b538SAndroid Build Coastguard Worker   auto made_span = make_span<5>(vector);
1658*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.data(), make_span<5>(vector).data());
1659*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.size(), make_span<5>(vector).size());
1660*6777b538SAndroid Build Coastguard Worker   static_assert(decltype(make_span<5>(vector))::extent == 5, "");
1661*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(expected_span), decltype(made_span)>,
1662*6777b538SAndroid Build Coastguard Worker                 "the type of made_span differs from expected_span!");
1663*6777b538SAndroid Build Coastguard Worker }
1664*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,MakeStaticSpanFromConstexprContainer)1665*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, MakeStaticSpanFromConstexprContainer) {
1666*6777b538SAndroid Build Coastguard Worker   constexpr std::string_view str = "Hello, World";
1667*6777b538SAndroid Build Coastguard Worker   constexpr auto made_span = make_span<12>(str);
1668*6777b538SAndroid Build Coastguard Worker   static_assert(str.data() == made_span.data(), "Error: data() does not match");
1669*6777b538SAndroid Build Coastguard Worker   static_assert(str.size() == made_span.size(), "Error: size() does not match");
1670*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(str)::value_type,
1671*6777b538SAndroid Build Coastguard Worker                                decltype(made_span)::value_type>,
1672*6777b538SAndroid Build Coastguard Worker                 "Error: value_type does not match");
1673*6777b538SAndroid Build Coastguard Worker   static_assert(str.size() == decltype(made_span)::extent,
1674*6777b538SAndroid Build Coastguard Worker                 "Error: extent does not match");
1675*6777b538SAndroid Build Coastguard Worker }
1676*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,MakeSpanFromRValueContainer)1677*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromRValueContainer) {
1678*6777b538SAndroid Build Coastguard Worker   std::vector<int> vector = {-1, -2, -3, -4, -5};
1679*6777b538SAndroid Build Coastguard Worker   span<const int> expected_span(vector);
1680*6777b538SAndroid Build Coastguard Worker   // Note: While static_cast<T&&>(foo) is effectively just a fancy spelling of
1681*6777b538SAndroid Build Coastguard Worker   // std::move(foo), make_span does not actually take ownership of the passed in
1682*6777b538SAndroid Build Coastguard Worker   // container. Writing it this way makes it more obvious that we simply care
1683*6777b538SAndroid Build Coastguard Worker   // about the right behavour when passing rvalues.
1684*6777b538SAndroid Build Coastguard Worker   auto made_span = make_span(static_cast<std::vector<int>&&>(vector));
1685*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.data(), made_span.data());
1686*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.size(), made_span.size());
1687*6777b538SAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == dynamic_extent, "");
1688*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(expected_span), decltype(made_span)>,
1689*6777b538SAndroid Build Coastguard Worker                 "the type of made_span differs from expected_span!");
1690*6777b538SAndroid Build Coastguard Worker }
1691*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,MakeStaticSpanFromRValueContainer)1692*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, MakeStaticSpanFromRValueContainer) {
1693*6777b538SAndroid Build Coastguard Worker   std::vector<int> vector = {-1, -2, -3, -4, -5};
1694*6777b538SAndroid Build Coastguard Worker   span<const int, 5> expected_span(vector.data(), vector.size());
1695*6777b538SAndroid Build Coastguard Worker   // Note: While static_cast<T&&>(foo) is effectively just a fancy spelling of
1696*6777b538SAndroid Build Coastguard Worker   // std::move(foo), make_span does not actually take ownership of the passed in
1697*6777b538SAndroid Build Coastguard Worker   // container. Writing it this way makes it more obvious that we simply care
1698*6777b538SAndroid Build Coastguard Worker   // about the right behavour when passing rvalues.
1699*6777b538SAndroid Build Coastguard Worker   auto made_span = make_span<5>(static_cast<std::vector<int>&&>(vector));
1700*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.data(), made_span.data());
1701*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.size(), made_span.size());
1702*6777b538SAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == 5, "");
1703*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(expected_span), decltype(made_span)>,
1704*6777b538SAndroid Build Coastguard Worker                 "the type of made_span differs from expected_span!");
1705*6777b538SAndroid Build Coastguard Worker }
1706*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,MakeSpanFromDynamicSpan)1707*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromDynamicSpan) {
1708*6777b538SAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 2, 3, 4, 5};
1709*6777b538SAndroid Build Coastguard Worker   constexpr span<const int> expected_span(kArray);
1710*6777b538SAndroid Build Coastguard Worker   constexpr auto made_span = make_span(expected_span);
1711*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(expected_span)::element_type,
1712*6777b538SAndroid Build Coastguard Worker                                decltype(made_span)::element_type>,
1713*6777b538SAndroid Build Coastguard Worker                 "make_span(span) should have the same element_type as span");
1714*6777b538SAndroid Build Coastguard Worker 
1715*6777b538SAndroid Build Coastguard Worker   static_assert(expected_span.data() == made_span.data(),
1716*6777b538SAndroid Build Coastguard Worker                 "make_span(span) should have the same data() as span");
1717*6777b538SAndroid Build Coastguard Worker 
1718*6777b538SAndroid Build Coastguard Worker   static_assert(expected_span.size() == made_span.size(),
1719*6777b538SAndroid Build Coastguard Worker                 "make_span(span) should have the same size() as span");
1720*6777b538SAndroid Build Coastguard Worker 
1721*6777b538SAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == decltype(expected_span)::extent,
1722*6777b538SAndroid Build Coastguard Worker                 "make_span(span) should have the same extent as span");
1723*6777b538SAndroid Build Coastguard Worker 
1724*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(expected_span), decltype(made_span)>,
1725*6777b538SAndroid Build Coastguard Worker                 "the type of made_span differs from expected_span!");
1726*6777b538SAndroid Build Coastguard Worker }
1727*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,MakeSpanFromStaticSpan)1728*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromStaticSpan) {
1729*6777b538SAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 2, 3, 4, 5};
1730*6777b538SAndroid Build Coastguard Worker   constexpr span<const int, 5> expected_span(kArray);
1731*6777b538SAndroid Build Coastguard Worker   constexpr auto made_span = make_span(expected_span);
1732*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(expected_span)::element_type,
1733*6777b538SAndroid Build Coastguard Worker                                decltype(made_span)::element_type>,
1734*6777b538SAndroid Build Coastguard Worker                 "make_span(span) should have the same element_type as span");
1735*6777b538SAndroid Build Coastguard Worker 
1736*6777b538SAndroid Build Coastguard Worker   static_assert(expected_span.data() == made_span.data(),
1737*6777b538SAndroid Build Coastguard Worker                 "make_span(span) should have the same data() as span");
1738*6777b538SAndroid Build Coastguard Worker 
1739*6777b538SAndroid Build Coastguard Worker   static_assert(expected_span.size() == made_span.size(),
1740*6777b538SAndroid Build Coastguard Worker                 "make_span(span) should have the same size() as span");
1741*6777b538SAndroid Build Coastguard Worker 
1742*6777b538SAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == decltype(expected_span)::extent,
1743*6777b538SAndroid Build Coastguard Worker                 "make_span(span) should have the same extent as span");
1744*6777b538SAndroid Build Coastguard Worker 
1745*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(expected_span), decltype(made_span)>,
1746*6777b538SAndroid Build Coastguard Worker                 "the type of made_span differs from expected_span!");
1747*6777b538SAndroid Build Coastguard Worker }
1748*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,EnsureConstexprGoodness)1749*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, EnsureConstexprGoodness) {
1750*6777b538SAndroid Build Coastguard Worker   static constexpr int kArray[] = {5, 4, 3, 2, 1};
1751*6777b538SAndroid Build Coastguard Worker   constexpr span<const int> constexpr_span(kArray);
1752*6777b538SAndroid Build Coastguard Worker   const size_t size = 2;
1753*6777b538SAndroid Build Coastguard Worker 
1754*6777b538SAndroid Build Coastguard Worker   const size_t start = 1;
1755*6777b538SAndroid Build Coastguard Worker   constexpr span<const int> subspan =
1756*6777b538SAndroid Build Coastguard Worker       constexpr_span.subspan(start, start + size);
1757*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < subspan.size(); ++i) {
1758*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(kArray[start + i], subspan[i]);
1759*6777b538SAndroid Build Coastguard Worker   }
1760*6777b538SAndroid Build Coastguard Worker 
1761*6777b538SAndroid Build Coastguard Worker   constexpr span<const int> firsts = constexpr_span.first(size);
1762*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < firsts.size(); ++i) {
1763*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(kArray[i], firsts[i]);
1764*6777b538SAndroid Build Coastguard Worker   }
1765*6777b538SAndroid Build Coastguard Worker 
1766*6777b538SAndroid Build Coastguard Worker   constexpr span<const int> lasts = constexpr_span.last(size);
1767*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < lasts.size(); ++i) {
1768*6777b538SAndroid Build Coastguard Worker     const size_t j = (std::size(kArray) - size) + i;
1769*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(kArray[j], lasts[i]);
1770*6777b538SAndroid Build Coastguard Worker   }
1771*6777b538SAndroid Build Coastguard Worker 
1772*6777b538SAndroid Build Coastguard Worker   constexpr int item = constexpr_span[size];
1773*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kArray[size], item);
1774*6777b538SAndroid Build Coastguard Worker }
1775*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,OutOfBoundsDeath)1776*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, OutOfBoundsDeath) {
1777*6777b538SAndroid Build Coastguard Worker   constexpr span<int, 0> kEmptySpan;
1778*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kEmptySpan[0], "");
1779*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kEmptySpan.first(1u), "");
1780*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kEmptySpan.last(1u), "");
1781*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kEmptySpan.subspan(1u), "");
1782*6777b538SAndroid Build Coastguard Worker 
1783*6777b538SAndroid Build Coastguard Worker   constexpr span<int> kEmptyDynamicSpan;
1784*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kEmptyDynamicSpan[0], "");
1785*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kEmptyDynamicSpan.front(), "");
1786*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kEmptyDynamicSpan.first(1u), "");
1787*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kEmptyDynamicSpan.last(1u), "");
1788*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kEmptyDynamicSpan.back(), "");
1789*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kEmptyDynamicSpan.subspan(1), "");
1790*6777b538SAndroid Build Coastguard Worker 
1791*6777b538SAndroid Build Coastguard Worker   static constexpr int kArray[] = {0, 1, 2};
1792*6777b538SAndroid Build Coastguard Worker   constexpr span<const int> kNonEmptyDynamicSpan(kArray);
1793*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(3U, kNonEmptyDynamicSpan.size());
1794*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kNonEmptyDynamicSpan[4], "");
1795*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kNonEmptyDynamicSpan.subspan(10), "");
1796*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kNonEmptyDynamicSpan.subspan(1, 7), "");
1797*6777b538SAndroid Build Coastguard Worker 
1798*6777b538SAndroid Build Coastguard Worker   size_t minus_one = static_cast<size_t>(-1);
1799*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kNonEmptyDynamicSpan.subspan(minus_one), "");
1800*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kNonEmptyDynamicSpan.subspan(minus_one, minus_one),
1801*6777b538SAndroid Build Coastguard Worker                             "");
1802*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kNonEmptyDynamicSpan.subspan(minus_one, 1), "");
1803*6777b538SAndroid Build Coastguard Worker 
1804*6777b538SAndroid Build Coastguard Worker   // Span's iterators should be checked. To confirm the crashes come from the
1805*6777b538SAndroid Build Coastguard Worker   // iterator checks and not stray memory accesses, we create spans that are
1806*6777b538SAndroid Build Coastguard Worker   // backed by larger arrays.
1807*6777b538SAndroid Build Coastguard Worker   int array1[] = {1, 2, 3, 4};
1808*6777b538SAndroid Build Coastguard Worker   int array2[] = {1, 2, 3, 4};
1809*6777b538SAndroid Build Coastguard Worker   span<int> span_len2 = span(array1).first(2u);
1810*6777b538SAndroid Build Coastguard Worker   span<int> span_len3 = span(array2).first(3u);
1811*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(*span_len2.end(), "");
1812*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(span_len2.begin()[2], "");
1813*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(span_len2.begin() + 3, "");
1814*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(span_len2.begin() - 1, "");
1815*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(span_len2.end() + 1, "");
1816*6777b538SAndroid Build Coastguard Worker 
1817*6777b538SAndroid Build Coastguard Worker   // When STL functions take explicit end iterators, bounds checking happens
1818*6777b538SAndroid Build Coastguard Worker   // at the caller, when end iterator is created. However, some APIs take only a
1819*6777b538SAndroid Build Coastguard Worker   // begin iterator and determine end implicitly. In that case, bounds checking
1820*6777b538SAndroid Build Coastguard Worker   // happens inside the STL. However, the STL sometimes specializes operations
1821*6777b538SAndroid Build Coastguard Worker   // on contiguous iterators. These death ensures this specialization does not
1822*6777b538SAndroid Build Coastguard Worker   // lose hardening.
1823*6777b538SAndroid Build Coastguard Worker   //
1824*6777b538SAndroid Build Coastguard Worker   // Note that these tests are necessary, but not sufficient, to demonstrate
1825*6777b538SAndroid Build Coastguard Worker   // that iterators are suitably checked. The output iterator is currently
1826*6777b538SAndroid Build Coastguard Worker   // checked too late due to https://crbug.com/1520041.
1827*6777b538SAndroid Build Coastguard Worker 
1828*6777b538SAndroid Build Coastguard Worker   // Copying more values than fit in the destination.
1829*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(
1830*6777b538SAndroid Build Coastguard Worker       std::copy(span_len3.begin(), span_len3.end(), span_len2.begin()), "");
1831*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(std::ranges::copy(span_len3, span_len2.begin()),
1832*6777b538SAndroid Build Coastguard Worker                             "");
1833*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(
1834*6777b538SAndroid Build Coastguard Worker       std::copy_n(span_len3.begin(), 3, span_len2.begin()), "");
1835*6777b538SAndroid Build Coastguard Worker 
1836*6777b538SAndroid Build Coastguard Worker   // Copying more values than exist in the source.
1837*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(
1838*6777b538SAndroid Build Coastguard Worker       std::copy_n(span_len2.begin(), 3, span_len3.begin()), "");
1839*6777b538SAndroid Build Coastguard Worker }
1840*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,IteratorIsRangeMoveSafe)1841*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, IteratorIsRangeMoveSafe) {
1842*6777b538SAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 6, 1, 8, 0};
1843*6777b538SAndroid Build Coastguard Worker   const size_t kNumElements = 5;
1844*6777b538SAndroid Build Coastguard Worker   constexpr span<const int> span(kArray);
1845*6777b538SAndroid Build Coastguard Worker 
1846*6777b538SAndroid Build Coastguard Worker   static constexpr int kOverlappingStartIndexes[] = {-4, 0, 3, 4};
1847*6777b538SAndroid Build Coastguard Worker   static constexpr int kNonOverlappingStartIndexes[] = {-7, -5, 5, 7};
1848*6777b538SAndroid Build Coastguard Worker 
1849*6777b538SAndroid Build Coastguard Worker   // Overlapping ranges.
1850*6777b538SAndroid Build Coastguard Worker   for (const int dest_start_index : kOverlappingStartIndexes) {
1851*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(CheckedContiguousIterator<const int>::IsRangeMoveSafe(
1852*6777b538SAndroid Build Coastguard Worker         span.begin(), span.end(),
1853*6777b538SAndroid Build Coastguard Worker         CheckedContiguousIterator<const int>(
1854*6777b538SAndroid Build Coastguard Worker             span.data() + dest_start_index,
1855*6777b538SAndroid Build Coastguard Worker             span.data() + dest_start_index + kNumElements)));
1856*6777b538SAndroid Build Coastguard Worker   }
1857*6777b538SAndroid Build Coastguard Worker 
1858*6777b538SAndroid Build Coastguard Worker   // Non-overlapping ranges.
1859*6777b538SAndroid Build Coastguard Worker   for (const int dest_start_index : kNonOverlappingStartIndexes) {
1860*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(CheckedContiguousIterator<const int>::IsRangeMoveSafe(
1861*6777b538SAndroid Build Coastguard Worker         span.begin(), span.end(),
1862*6777b538SAndroid Build Coastguard Worker         CheckedContiguousIterator<const int>(
1863*6777b538SAndroid Build Coastguard Worker             span.data() + dest_start_index,
1864*6777b538SAndroid Build Coastguard Worker             span.data() + dest_start_index + kNumElements)));
1865*6777b538SAndroid Build Coastguard Worker   }
1866*6777b538SAndroid Build Coastguard Worker 
1867*6777b538SAndroid Build Coastguard Worker   // IsRangeMoveSafe is true if the length to be moved is 0.
1868*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(CheckedContiguousIterator<const int>::IsRangeMoveSafe(
1869*6777b538SAndroid Build Coastguard Worker       span.begin(), span.begin(),
1870*6777b538SAndroid Build Coastguard Worker       CheckedContiguousIterator<const int>(span.data(), span.data())));
1871*6777b538SAndroid Build Coastguard Worker 
1872*6777b538SAndroid Build Coastguard Worker   // IsRangeMoveSafe is false if end < begin.
1873*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(CheckedContiguousIterator<const int>::IsRangeMoveSafe(
1874*6777b538SAndroid Build Coastguard Worker       span.end(), span.begin(),
1875*6777b538SAndroid Build Coastguard Worker       CheckedContiguousIterator<const int>(span.data(), span.data())));
1876*6777b538SAndroid Build Coastguard Worker }
1877*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,Sort)1878*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, Sort) {
1879*6777b538SAndroid Build Coastguard Worker   int array[] = {5, 4, 3, 2, 1};
1880*6777b538SAndroid Build Coastguard Worker 
1881*6777b538SAndroid Build Coastguard Worker   span<int> dynamic_span = array;
1882*6777b538SAndroid Build Coastguard Worker   ranges::sort(dynamic_span);
1883*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(array, ElementsAre(1, 2, 3, 4, 5));
1884*6777b538SAndroid Build Coastguard Worker   std::sort(dynamic_span.rbegin(), dynamic_span.rend());
1885*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(array, ElementsAre(5, 4, 3, 2, 1));
1886*6777b538SAndroid Build Coastguard Worker 
1887*6777b538SAndroid Build Coastguard Worker   span<int, 5> static_span = array;
1888*6777b538SAndroid Build Coastguard Worker   std::sort(static_span.rbegin(), static_span.rend(), std::greater<>());
1889*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(array, ElementsAre(1, 2, 3, 4, 5));
1890*6777b538SAndroid Build Coastguard Worker   ranges::sort(static_span, std::greater<>());
1891*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(array, ElementsAre(5, 4, 3, 2, 1));
1892*6777b538SAndroid Build Coastguard Worker }
1893*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,SpanExtentConversions)1894*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, SpanExtentConversions) {
1895*6777b538SAndroid Build Coastguard Worker   // Statically checks that various conversions between spans of dynamic and
1896*6777b538SAndroid Build Coastguard Worker   // static extent are possible or not.
1897*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_constructible_v<span<int, 0>, span<int>>,
1898*6777b538SAndroid Build Coastguard Worker                 "Error: static span should be constructible from dynamic span");
1899*6777b538SAndroid Build Coastguard Worker 
1900*6777b538SAndroid Build Coastguard Worker   static_assert(
1901*6777b538SAndroid Build Coastguard Worker       !std::is_convertible_v<span<int>, span<int, 0>>,
1902*6777b538SAndroid Build Coastguard Worker       "Error: static span should not be convertible from dynamic span");
1903*6777b538SAndroid Build Coastguard Worker 
1904*6777b538SAndroid Build Coastguard Worker   static_assert(!std::is_constructible_v<span<int, 2>, span<int, 1>>,
1905*6777b538SAndroid Build Coastguard Worker                 "Error: static span should not be constructible from static "
1906*6777b538SAndroid Build Coastguard Worker                 "span with different extent");
1907*6777b538SAndroid Build Coastguard Worker 
1908*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_convertible_v<span<int, 0>, span<int>>,
1909*6777b538SAndroid Build Coastguard Worker                 "Error: static span should be convertible to dynamic span");
1910*6777b538SAndroid Build Coastguard Worker 
1911*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_convertible_v<span<int>, span<int>>,
1912*6777b538SAndroid Build Coastguard Worker                 "Error: dynamic span should be convertible to dynamic span");
1913*6777b538SAndroid Build Coastguard Worker 
1914*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_convertible_v<span<int, 2>, span<int, 2>>,
1915*6777b538SAndroid Build Coastguard Worker                 "Error: static span should be convertible to static span");
1916*6777b538SAndroid Build Coastguard Worker }
1917*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,IteratorConversions)1918*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, IteratorConversions) {
1919*6777b538SAndroid Build Coastguard Worker   static_assert(
1920*6777b538SAndroid Build Coastguard Worker       std::is_convertible_v<span<int>::iterator, span<const int>::iterator>,
1921*6777b538SAndroid Build Coastguard Worker       "Error: iterator should be convertible to const iterator");
1922*6777b538SAndroid Build Coastguard Worker 
1923*6777b538SAndroid Build Coastguard Worker   static_assert(
1924*6777b538SAndroid Build Coastguard Worker       !std::is_convertible_v<span<const int>::iterator, span<int>::iterator>,
1925*6777b538SAndroid Build Coastguard Worker       "Error: const iterator should not be convertible to iterator");
1926*6777b538SAndroid Build Coastguard Worker }
1927*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,ExtentMacro)1928*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, ExtentMacro) {
1929*6777b538SAndroid Build Coastguard Worker   constexpr size_t kSize = 10;
1930*6777b538SAndroid Build Coastguard Worker   std::array<uint8_t, kSize> array;
1931*6777b538SAndroid Build Coastguard Worker   static_assert(EXTENT(array) == kSize, "EXTENT broken");
1932*6777b538SAndroid Build Coastguard Worker 
1933*6777b538SAndroid Build Coastguard Worker   const std::array<uint8_t, kSize>& reference = array;
1934*6777b538SAndroid Build Coastguard Worker   static_assert(EXTENT(reference) == kSize, "EXTENT broken for references");
1935*6777b538SAndroid Build Coastguard Worker 
1936*6777b538SAndroid Build Coastguard Worker   const std::array<uint8_t, kSize>* pointer = nullptr;
1937*6777b538SAndroid Build Coastguard Worker   static_assert(EXTENT(*pointer) == kSize, "EXTENT broken for pointers");
1938*6777b538SAndroid Build Coastguard Worker 
1939*6777b538SAndroid Build Coastguard Worker   uint8_t plain_array[kSize] = {0};
1940*6777b538SAndroid Build Coastguard Worker   static_assert(EXTENT(plain_array) == kSize, "EXTENT broken for plain arrays");
1941*6777b538SAndroid Build Coastguard Worker }
1942*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,CopyFrom)1943*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, CopyFrom) {
1944*6777b538SAndroid Build Coastguard Worker   int arr[] = {1, 2, 3};
1945*6777b538SAndroid Build Coastguard Worker   span<int, 0> empty_static_span;
1946*6777b538SAndroid Build Coastguard Worker   span<int, 3> static_span = base::make_span(arr);
1947*6777b538SAndroid Build Coastguard Worker 
1948*6777b538SAndroid Build Coastguard Worker   std::vector<int> vec = {4, 5, 6};
1949*6777b538SAndroid Build Coastguard Worker   span<int> empty_dynamic_span;
1950*6777b538SAndroid Build Coastguard Worker   span<int> dynamic_span = base::make_span(vec);
1951*6777b538SAndroid Build Coastguard Worker 
1952*6777b538SAndroid Build Coastguard Worker   // Handle empty cases gracefully.
1953*6777b538SAndroid Build Coastguard Worker   // Dynamic size to static size requires an explicit conversion.
1954*6777b538SAndroid Build Coastguard Worker   empty_static_span.copy_from(make_span<0u>(empty_dynamic_span));
1955*6777b538SAndroid Build Coastguard Worker   empty_dynamic_span.copy_from(empty_static_span);
1956*6777b538SAndroid Build Coastguard Worker   static_span.first(empty_static_span.size()).copy_from(empty_static_span);
1957*6777b538SAndroid Build Coastguard Worker   dynamic_span.first(empty_dynamic_span.size()).copy_from(empty_dynamic_span);
1958*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(arr, ElementsAre(1, 2, 3));
1959*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(vec, ElementsAre(4, 5, 6));
1960*6777b538SAndroid Build Coastguard Worker 
1961*6777b538SAndroid Build Coastguard Worker   // Test too small destinations.
1962*6777b538SAndroid Build Coastguard Worker   EXPECT_DEATH_IF_SUPPORTED(empty_dynamic_span.copy_from(static_span), "");
1963*6777b538SAndroid Build Coastguard Worker   EXPECT_DEATH_IF_SUPPORTED(empty_dynamic_span.copy_from(dynamic_span), "");
1964*6777b538SAndroid Build Coastguard Worker   EXPECT_DEATH_IF_SUPPORTED(dynamic_span.last(2u).copy_from(static_span), "");
1965*6777b538SAndroid Build Coastguard Worker 
1966*6777b538SAndroid Build Coastguard Worker   std::vector<int> source = {7, 8, 9};
1967*6777b538SAndroid Build Coastguard Worker 
1968*6777b538SAndroid Build Coastguard Worker   static_span.first(2u).copy_from(span(source).last(2u));
1969*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(arr, ElementsAre(8, 9, 3));
1970*6777b538SAndroid Build Coastguard Worker 
1971*6777b538SAndroid Build Coastguard Worker   dynamic_span.first(2u).copy_from(span(source).last(2u));
1972*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(vec, ElementsAre(8, 9, 6));
1973*6777b538SAndroid Build Coastguard Worker 
1974*6777b538SAndroid Build Coastguard Worker   static_span.first(1u).copy_from(span(source).last(1u));
1975*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(arr, ElementsAre(9, 9, 3));
1976*6777b538SAndroid Build Coastguard Worker 
1977*6777b538SAndroid Build Coastguard Worker   dynamic_span.first(1u).copy_from(span(source).last(1u));
1978*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(vec, ElementsAre(9, 9, 6));
1979*6777b538SAndroid Build Coastguard Worker }
1980*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,CopyFromConversion)1981*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, CopyFromConversion) {
1982*6777b538SAndroid Build Coastguard Worker   int arr[] = {1, 2, 3};
1983*6777b538SAndroid Build Coastguard Worker   span<int, 3> static_span = base::make_span(arr);
1984*6777b538SAndroid Build Coastguard Worker 
1985*6777b538SAndroid Build Coastguard Worker   std::vector<int> vec = {4, 5, 6};
1986*6777b538SAndroid Build Coastguard Worker   span<int> dynamic_span = base::make_span(vec);
1987*6777b538SAndroid Build Coastguard Worker 
1988*6777b538SAndroid Build Coastguard Worker   std::vector convert_from = {7, 8, 9};
1989*6777b538SAndroid Build Coastguard Worker   // Dynamic size to static size requires an explicit conversion.
1990*6777b538SAndroid Build Coastguard Worker   static_span.copy_from(make_span<3u>(convert_from));
1991*6777b538SAndroid Build Coastguard Worker   dynamic_span.copy_from(convert_from);
1992*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(static_span, ElementsAre(7, 8, 9));
1993*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(dynamic_span, ElementsAre(7, 8, 9));
1994*6777b538SAndroid Build Coastguard Worker 
1995*6777b538SAndroid Build Coastguard Worker   std::array<int, 3u> convert_from_fixed = {4, 5, 6};
1996*6777b538SAndroid Build Coastguard Worker   static_span.copy_from(convert_from_fixed);
1997*6777b538SAndroid Build Coastguard Worker   dynamic_span.copy_from(convert_from_fixed);
1998*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(static_span, ElementsAre(4, 5, 6));
1999*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(dynamic_span, ElementsAre(4, 5, 6));
2000*6777b538SAndroid Build Coastguard Worker 
2001*6777b538SAndroid Build Coastguard Worker   int convert_from_array[] = {1, 2, 3};
2002*6777b538SAndroid Build Coastguard Worker   static_span.copy_from(convert_from_array);
2003*6777b538SAndroid Build Coastguard Worker   dynamic_span.copy_from(convert_from_array);
2004*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(static_span, ElementsAre(1, 2, 3));
2005*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(dynamic_span, ElementsAre(1, 2, 3));
2006*6777b538SAndroid Build Coastguard Worker 
2007*6777b538SAndroid Build Coastguard Worker   int convert_from_const_array[] = {-1, -2, -3};
2008*6777b538SAndroid Build Coastguard Worker   static_span.copy_from(convert_from_const_array);
2009*6777b538SAndroid Build Coastguard Worker   dynamic_span.copy_from(convert_from_const_array);
2010*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(static_span, ElementsAre(-1, -2, -3));
2011*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(dynamic_span, ElementsAre(-1, -2, -3));
2012*6777b538SAndroid Build Coastguard Worker }
2013*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,SplitAt)2014*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, SplitAt) {
2015*6777b538SAndroid Build Coastguard Worker   int arr[] = {1, 2, 3};
2016*6777b538SAndroid Build Coastguard Worker   span<int, 0> empty_static_span;
2017*6777b538SAndroid Build Coastguard Worker   span<int, 3> static_span = base::make_span(arr);
2018*6777b538SAndroid Build Coastguard Worker 
2019*6777b538SAndroid Build Coastguard Worker   std::vector<int> vec = {4, 5, 6};
2020*6777b538SAndroid Build Coastguard Worker   span<int> empty_dynamic_span;
2021*6777b538SAndroid Build Coastguard Worker   span<int> dynamic_span = base::make_span(vec);
2022*6777b538SAndroid Build Coastguard Worker 
2023*6777b538SAndroid Build Coastguard Worker   {
2024*6777b538SAndroid Build Coastguard Worker     auto [left, right] = empty_static_span.split_at(0u);
2025*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(left.size(), 0u);
2026*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(right.size(), 0u);
2027*6777b538SAndroid Build Coastguard Worker   }
2028*6777b538SAndroid Build Coastguard Worker   {
2029*6777b538SAndroid Build Coastguard Worker     auto [left, right] = empty_dynamic_span.split_at(0u);
2030*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(left.size(), 0u);
2031*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(right.size(), 0u);
2032*6777b538SAndroid Build Coastguard Worker   }
2033*6777b538SAndroid Build Coastguard Worker 
2034*6777b538SAndroid Build Coastguard Worker   {
2035*6777b538SAndroid Build Coastguard Worker     auto [left, right] = static_span.split_at(0u);
2036*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(left.size(), 0u);
2037*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(right.size(), 3u);
2038*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(right.front(), 1);
2039*6777b538SAndroid Build Coastguard Worker   }
2040*6777b538SAndroid Build Coastguard Worker   {
2041*6777b538SAndroid Build Coastguard Worker     auto [left, right] = static_span.split_at(3u);
2042*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(left.size(), 3u);
2043*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(right.size(), 0u);
2044*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(left.front(), 1);
2045*6777b538SAndroid Build Coastguard Worker   }
2046*6777b538SAndroid Build Coastguard Worker   {
2047*6777b538SAndroid Build Coastguard Worker     auto [left, right] = static_span.split_at(1u);
2048*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(left.size(), 1u);
2049*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(right.size(), 2u);
2050*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(left.front(), 1);
2051*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(right.front(), 2);
2052*6777b538SAndroid Build Coastguard Worker   }
2053*6777b538SAndroid Build Coastguard Worker 
2054*6777b538SAndroid Build Coastguard Worker   {
2055*6777b538SAndroid Build Coastguard Worker     auto [left, right] = dynamic_span.split_at(0u);
2056*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(left.size(), 0u);
2057*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(right.size(), 3u);
2058*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(right.front(), 4);
2059*6777b538SAndroid Build Coastguard Worker   }
2060*6777b538SAndroid Build Coastguard Worker   {
2061*6777b538SAndroid Build Coastguard Worker     auto [left, right] = dynamic_span.split_at(3u);
2062*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(left.size(), 3u);
2063*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(right.size(), 0u);
2064*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(left.front(), 4);
2065*6777b538SAndroid Build Coastguard Worker   }
2066*6777b538SAndroid Build Coastguard Worker   {
2067*6777b538SAndroid Build Coastguard Worker     auto [left, right] = dynamic_span.split_at(1u);
2068*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(left.size(), 1u);
2069*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(right.size(), 2u);
2070*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(left.front(), 4);
2071*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(right.front(), 5);
2072*6777b538SAndroid Build Coastguard Worker   }
2073*6777b538SAndroid Build Coastguard Worker 
2074*6777b538SAndroid Build Coastguard Worker   // Fixed-size splits.
2075*6777b538SAndroid Build Coastguard Worker   {
2076*6777b538SAndroid Build Coastguard Worker     auto [left, right] = static_span.split_at<0u>();
2077*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(left), span<int, 0u>>);
2078*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(right), span<int, 3u>>);
2079*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(left.data(), static_span.data());
2080*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(right.data(), static_span.data());
2081*6777b538SAndroid Build Coastguard Worker   }
2082*6777b538SAndroid Build Coastguard Worker   {
2083*6777b538SAndroid Build Coastguard Worker     auto [left, right] = static_span.split_at<1u>();
2084*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(left), span<int, 1u>>);
2085*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(right), span<int, 2u>>);
2086*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(left.data(), static_span.data());
2087*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(right.data(), static_span.data() + 1u);
2088*6777b538SAndroid Build Coastguard Worker   }
2089*6777b538SAndroid Build Coastguard Worker   {
2090*6777b538SAndroid Build Coastguard Worker     auto [left, right] = static_span.split_at<3u>();
2091*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(left), span<int, 3u>>);
2092*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(right), span<int, 0u>>);
2093*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(left.data(), static_span.data());
2094*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(right.data(), static_span.data() + 3u);
2095*6777b538SAndroid Build Coastguard Worker   }
2096*6777b538SAndroid Build Coastguard Worker   {
2097*6777b538SAndroid Build Coastguard Worker     auto [left, right] = dynamic_span.split_at<0u>();
2098*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(left), span<int, 0u>>);
2099*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(right), span<int>>);
2100*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(left.data(), dynamic_span.data());
2101*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(right.data(), dynamic_span.data());
2102*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(right.size(), 3u);
2103*6777b538SAndroid Build Coastguard Worker   }
2104*6777b538SAndroid Build Coastguard Worker   {
2105*6777b538SAndroid Build Coastguard Worker     auto [left, right] = dynamic_span.split_at<1u>();
2106*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(left), span<int, 1u>>);
2107*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(right), span<int>>);
2108*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(left.data(), dynamic_span.data());
2109*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(right.data(), dynamic_span.data() + 1u);
2110*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(right.size(), 2u);
2111*6777b538SAndroid Build Coastguard Worker   }
2112*6777b538SAndroid Build Coastguard Worker   {
2113*6777b538SAndroid Build Coastguard Worker     auto [left, right] = dynamic_span.split_at<3u>();
2114*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(left), span<int, 3u>>);
2115*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(right), span<int>>);
2116*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(left.data(), dynamic_span.data());
2117*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(right.data(), dynamic_span.data() + 3u);
2118*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(right.size(), 0u);
2119*6777b538SAndroid Build Coastguard Worker   }
2120*6777b538SAndroid Build Coastguard Worker   // Invalid fixed-size split from dynamic will fail at runtime.
2121*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK_DEATH({ dynamic_span.split_at<4u>(); });
2122*6777b538SAndroid Build Coastguard Worker }
2123*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,Compare)2124*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, Compare) {
2125*6777b538SAndroid Build Coastguard Worker   static_assert(std::equality_comparable<int>);
2126*6777b538SAndroid Build Coastguard Worker   int32_t arr2[] = {1, 2};
2127*6777b538SAndroid Build Coastguard Worker   int32_t arr3[] = {1, 2, 3};
2128*6777b538SAndroid Build Coastguard Worker   int32_t rra3[] = {3, 2, 1};
2129*6777b538SAndroid Build Coastguard Worker   constexpr const int32_t arr2_c[] = {1, 2};
2130*6777b538SAndroid Build Coastguard Worker   constexpr const int32_t arr3_c[] = {1, 2, 3};
2131*6777b538SAndroid Build Coastguard Worker   constexpr const int32_t rra3_c[] = {3, 2, 1};
2132*6777b538SAndroid Build Coastguard Worker 
2133*6777b538SAndroid Build Coastguard Worker   // Comparing empty spans that are fixed and dynamic size.
2134*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<int32_t>() == span<int32_t>()));
2135*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<int32_t, 0u>() == span<int32_t>()));
2136*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<int32_t>() == span<int32_t, 0u>()));
2137*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<int32_t, 0u>() == span<int32_t, 0u>()));
2138*6777b538SAndroid Build Coastguard Worker   // Non-null data pointer, but both are empty.
2139*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(0u) == span(arr2).last(0u));
2140*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first<0u>() == span(arr2).last<0u>());
2141*6777b538SAndroid Build Coastguard Worker 
2142*6777b538SAndroid Build Coastguard Worker   // Spans of different dynamic sizes.
2143*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) != span(arr3).first(3u));
2144*6777b538SAndroid Build Coastguard Worker   // Spans of same dynamic size and same values.
2145*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) == span(arr3).first(2u));
2146*6777b538SAndroid Build Coastguard Worker   // Spans of same dynamic size but different values.
2147*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) != span(rra3).first(2u));
2148*6777b538SAndroid Build Coastguard Worker 
2149*6777b538SAndroid Build Coastguard Worker   // Spans of different sizes (one dynamic one fixed).
2150*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first<2u>() != span(arr3).first(3u));
2151*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) != span(arr3).first<3u>());
2152*6777b538SAndroid Build Coastguard Worker   // Spans of same size and same values.
2153*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first<2u>() == span(arr3).first(2u));
2154*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) == span(arr3).first<2u>());
2155*6777b538SAndroid Build Coastguard Worker   // Spans of same size but different values.
2156*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first<2u>() != span(rra3).first(2u));
2157*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) != span(rra3).first<2u>());
2158*6777b538SAndroid Build Coastguard Worker 
2159*6777b538SAndroid Build Coastguard Worker   // Spans of different fixed sizes do not compile (as in Rust)
2160*6777b538SAndroid Build Coastguard Worker   // https://godbolt.org/z/MrnbPeozr and are covered in nocompile tests.
2161*6777b538SAndroid Build Coastguard Worker 
2162*6777b538SAndroid Build Coastguard Worker   // Comparing const and non-const. Same tests as above otherwise.
2163*6777b538SAndroid Build Coastguard Worker 
2164*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<const int32_t>() == span<int32_t>()));
2165*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<const int32_t, 0u>() == span<int32_t>()));
2166*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<const int32_t>() == span<int32_t, 0u>()));
2167*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<const int32_t, 0u>() == span<int32_t, 0u>()));
2168*6777b538SAndroid Build Coastguard Worker 
2169*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<int32_t>() == span<const int32_t>()));
2170*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<int32_t, 0u>() == span<const int32_t>()));
2171*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<int32_t>() == span<const int32_t, 0u>()));
2172*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<int32_t, 0u>() == span<const int32_t, 0u>()));
2173*6777b538SAndroid Build Coastguard Worker 
2174*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_c).first(0u) == span(arr2).last(0u));
2175*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_c).first<0u>() == span(arr2).last<0u>());
2176*6777b538SAndroid Build Coastguard Worker 
2177*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(0u) == span(arr2_c).last(0u));
2178*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first<0u>() == span(arr2_c).last<0u>());
2179*6777b538SAndroid Build Coastguard Worker 
2180*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_c).first(2u) != span(arr3).first(3u));
2181*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_c).first(2u) == span(arr3).first(2u));
2182*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_c).first(2u) != span(rra3).first(2u));
2183*6777b538SAndroid Build Coastguard Worker 
2184*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) != span(arr3_c).first(3u));
2185*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) == span(arr3_c).first(2u));
2186*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) != span(rra3_c).first(2u));
2187*6777b538SAndroid Build Coastguard Worker 
2188*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_c).first<2u>() != span(arr3).first(3u));
2189*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_c).first(2u) != span(arr3).first<3u>());
2190*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_c).first<2u>() == span(arr3).first(2u));
2191*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_c).first(2u) == span(arr3).first<2u>());
2192*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_c).first<2u>() != span(rra3).first(2u));
2193*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_c).first(2u) != span(rra3).first<2u>());
2194*6777b538SAndroid Build Coastguard Worker 
2195*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first<2u>() != span(arr3_c).first(3u));
2196*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) != span(arr3_c).first<3u>());
2197*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first<2u>() == span(arr3_c).first(2u));
2198*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) == span(arr3_c).first<2u>());
2199*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first<2u>() != span(rra3_c).first(2u));
2200*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) != span(rra3_c).first<2u>());
2201*6777b538SAndroid Build Coastguard Worker 
2202*6777b538SAndroid Build Coastguard Worker   // Comparing different types which are comparable. Same tests as above
2203*6777b538SAndroid Build Coastguard Worker   // otherwise.
2204*6777b538SAndroid Build Coastguard Worker 
2205*6777b538SAndroid Build Coastguard Worker   static_assert(std::equality_comparable_with<int32_t, int64_t>);
2206*6777b538SAndroid Build Coastguard Worker   int64_t arr2_l[] = {1, 2};
2207*6777b538SAndroid Build Coastguard Worker   int64_t arr3_l[] = {1, 2, 3};
2208*6777b538SAndroid Build Coastguard Worker   int64_t rra3_l[] = {3, 2, 1};
2209*6777b538SAndroid Build Coastguard Worker 
2210*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<int32_t>() == span<int64_t>()));
2211*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<int32_t, 0u>() == span<int64_t>()));
2212*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<int32_t>() == span<int64_t, 0u>()));
2213*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<int32_t, 0u>() == span<int64_t, 0u>()));
2214*6777b538SAndroid Build Coastguard Worker 
2215*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<int32_t>() == span<int64_t>()));
2216*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<int32_t, 0u>() == span<int64_t>()));
2217*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<int32_t>() == span<int64_t, 0u>()));
2218*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<int32_t, 0u>() == span<int64_t, 0u>()));
2219*6777b538SAndroid Build Coastguard Worker 
2220*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_l).first(0u) == span(arr2).last(0u));
2221*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_l).first<0u>() == span(arr2).last<0u>());
2222*6777b538SAndroid Build Coastguard Worker 
2223*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(0u) == span(arr2_l).last(0u));
2224*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first<0u>() == span(arr2_l).last<0u>());
2225*6777b538SAndroid Build Coastguard Worker 
2226*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_l).first(2u) != span(arr3).first(3u));
2227*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_l).first(2u) == span(arr3).first(2u));
2228*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_l).first(2u) != span(rra3).first(2u));
2229*6777b538SAndroid Build Coastguard Worker 
2230*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) != span(arr3_l).first(3u));
2231*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) == span(arr3_l).first(2u));
2232*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) != span(rra3_l).first(2u));
2233*6777b538SAndroid Build Coastguard Worker 
2234*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_l).first<2u>() != span(arr3).first(3u));
2235*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_l).first(2u) != span(arr3).first<3u>());
2236*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_l).first<2u>() == span(arr3).first(2u));
2237*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_l).first(2u) == span(arr3).first<2u>());
2238*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_l).first<2u>() != span(rra3).first(2u));
2239*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_l).first(2u) != span(rra3).first<2u>());
2240*6777b538SAndroid Build Coastguard Worker 
2241*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first<2u>() != span(arr3_l).first(3u));
2242*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) != span(arr3_l).first<3u>());
2243*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first<2u>() == span(arr3_l).first(2u));
2244*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) == span(arr3_l).first<2u>());
2245*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first<2u>() != span(rra3_l).first(2u));
2246*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) != span(rra3_l).first<2u>());
2247*6777b538SAndroid Build Coastguard Worker 
2248*6777b538SAndroid Build Coastguard Worker   // Comparing different types and different const-ness at the same time.
2249*6777b538SAndroid Build Coastguard Worker 
2250*6777b538SAndroid Build Coastguard Worker   constexpr const int64_t arr2_lc[] = {1, 2};
2251*6777b538SAndroid Build Coastguard Worker   constexpr const int64_t arr3_lc[] = {1, 2, 3};
2252*6777b538SAndroid Build Coastguard Worker   constexpr const int64_t rra3_lc[] = {3, 2, 1};
2253*6777b538SAndroid Build Coastguard Worker 
2254*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<const int32_t>() == span<int64_t>()));
2255*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<const int32_t, 0u>() == span<int64_t>()));
2256*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<const int32_t>() == span<int64_t, 0u>()));
2257*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<const int32_t, 0u>() == span<int64_t, 0u>()));
2258*6777b538SAndroid Build Coastguard Worker 
2259*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<int32_t>() == span<const int64_t>()));
2260*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<int32_t, 0u>() == span<const int64_t>()));
2261*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<int32_t>() == span<const int64_t, 0u>()));
2262*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE((span<int32_t, 0u>() == span<const int64_t, 0u>()));
2263*6777b538SAndroid Build Coastguard Worker 
2264*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_lc).first(0u) == span(arr2).last(0u));
2265*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_lc).first<0u>() == span(arr2).last<0u>());
2266*6777b538SAndroid Build Coastguard Worker 
2267*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(0u) == span(arr2_lc).last(0u));
2268*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first<0u>() == span(arr2_lc).last<0u>());
2269*6777b538SAndroid Build Coastguard Worker 
2270*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_lc).first(2u) != span(arr3).first(3u));
2271*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_lc).first(2u) == span(arr3).first(2u));
2272*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_lc).first(2u) != span(rra3).first(2u));
2273*6777b538SAndroid Build Coastguard Worker 
2274*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) != span(arr3_lc).first(3u));
2275*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) == span(arr3_lc).first(2u));
2276*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) != span(rra3_lc).first(2u));
2277*6777b538SAndroid Build Coastguard Worker 
2278*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_lc).first<2u>() != span(arr3).first(3u));
2279*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_lc).first(2u) != span(arr3).first<3u>());
2280*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_lc).first<2u>() == span(arr3).first(2u));
2281*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_lc).first(2u) == span(arr3).first<2u>());
2282*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_lc).first<2u>() != span(rra3).first(2u));
2283*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2_lc).first(2u) != span(rra3).first<2u>());
2284*6777b538SAndroid Build Coastguard Worker 
2285*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first<2u>() != span(arr3_lc).first(3u));
2286*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) != span(arr3_lc).first<3u>());
2287*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first<2u>() == span(arr3_lc).first(2u));
2288*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) == span(arr3_lc).first<2u>());
2289*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first<2u>() != span(rra3_lc).first(2u));
2290*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(span(arr2).first(2u) != span(rra3_lc).first<2u>());
2291*6777b538SAndroid Build Coastguard Worker 
2292*6777b538SAndroid Build Coastguard Worker   // Comparing with an implicit conversion to span. This only works if the span
2293*6777b538SAndroid Build Coastguard Worker   // types actually match (i.e. not for any comparable types) since otherwise
2294*6777b538SAndroid Build Coastguard Worker   // the type can not be deduced. Implicit conversion from mutable to const
2295*6777b538SAndroid Build Coastguard Worker   // can be inferred though.
2296*6777b538SAndroid Build Coastguard Worker 
2297*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(arr2 != span(arr3).first(3u));
2298*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(arr2 == span(arr3).first(2u));
2299*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(arr2 != span(rra3).first(2u));
2300*6777b538SAndroid Build Coastguard Worker 
2301*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(arr2 != span(arr3_c).first(3u));
2302*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(arr2 == span(arr3_c).first(2u));
2303*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(arr2 != span(rra3_c).first(2u));
2304*6777b538SAndroid Build Coastguard Worker 
2305*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(arr2_c != span(arr3).first(3u));
2306*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(arr2_c == span(arr3).first(2u));
2307*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(arr2_c != span(rra3).first(2u));
2308*6777b538SAndroid Build Coastguard Worker 
2309*6777b538SAndroid Build Coastguard Worker   // Constexpr comparison.
2310*6777b538SAndroid Build Coastguard Worker   static_assert(span<int>() == span<int, 0u>());
2311*6777b538SAndroid Build Coastguard Worker   static_assert(span(arr2_c) == span(arr3_c).first(2u));
2312*6777b538SAndroid Build Coastguard Worker   static_assert(span(arr2_c) == span(arr3_lc).first(2u));
2313*6777b538SAndroid Build Coastguard Worker }
2314*6777b538SAndroid Build Coastguard Worker 
2315*6777b538SAndroid Build Coastguard Worker }  // namespace base
2316*6777b538SAndroid Build Coastguard Worker 
2317*6777b538SAndroid Build Coastguard Worker // Test for compatibility with std::span<>, in case some third-party
2318*6777b538SAndroid Build Coastguard Worker // API decides to use it. The size() and data() convention should mean
2319*6777b538SAndroid Build Coastguard Worker // that everyone's spans are compatible with each other.
TEST(SpanTest,FromStdSpan)2320*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, FromStdSpan) {
2321*6777b538SAndroid Build Coastguard Worker   int kData[] = {10, 11, 12};
2322*6777b538SAndroid Build Coastguard Worker   std::span<const int> std_span(kData);
2323*6777b538SAndroid Build Coastguard Worker   std::span<int> mut_std_span(kData);
2324*6777b538SAndroid Build Coastguard Worker   std::span<const int, 3u> fixed_std_span(kData);
2325*6777b538SAndroid Build Coastguard Worker   std::span<int, 3u> mut_fixed_std_span(kData);
2326*6777b538SAndroid Build Coastguard Worker 
2327*6777b538SAndroid Build Coastguard Worker   // Tests *implicit* conversions through assignment construction.
2328*6777b538SAndroid Build Coastguard Worker   {
2329*6777b538SAndroid Build Coastguard Worker     base::span<const int> base_span = std_span;
2330*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(base_span.size(), 3u);
2331*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(base_span.data(), kData);
2332*6777b538SAndroid Build Coastguard Worker   }
2333*6777b538SAndroid Build Coastguard Worker   {
2334*6777b538SAndroid Build Coastguard Worker     base::span<const int> base_span = mut_std_span;
2335*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(base_span.size(), 3u);
2336*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(base_span.data(), kData);
2337*6777b538SAndroid Build Coastguard Worker   }
2338*6777b538SAndroid Build Coastguard Worker   {
2339*6777b538SAndroid Build Coastguard Worker     base::span<const int> base_span = fixed_std_span;
2340*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(base_span.size(), 3u);
2341*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(base_span.data(), kData);
2342*6777b538SAndroid Build Coastguard Worker   }
2343*6777b538SAndroid Build Coastguard Worker   {
2344*6777b538SAndroid Build Coastguard Worker     base::span<const int> base_span = mut_fixed_std_span;
2345*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(base_span.size(), 3u);
2346*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(base_span.data(), kData);
2347*6777b538SAndroid Build Coastguard Worker   }
2348*6777b538SAndroid Build Coastguard Worker 
2349*6777b538SAndroid Build Coastguard Worker   {
2350*6777b538SAndroid Build Coastguard Worker     base::span<const int, 3u> base_span = fixed_std_span;
2351*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(base_span.size(), 3u);
2352*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(base_span.data(), kData);
2353*6777b538SAndroid Build Coastguard Worker   }
2354*6777b538SAndroid Build Coastguard Worker   {
2355*6777b538SAndroid Build Coastguard Worker     base::span<const int, 3u> base_span = mut_fixed_std_span;
2356*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(base_span.size(), 3u);
2357*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(base_span.data(), kData);
2358*6777b538SAndroid Build Coastguard Worker   }
2359*6777b538SAndroid Build Coastguard Worker   {
2360*6777b538SAndroid Build Coastguard Worker     base::span<int, 3u> base_span = mut_fixed_std_span;
2361*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(base_span.size(), 3u);
2362*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(base_span.data(), kData);
2363*6777b538SAndroid Build Coastguard Worker   }
2364*6777b538SAndroid Build Coastguard Worker 
2365*6777b538SAndroid Build Coastguard Worker   {
2366*6777b538SAndroid Build Coastguard Worker     auto base_made_span = base::make_span(std_span);
2367*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(base_made_span.size(), 3u);
2368*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(base_made_span.data(), kData);
2369*6777b538SAndroid Build Coastguard Worker   }
2370*6777b538SAndroid Build Coastguard Worker   {
2371*6777b538SAndroid Build Coastguard Worker     auto base_byte_span = base::as_byte_span(std_span);
2372*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(base_byte_span.size(), sizeof(int) * 3u);
2373*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(base_byte_span.data(), reinterpret_cast<const uint8_t*>(kData));
2374*6777b538SAndroid Build Coastguard Worker   }
2375*6777b538SAndroid Build Coastguard Worker }
2376*6777b538SAndroid Build Coastguard Worker 
TEST(SpanTest,ToStdSpan)2377*6777b538SAndroid Build Coastguard Worker TEST(SpanTest, ToStdSpan) {
2378*6777b538SAndroid Build Coastguard Worker   int kData[] = {10, 11, 12};
2379*6777b538SAndroid Build Coastguard Worker   base::span<const int> base_span(kData);
2380*6777b538SAndroid Build Coastguard Worker   base::span<int> mut_base_span(kData);
2381*6777b538SAndroid Build Coastguard Worker   base::span<const int, 3u> fixed_base_span(kData);
2382*6777b538SAndroid Build Coastguard Worker   base::span<int, 3u> mut_fixed_base_span(kData);
2383*6777b538SAndroid Build Coastguard Worker 
2384*6777b538SAndroid Build Coastguard Worker   // Tests *implicit* conversions through assignment construction.
2385*6777b538SAndroid Build Coastguard Worker   {
2386*6777b538SAndroid Build Coastguard Worker     std::span<const int> std_span = base_span;
2387*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(std_span.size(), 3u);
2388*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(std_span.data(), kData);
2389*6777b538SAndroid Build Coastguard Worker   }
2390*6777b538SAndroid Build Coastguard Worker   {
2391*6777b538SAndroid Build Coastguard Worker     std::span<const int> std_span = mut_base_span;
2392*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(std_span.size(), 3u);
2393*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(std_span.data(), kData);
2394*6777b538SAndroid Build Coastguard Worker   }
2395*6777b538SAndroid Build Coastguard Worker   {
2396*6777b538SAndroid Build Coastguard Worker     std::span<const int> std_span = fixed_base_span;
2397*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(std_span.size(), 3u);
2398*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(std_span.data(), kData);
2399*6777b538SAndroid Build Coastguard Worker   }
2400*6777b538SAndroid Build Coastguard Worker   {
2401*6777b538SAndroid Build Coastguard Worker     std::span<const int> std_span = mut_fixed_base_span;
2402*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(std_span.size(), 3u);
2403*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(std_span.data(), kData);
2404*6777b538SAndroid Build Coastguard Worker   }
2405*6777b538SAndroid Build Coastguard Worker 
2406*6777b538SAndroid Build Coastguard Worker   {
2407*6777b538SAndroid Build Coastguard Worker     std::span<const int, 3u> std_span = fixed_base_span;
2408*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(std_span.size(), 3u);
2409*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(std_span.data(), kData);
2410*6777b538SAndroid Build Coastguard Worker   }
2411*6777b538SAndroid Build Coastguard Worker   {
2412*6777b538SAndroid Build Coastguard Worker     std::span<const int, 3u> std_span = mut_fixed_base_span;
2413*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(std_span.size(), 3u);
2414*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(std_span.data(), kData);
2415*6777b538SAndroid Build Coastguard Worker   }
2416*6777b538SAndroid Build Coastguard Worker   {
2417*6777b538SAndroid Build Coastguard Worker     std::span<int, 3u> std_span = mut_fixed_base_span;
2418*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(std_span.size(), 3u);
2419*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(std_span.data(), kData);
2420*6777b538SAndroid Build Coastguard Worker   }
2421*6777b538SAndroid Build Coastguard Worker 
2422*6777b538SAndroid Build Coastguard Worker   // no make_span() or as_byte_span() in std::span.
2423*6777b538SAndroid Build Coastguard Worker }
2424