xref: /aosp_15_r20/external/pigweed/pw_span/span_test.cc (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker // Copyright 2020 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker //     https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker 
15*61c4878aSAndroid Build Coastguard Worker // This is the base::span unit test from Chromium, with small modifications.
16*61c4878aSAndroid Build Coastguard Worker // Modifications are noted with "Pigweed:" comments.
17*61c4878aSAndroid Build Coastguard Worker //
18*61c4878aSAndroid Build Coastguard Worker // Original file:
19*61c4878aSAndroid Build Coastguard Worker //   https://chromium.googlesource.com/chromium/src/+/ef71f9c29f0dc6eddae474879c4ca5232ca93a6c/base/containers/span_unittest.cc
20*61c4878aSAndroid Build Coastguard Worker //
21*61c4878aSAndroid Build Coastguard Worker // In order to minimize changes from the original, this file does NOT fully
22*61c4878aSAndroid Build Coastguard Worker // adhere to Pigweed's style guide.
23*61c4878aSAndroid Build Coastguard Worker 
24*61c4878aSAndroid Build Coastguard Worker // NOLINTBEGIN(modernize-unary-static-assert)
25*61c4878aSAndroid Build Coastguard Worker 
26*61c4878aSAndroid Build Coastguard Worker #include "pw_span/span.h"
27*61c4878aSAndroid Build Coastguard Worker 
28*61c4878aSAndroid Build Coastguard Worker #include <algorithm>
29*61c4878aSAndroid Build Coastguard Worker #include <cstdint>
30*61c4878aSAndroid Build Coastguard Worker #include <cstring>
31*61c4878aSAndroid Build Coastguard Worker #include <memory>
32*61c4878aSAndroid Build Coastguard Worker #include <string>
33*61c4878aSAndroid Build Coastguard Worker #include <type_traits>
34*61c4878aSAndroid Build Coastguard Worker #include <vector>
35*61c4878aSAndroid Build Coastguard Worker 
36*61c4878aSAndroid Build Coastguard Worker #include "pw_polyfill/standard.h"
37*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
38*61c4878aSAndroid Build Coastguard Worker 
39*61c4878aSAndroid Build Coastguard Worker // Pigweed: gMock matchers are not yet supported.
40*61c4878aSAndroid Build Coastguard Worker #if 0
41*61c4878aSAndroid Build Coastguard Worker using ::testing::ElementsAre;
42*61c4878aSAndroid Build Coastguard Worker using ::testing::Eq;
43*61c4878aSAndroid Build Coastguard Worker using ::testing::Pointwise;
44*61c4878aSAndroid Build Coastguard Worker #endif  // 0
45*61c4878aSAndroid Build Coastguard Worker 
46*61c4878aSAndroid Build Coastguard Worker namespace pw {
47*61c4878aSAndroid Build Coastguard Worker namespace {
48*61c4878aSAndroid Build Coastguard Worker 
49*61c4878aSAndroid Build Coastguard Worker // constexpr implementation of std::equal's 4 argument overload.
50*61c4878aSAndroid Build Coastguard Worker template <class InputIterator1, class InputIterator2>
constexpr_equal(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,InputIterator2 last2)51*61c4878aSAndroid Build Coastguard Worker constexpr bool constexpr_equal(InputIterator1 first1,
52*61c4878aSAndroid Build Coastguard Worker                                InputIterator1 last1,
53*61c4878aSAndroid Build Coastguard Worker                                InputIterator2 first2,
54*61c4878aSAndroid Build Coastguard Worker                                InputIterator2 last2) {
55*61c4878aSAndroid Build Coastguard Worker   for (; first1 != last1 && first2 != last2; ++first1, ++first2) {
56*61c4878aSAndroid Build Coastguard Worker     if (*first1 != *first2)
57*61c4878aSAndroid Build Coastguard Worker       return false;
58*61c4878aSAndroid Build Coastguard Worker   }
59*61c4878aSAndroid Build Coastguard Worker 
60*61c4878aSAndroid Build Coastguard Worker   return first1 == last1 && first2 == last2;
61*61c4878aSAndroid Build Coastguard Worker }
62*61c4878aSAndroid Build Coastguard Worker 
63*61c4878aSAndroid Build Coastguard Worker }  // namespace
64*61c4878aSAndroid Build Coastguard Worker 
65*61c4878aSAndroid Build Coastguard Worker #ifdef __cpp_deduction_guides
66*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,DeductionGuides_MutableArray)67*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, DeductionGuides_MutableArray) {
68*61c4878aSAndroid Build Coastguard Worker   char array[] = {'a', 'b', 'c', 'd', '\0'};
69*61c4878aSAndroid Build Coastguard Worker 
70*61c4878aSAndroid Build Coastguard Worker   auto the_span = span(array);
71*61c4878aSAndroid Build Coastguard Worker   static_assert(the_span.extent == 5u);
72*61c4878aSAndroid Build Coastguard Worker   static_assert(the_span.size() == 5u);
73*61c4878aSAndroid Build Coastguard Worker 
74*61c4878aSAndroid Build Coastguard Worker   the_span[0] = '!';
75*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(the_span.data(), "!bcd");
76*61c4878aSAndroid Build Coastguard Worker }
77*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,DeductionGuides_ConstArray)78*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, DeductionGuides_ConstArray) {
79*61c4878aSAndroid Build Coastguard Worker   static constexpr char array[] = {'a', 'b', 'c', 'd', '\0'};
80*61c4878aSAndroid Build Coastguard Worker 
81*61c4878aSAndroid Build Coastguard Worker   constexpr auto the_span = span(array);
82*61c4878aSAndroid Build Coastguard Worker   static_assert(the_span.extent == 5u);
83*61c4878aSAndroid Build Coastguard Worker   static_assert(the_span.size() == 5u);
84*61c4878aSAndroid Build Coastguard Worker 
85*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(the_span.data(), "abcd");
86*61c4878aSAndroid Build Coastguard Worker }
87*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,DeductionGuides_MutableStdArray)88*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, DeductionGuides_MutableStdArray) {
89*61c4878aSAndroid Build Coastguard Worker   std::array<char, 5> array{'a', 'b', 'c', 'd'};
90*61c4878aSAndroid Build Coastguard Worker 
91*61c4878aSAndroid Build Coastguard Worker   auto the_span = span(array);
92*61c4878aSAndroid Build Coastguard Worker   static_assert(the_span.extent == 5u);
93*61c4878aSAndroid Build Coastguard Worker   static_assert(the_span.size() == 5u);
94*61c4878aSAndroid Build Coastguard Worker 
95*61c4878aSAndroid Build Coastguard Worker   the_span[0] = '?';
96*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(the_span.data(), "?bcd");
97*61c4878aSAndroid Build Coastguard Worker }
98*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,DeductionGuides_ConstStdArray)99*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, DeductionGuides_ConstStdArray) {
100*61c4878aSAndroid Build Coastguard Worker   static constexpr std::array<char, 5> array{'a', 'b', 'c', 'd'};
101*61c4878aSAndroid Build Coastguard Worker 
102*61c4878aSAndroid Build Coastguard Worker   constexpr auto the_span = span(array);
103*61c4878aSAndroid Build Coastguard Worker   static_assert(the_span.extent == 5u);
104*61c4878aSAndroid Build Coastguard Worker   static_assert(the_span.size() == 5u);
105*61c4878aSAndroid Build Coastguard Worker 
106*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(the_span.data(), "abcd");
107*61c4878aSAndroid Build Coastguard Worker }
108*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,DeductionGuides_MutableContainerWithConstElements)109*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, DeductionGuides_MutableContainerWithConstElements) {
110*61c4878aSAndroid Build Coastguard Worker   std::string_view string("Hello");
111*61c4878aSAndroid Build Coastguard Worker   auto the_span = span<const char>(string);
112*61c4878aSAndroid Build Coastguard Worker   static_assert(the_span.extent == dynamic_extent);
113*61c4878aSAndroid Build Coastguard Worker 
114*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ("Hello", the_span.data());
115*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(5u, the_span.size());
116*61c4878aSAndroid Build Coastguard Worker }
117*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,DeductionGuides_MutableContainerWithMutableElements)118*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, DeductionGuides_MutableContainerWithMutableElements) {
119*61c4878aSAndroid Build Coastguard Worker   std::string string("Hello");
120*61c4878aSAndroid Build Coastguard Worker   auto the_span = span(string);
121*61c4878aSAndroid Build Coastguard Worker   static_assert(the_span.extent == dynamic_extent);
122*61c4878aSAndroid Build Coastguard Worker 
123*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(5u, the_span.size());
124*61c4878aSAndroid Build Coastguard Worker   the_span[1] = 'a';
125*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(the_span.data(), string.data());
126*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ("Hallo", the_span.data());
127*61c4878aSAndroid Build Coastguard Worker }
128*61c4878aSAndroid Build Coastguard Worker 
129*61c4878aSAndroid Build Coastguard Worker #endif  // __cpp_deduction_guides
130*61c4878aSAndroid Build Coastguard Worker 
131*61c4878aSAndroid Build Coastguard Worker class MutableStringView {
132*61c4878aSAndroid Build Coastguard Worker  public:
133*61c4878aSAndroid Build Coastguard Worker   using element_type = char;
134*61c4878aSAndroid Build Coastguard Worker   using value_type = char;
135*61c4878aSAndroid Build Coastguard Worker   using size_type = size_t;
136*61c4878aSAndroid Build Coastguard Worker   using difference_type = ptrdiff_t;
137*61c4878aSAndroid Build Coastguard Worker   using pointer = char*;
138*61c4878aSAndroid Build Coastguard Worker   using reference = char&;
139*61c4878aSAndroid Build Coastguard Worker   using iterator = char*;
140*61c4878aSAndroid Build Coastguard Worker   using const_iterator = const char*;
141*61c4878aSAndroid Build Coastguard Worker   using reverse_iterator = std::reverse_iterator<iterator>;
142*61c4878aSAndroid Build Coastguard Worker   using const_reverse_iterator = std::reverse_iterator<const_iterator>;
143*61c4878aSAndroid Build Coastguard Worker 
MutableStringView(char * str)144*61c4878aSAndroid Build Coastguard Worker   MutableStringView(char* str) : data_(str, std::strlen(str)) {}
145*61c4878aSAndroid Build Coastguard Worker 
operator [](size_type index) const146*61c4878aSAndroid Build Coastguard Worker   char& operator[](size_type index) const { return data_[index]; }
data() const147*61c4878aSAndroid Build Coastguard Worker   pointer data() const { return data_.data(); }
size() const148*61c4878aSAndroid Build Coastguard Worker   size_type size() const { return data_.size(); }
begin() const149*61c4878aSAndroid Build Coastguard Worker   iterator begin() const { return data_.data(); }
end() const150*61c4878aSAndroid Build Coastguard Worker   iterator end() const { return data_.data() + size(); }
151*61c4878aSAndroid Build Coastguard Worker 
152*61c4878aSAndroid Build Coastguard Worker  private:
153*61c4878aSAndroid Build Coastguard Worker   span<char> data_;
154*61c4878aSAndroid Build Coastguard Worker };
155*61c4878aSAndroid Build Coastguard Worker 
156*61c4878aSAndroid Build Coastguard Worker #ifdef __cpp_deduction_guides
157*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,DeductionGuides_ConstContainerWithMutableElements)158*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, DeductionGuides_ConstContainerWithMutableElements) {
159*61c4878aSAndroid Build Coastguard Worker   char data[] = "54321";
160*61c4878aSAndroid Build Coastguard Worker   MutableStringView view(data);
161*61c4878aSAndroid Build Coastguard Worker 
162*61c4878aSAndroid Build Coastguard Worker   auto the_span = span(view);
163*61c4878aSAndroid Build Coastguard Worker   static_assert(the_span.extent == dynamic_extent);
164*61c4878aSAndroid Build Coastguard Worker 
165*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(5u, the_span.size());
166*61c4878aSAndroid Build Coastguard Worker   view[2] = '?';
167*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ("54?21", the_span.data());
168*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ("54?21", data);
169*61c4878aSAndroid Build Coastguard Worker }
170*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,DeductionGuides_ConstContainerWithMutableValueType)171*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, DeductionGuides_ConstContainerWithMutableValueType) {
172*61c4878aSAndroid Build Coastguard Worker   const std::string string("Hello");
173*61c4878aSAndroid Build Coastguard Worker   auto the_span = span(string);
174*61c4878aSAndroid Build Coastguard Worker   static_assert(the_span.extent == dynamic_extent);
175*61c4878aSAndroid Build Coastguard Worker 
176*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(5u, the_span.size());
177*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ("Hello", the_span.data());
178*61c4878aSAndroid Build Coastguard Worker }
179*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,DeductionGuides_ConstContainerWithConstElements)180*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, DeductionGuides_ConstContainerWithConstElements) {
181*61c4878aSAndroid Build Coastguard Worker   const std::string_view string("Hello");
182*61c4878aSAndroid Build Coastguard Worker   auto the_span = span(string);
183*61c4878aSAndroid Build Coastguard Worker   static_assert(the_span.extent == dynamic_extent);
184*61c4878aSAndroid Build Coastguard Worker 
185*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(5u, the_span.size());
186*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ("Hello", the_span.data());
187*61c4878aSAndroid Build Coastguard Worker }
188*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,DeductionGuides_FromTemporary_ContainerWithConstElements)189*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, DeductionGuides_FromTemporary_ContainerWithConstElements) {
190*61c4878aSAndroid Build Coastguard Worker   auto the_span = span(std::string_view("Hello"));
191*61c4878aSAndroid Build Coastguard Worker   static_assert(the_span.extent == dynamic_extent);
192*61c4878aSAndroid Build Coastguard Worker 
193*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(5u, the_span.size());
194*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ("Hello", the_span.data());
195*61c4878aSAndroid Build Coastguard Worker }
196*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,DeductionGuides_FromReference)197*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, DeductionGuides_FromReference) {
198*61c4878aSAndroid Build Coastguard Worker   std::array<int, 5> array{1, 3, 5, 7, 9};
199*61c4878aSAndroid Build Coastguard Worker   std::array<int, 5>& array_ref = array;
200*61c4878aSAndroid Build Coastguard Worker 
201*61c4878aSAndroid Build Coastguard Worker   auto the_span = span(array_ref);
202*61c4878aSAndroid Build Coastguard Worker   static_assert(the_span.extent == 5);
203*61c4878aSAndroid Build Coastguard Worker 
204*61c4878aSAndroid Build Coastguard Worker   for (unsigned i = 0; i < array.size(); ++i) {
205*61c4878aSAndroid Build Coastguard Worker     ASSERT_EQ(array[i], the_span[i]);
206*61c4878aSAndroid Build Coastguard Worker   }
207*61c4878aSAndroid Build Coastguard Worker }
208*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,DeductionGuides_FromConstReference)209*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, DeductionGuides_FromConstReference) {
210*61c4878aSAndroid Build Coastguard Worker   std::string_view string = "yo!";
211*61c4878aSAndroid Build Coastguard Worker   const std::string_view string_ref = string;
212*61c4878aSAndroid Build Coastguard Worker 
213*61c4878aSAndroid Build Coastguard Worker   auto the_span = span(string_ref);
214*61c4878aSAndroid Build Coastguard Worker   static_assert(the_span.extent == dynamic_extent);
215*61c4878aSAndroid Build Coastguard Worker 
216*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(string, the_span.data());
217*61c4878aSAndroid Build Coastguard Worker }
218*61c4878aSAndroid Build Coastguard Worker 
219*61c4878aSAndroid Build Coastguard Worker #endif  // __cpp_deduction_guides
220*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,DefaultConstructor)221*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, DefaultConstructor) {
222*61c4878aSAndroid Build Coastguard Worker   span<int> dynamic_span;
223*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dynamic_span.data());
224*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(0u, dynamic_span.size());
225*61c4878aSAndroid Build Coastguard Worker 
226*61c4878aSAndroid Build Coastguard Worker   constexpr span<int, 0> static_span;
227*61c4878aSAndroid Build Coastguard Worker   static_assert(nullptr == static_span.data(), "");
228*61c4878aSAndroid Build Coastguard Worker   static_assert(static_span.empty(), "");
229*61c4878aSAndroid Build Coastguard Worker }
230*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromDataAndSize)231*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromDataAndSize) {
232*61c4878aSAndroid Build Coastguard Worker   constexpr span<int> empty_span(static_cast<int*>(nullptr), 0);
233*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(empty_span.empty());
234*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, empty_span.data());
235*61c4878aSAndroid Build Coastguard Worker 
236*61c4878aSAndroid Build Coastguard Worker   std::vector<int> vector = {1, 1, 2, 3, 5, 8};
237*61c4878aSAndroid Build Coastguard Worker 
238*61c4878aSAndroid Build Coastguard Worker   span<int> dynamic_span(vector.data(), vector.size());
239*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), dynamic_span.data());
240*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), dynamic_span.size());
241*61c4878aSAndroid Build Coastguard Worker 
242*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < dynamic_span.size(); ++i)
243*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], dynamic_span[i]);
244*61c4878aSAndroid Build Coastguard Worker 
245*61c4878aSAndroid Build Coastguard Worker   span<int, 6> static_span(vector.data(), vector.size());
246*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), static_span.data());
247*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), static_span.size());
248*61c4878aSAndroid Build Coastguard Worker 
249*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i)
250*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], static_span[i]);
251*61c4878aSAndroid Build Coastguard Worker }
252*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromPointerPair)253*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromPointerPair) {
254*61c4878aSAndroid Build Coastguard Worker   constexpr span<int> empty_span(static_cast<int*>(nullptr),
255*61c4878aSAndroid Build Coastguard Worker                                  static_cast<int*>(nullptr));
256*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(empty_span.empty());
257*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, empty_span.data());
258*61c4878aSAndroid Build Coastguard Worker 
259*61c4878aSAndroid Build Coastguard Worker   std::vector<int> vector = {1, 1, 2, 3, 5, 8};
260*61c4878aSAndroid Build Coastguard Worker 
261*61c4878aSAndroid Build Coastguard Worker   span<int> dynamic_span(vector.data(), vector.data() + vector.size() / 2);
262*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), dynamic_span.data());
263*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size() / 2, dynamic_span.size());
264*61c4878aSAndroid Build Coastguard Worker 
265*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < dynamic_span.size(); ++i)
266*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], dynamic_span[i]);
267*61c4878aSAndroid Build Coastguard Worker 
268*61c4878aSAndroid Build Coastguard Worker   span<int, 3> static_span(vector.data(), vector.data() + vector.size() / 2);
269*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), static_span.data());
270*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size() / 2, static_span.size());
271*61c4878aSAndroid Build Coastguard Worker 
272*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i)
273*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], static_span[i]);
274*61c4878aSAndroid Build Coastguard Worker }
275*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,AllowedConversionsFromStdArray)276*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, AllowedConversionsFromStdArray) {
277*61c4878aSAndroid Build Coastguard Worker   // In the following assertions we use std::is_convertible_v<From, To>, which
278*61c4878aSAndroid Build Coastguard Worker   // for non-void types is equivalent to checking whether the following
279*61c4878aSAndroid Build Coastguard Worker   // expression is well-formed:
280*61c4878aSAndroid Build Coastguard Worker   //
281*61c4878aSAndroid Build Coastguard Worker   // T obj = std::declval<From>();
282*61c4878aSAndroid Build Coastguard Worker   //
283*61c4878aSAndroid Build Coastguard Worker   // In particular we are checking whether From is implicitly convertible to To,
284*61c4878aSAndroid Build Coastguard Worker   // which also implies that To is explicitly constructible from From.
285*61c4878aSAndroid Build Coastguard Worker   static_assert(
286*61c4878aSAndroid Build Coastguard Worker       std::is_convertible<std::array<int, 3>&, span<int>>::value,
287*61c4878aSAndroid Build Coastguard Worker       "Error: l-value reference to std::array<int> should be convertible to "
288*61c4878aSAndroid Build Coastguard Worker       "span<int> with dynamic extent.");
289*61c4878aSAndroid Build Coastguard Worker   static_assert(
290*61c4878aSAndroid Build Coastguard Worker       std::is_convertible<std::array<int, 3>&, span<int, 3>>::value,
291*61c4878aSAndroid Build Coastguard Worker       "Error: l-value reference to std::array<int> should be convertible to "
292*61c4878aSAndroid Build Coastguard Worker       "span<int> with the same static extent.");
293*61c4878aSAndroid Build Coastguard Worker   static_assert(
294*61c4878aSAndroid Build Coastguard Worker       std::is_convertible<std::array<int, 3>&, span<const int>>::value,
295*61c4878aSAndroid Build Coastguard Worker       "Error: l-value reference to std::array<int> should be convertible to "
296*61c4878aSAndroid Build Coastguard Worker       "span<const int> with dynamic extent.");
297*61c4878aSAndroid Build Coastguard Worker   static_assert(
298*61c4878aSAndroid Build Coastguard Worker       std::is_convertible<std::array<int, 3>&, span<const int, 3>>::value,
299*61c4878aSAndroid Build Coastguard Worker       "Error: l-value reference to std::array<int> should be convertible to "
300*61c4878aSAndroid Build Coastguard Worker       "span<const int> with the same static extent.");
301*61c4878aSAndroid Build Coastguard Worker   static_assert(
302*61c4878aSAndroid Build Coastguard Worker       std::is_convertible<const std::array<int, 3>&, span<const int>>::value,
303*61c4878aSAndroid Build Coastguard Worker       "Error: const l-value reference to std::array<int> should be "
304*61c4878aSAndroid Build Coastguard Worker       "convertible to span<const int> with dynamic extent.");
305*61c4878aSAndroid Build Coastguard Worker   static_assert(
306*61c4878aSAndroid Build Coastguard Worker       std::is_convertible<const std::array<int, 3>&, span<const int, 3>>::value,
307*61c4878aSAndroid Build Coastguard Worker       "Error: const l-value reference to std::array<int> should be convertible "
308*61c4878aSAndroid Build Coastguard Worker       "to span<const int> with the same static extent.");
309*61c4878aSAndroid Build Coastguard Worker   static_assert(
310*61c4878aSAndroid Build Coastguard Worker       std::is_convertible<std::array<const int, 3>&, span<const int>>::value,
311*61c4878aSAndroid Build Coastguard Worker       "Error: l-value reference to std::array<const int> should be "
312*61c4878aSAndroid Build Coastguard Worker       "convertible to span<const int> with dynamic extent.");
313*61c4878aSAndroid Build Coastguard Worker   static_assert(
314*61c4878aSAndroid Build Coastguard Worker       std::is_convertible<std::array<const int, 3>&, span<const int, 3>>::value,
315*61c4878aSAndroid Build Coastguard Worker       "Error: l-value reference to std::array<const int> should be convertible "
316*61c4878aSAndroid Build Coastguard Worker       "to span<const int> with the same static extent.");
317*61c4878aSAndroid Build Coastguard Worker   static_assert(
318*61c4878aSAndroid Build Coastguard Worker       std::is_convertible<const std::array<const int, 3>&,
319*61c4878aSAndroid Build Coastguard Worker                           span<const int>>::value,
320*61c4878aSAndroid Build Coastguard Worker       "Error: const l-value reference to std::array<const int> should be "
321*61c4878aSAndroid Build Coastguard Worker       "convertible to span<const int> with dynamic extent.");
322*61c4878aSAndroid Build Coastguard Worker   static_assert(
323*61c4878aSAndroid Build Coastguard Worker       std::is_convertible<const std::array<const int, 3>&,
324*61c4878aSAndroid Build Coastguard Worker                           span<const int, 3>>::value,
325*61c4878aSAndroid Build Coastguard Worker       "Error: const l-value reference to std::array<const int> should be "
326*61c4878aSAndroid Build Coastguard Worker       "convertible to span<const int> with the same static extent.");
327*61c4878aSAndroid Build Coastguard Worker }
328*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,DisallowedConstructionsFromStdArray)329*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, DisallowedConstructionsFromStdArray) {
330*61c4878aSAndroid Build Coastguard Worker   // In the following assertions we use !std::is_constructible_v<T, Args>, which
331*61c4878aSAndroid Build Coastguard Worker   // is equivalent to checking whether the following expression is malformed:
332*61c4878aSAndroid Build Coastguard Worker   //
333*61c4878aSAndroid Build Coastguard Worker   // T obj(std::declval<Args>()...);
334*61c4878aSAndroid Build Coastguard Worker   //
335*61c4878aSAndroid Build Coastguard Worker   // In particular we are checking that T is not explicitly constructible from
336*61c4878aSAndroid Build Coastguard Worker   // Args, which also implies that T is not implicitly constructible from Args
337*61c4878aSAndroid Build Coastguard Worker   // as well.
338*61c4878aSAndroid Build Coastguard Worker   static_assert(
339*61c4878aSAndroid Build Coastguard Worker       !std::is_constructible<span<int>, const std::array<int, 3>&>::value,
340*61c4878aSAndroid Build Coastguard Worker       "Error: span<int> with dynamic extent should not be constructible "
341*61c4878aSAndroid Build Coastguard Worker       "from const l-value reference to std::array<int>");
342*61c4878aSAndroid Build Coastguard Worker 
343*61c4878aSAndroid Build Coastguard Worker   static_assert(
344*61c4878aSAndroid Build Coastguard Worker       !std::is_constructible<span<int>, std::array<const int, 3>&>::value,
345*61c4878aSAndroid Build Coastguard Worker       "Error: span<int> with dynamic extent should not be constructible "
346*61c4878aSAndroid Build Coastguard Worker       "from l-value reference to std::array<const int>");
347*61c4878aSAndroid Build Coastguard Worker 
348*61c4878aSAndroid Build Coastguard Worker   static_assert(
349*61c4878aSAndroid Build Coastguard Worker       !std::is_constructible<span<int>, const std::array<const int, 3>&>::value,
350*61c4878aSAndroid Build Coastguard Worker       "Error: span<int> with dynamic extent should not be constructible "
351*61c4878aSAndroid Build Coastguard Worker       "const from l-value reference to std::array<const int>");
352*61c4878aSAndroid Build Coastguard Worker 
353*61c4878aSAndroid Build Coastguard Worker   static_assert(
354*61c4878aSAndroid Build Coastguard Worker       !std::is_constructible<span<int, 2>, std::array<int, 3>&>::value,
355*61c4878aSAndroid Build Coastguard Worker       "Error: span<int> with static extent should not be constructible "
356*61c4878aSAndroid Build Coastguard Worker       "from l-value reference to std::array<int> with different extent");
357*61c4878aSAndroid Build Coastguard Worker 
358*61c4878aSAndroid Build Coastguard Worker   static_assert(
359*61c4878aSAndroid Build Coastguard Worker       !std::is_constructible<span<int, 4>, std::array<int, 3>&>::value,
360*61c4878aSAndroid Build Coastguard Worker       "Error: span<int> with dynamic extent should not be constructible "
361*61c4878aSAndroid Build Coastguard Worker       "from l-value reference to std::array<int> with different extent");
362*61c4878aSAndroid Build Coastguard Worker 
363*61c4878aSAndroid Build Coastguard Worker   static_assert(
364*61c4878aSAndroid Build Coastguard Worker       !std::is_constructible<span<int>, std::array<bool, 3>&>::value,
365*61c4878aSAndroid Build Coastguard Worker       "Error: span<int> with dynamic extent should not be constructible "
366*61c4878aSAndroid Build Coastguard Worker       "from l-value reference to std::array<bool>");
367*61c4878aSAndroid Build Coastguard Worker }
368*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromConstexprArray)369*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromConstexprArray) {
370*61c4878aSAndroid Build Coastguard Worker   static constexpr int kArray[] = {5, 4, 3, 2, 1};
371*61c4878aSAndroid Build Coastguard Worker 
372*61c4878aSAndroid Build Coastguard Worker   constexpr span<const int> dynamic_span(kArray);
373*61c4878aSAndroid Build Coastguard Worker   static_assert(kArray == dynamic_span.data(), "");
374*61c4878aSAndroid Build Coastguard Worker   static_assert(std::size(kArray) == dynamic_span.size(), "");
375*61c4878aSAndroid Build Coastguard Worker 
376*61c4878aSAndroid Build Coastguard Worker   static_assert(kArray[0] == dynamic_span[0], "");
377*61c4878aSAndroid Build Coastguard Worker   static_assert(kArray[1] == dynamic_span[1], "");
378*61c4878aSAndroid Build Coastguard Worker   static_assert(kArray[2] == dynamic_span[2], "");
379*61c4878aSAndroid Build Coastguard Worker   static_assert(kArray[3] == dynamic_span[3], "");
380*61c4878aSAndroid Build Coastguard Worker   static_assert(kArray[4] == dynamic_span[4], "");
381*61c4878aSAndroid Build Coastguard Worker 
382*61c4878aSAndroid Build Coastguard Worker   constexpr span<const int, std::size(kArray)> static_span(kArray);
383*61c4878aSAndroid Build Coastguard Worker   static_assert(kArray == static_span.data(), "");
384*61c4878aSAndroid Build Coastguard Worker   static_assert(std::size(kArray) == static_span.size(), "");
385*61c4878aSAndroid Build Coastguard Worker 
386*61c4878aSAndroid Build Coastguard Worker   static_assert(kArray[0] == static_span[0], "");
387*61c4878aSAndroid Build Coastguard Worker   static_assert(kArray[1] == static_span[1], "");
388*61c4878aSAndroid Build Coastguard Worker   static_assert(kArray[2] == static_span[2], "");
389*61c4878aSAndroid Build Coastguard Worker   static_assert(kArray[3] == static_span[3], "");
390*61c4878aSAndroid Build Coastguard Worker   static_assert(kArray[4] == static_span[4], "");
391*61c4878aSAndroid Build Coastguard Worker }
392*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromArray)393*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromArray) {
394*61c4878aSAndroid Build Coastguard Worker   int array[] = {5, 4, 3, 2, 1};
395*61c4878aSAndroid Build Coastguard Worker 
396*61c4878aSAndroid Build Coastguard Worker   span<const int> const_span(array);
397*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(array, const_span.data());
398*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(std::size(array), const_span.size());
399*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < const_span.size(); ++i)
400*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(array[i], const_span[i]);
401*61c4878aSAndroid Build Coastguard Worker 
402*61c4878aSAndroid Build Coastguard Worker   span<int> dynamic_span(array);
403*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(array, dynamic_span.data());
404*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(std::size(array), dynamic_span.size());
405*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < dynamic_span.size(); ++i)
406*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(array[i], dynamic_span[i]);
407*61c4878aSAndroid Build Coastguard Worker 
408*61c4878aSAndroid Build Coastguard Worker   span<int, std::size(array)> static_span(array);
409*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(array, static_span.data());
410*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(std::size(array), static_span.size());
411*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i)
412*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(array[i], static_span[i]);
413*61c4878aSAndroid Build Coastguard Worker }
414*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromStdArray)415*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromStdArray) {
416*61c4878aSAndroid Build Coastguard Worker   // Note: Constructing a constexpr span from a constexpr std::array does not
417*61c4878aSAndroid Build Coastguard Worker   // work prior to C++17 due to non-constexpr std::array::data.
418*61c4878aSAndroid Build Coastguard Worker   std::array<int, 5> array = {{5, 4, 3, 2, 1}};
419*61c4878aSAndroid Build Coastguard Worker 
420*61c4878aSAndroid Build Coastguard Worker   span<const int> const_span(array);
421*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(array.data(), const_span.data());
422*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(array.size(), const_span.size());
423*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < const_span.size(); ++i)
424*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(array[i], const_span[i]);
425*61c4878aSAndroid Build Coastguard Worker 
426*61c4878aSAndroid Build Coastguard Worker   span<int> dynamic_span(array);
427*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(array.data(), dynamic_span.data());
428*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(array.size(), dynamic_span.size());
429*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < dynamic_span.size(); ++i)
430*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(array[i], dynamic_span[i]);
431*61c4878aSAndroid Build Coastguard Worker 
432*61c4878aSAndroid Build Coastguard Worker   span<int, std::size(array)> static_span(array);
433*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(array.data(), static_span.data());
434*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(array.size(), static_span.size());
435*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i)
436*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(array[i], static_span[i]);
437*61c4878aSAndroid Build Coastguard Worker }
438*61c4878aSAndroid Build Coastguard Worker 
439*61c4878aSAndroid Build Coastguard Worker #if PW_CXX_STANDARD_IS_SUPPORTED(17)
440*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromInitializerList)441*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromInitializerList) {
442*61c4878aSAndroid Build Coastguard Worker   std::initializer_list<int> il = {1, 1, 2, 3, 5, 8};
443*61c4878aSAndroid Build Coastguard Worker 
444*61c4878aSAndroid Build Coastguard Worker   span<const int> const_span(il);
445*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(il.begin(), const_span.data());
446*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(il.size(), const_span.size());
447*61c4878aSAndroid Build Coastguard Worker 
448*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < const_span.size(); ++i)
449*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(il.begin()[i], const_span[i]);
450*61c4878aSAndroid Build Coastguard Worker 
451*61c4878aSAndroid Build Coastguard Worker   span<const int, 6> static_span(il.begin(), il.end());
452*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(il.begin(), static_span.data());
453*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(il.size(), static_span.size());
454*61c4878aSAndroid Build Coastguard Worker 
455*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i)
456*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(il.begin()[i], static_span[i]);
457*61c4878aSAndroid Build Coastguard Worker }
458*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromStdString)459*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromStdString) {
460*61c4878aSAndroid Build Coastguard Worker   std::string str = "foobar";
461*61c4878aSAndroid Build Coastguard Worker 
462*61c4878aSAndroid Build Coastguard Worker   span<const char> const_span(str);
463*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(str.data(), const_span.data());
464*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(str.size(), const_span.size());
465*61c4878aSAndroid Build Coastguard Worker 
466*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < const_span.size(); ++i)
467*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(str[i], const_span[i]);
468*61c4878aSAndroid Build Coastguard Worker 
469*61c4878aSAndroid Build Coastguard Worker   span<char> dynamic_span(str);
470*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(str.data(), dynamic_span.data());
471*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(str.size(), dynamic_span.size());
472*61c4878aSAndroid Build Coastguard Worker 
473*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < dynamic_span.size(); ++i)
474*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(str[i], dynamic_span[i]);
475*61c4878aSAndroid Build Coastguard Worker 
476*61c4878aSAndroid Build Coastguard Worker   span<char, 6> static_span(data(str), str.size());
477*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(str.data(), static_span.data());
478*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(str.size(), static_span.size());
479*61c4878aSAndroid Build Coastguard Worker 
480*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i)
481*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(str[i], static_span[i]);
482*61c4878aSAndroid Build Coastguard Worker }
483*61c4878aSAndroid Build Coastguard Worker 
484*61c4878aSAndroid Build Coastguard Worker #endif  // PW_CXX_STANDARD_IS_SUPPORTED(17)
485*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromConstContainer)486*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromConstContainer) {
487*61c4878aSAndroid Build Coastguard Worker   const std::vector<int> vector = {1, 1, 2, 3, 5, 8};
488*61c4878aSAndroid Build Coastguard Worker 
489*61c4878aSAndroid Build Coastguard Worker   span<const int> const_span(vector);
490*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), const_span.data());
491*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), const_span.size());
492*61c4878aSAndroid Build Coastguard Worker 
493*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < const_span.size(); ++i)
494*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], const_span[i]);
495*61c4878aSAndroid Build Coastguard Worker 
496*61c4878aSAndroid Build Coastguard Worker   span<const int, 6> static_span(vector.data(), vector.size());
497*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), static_span.data());
498*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), static_span.size());
499*61c4878aSAndroid Build Coastguard Worker 
500*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i)
501*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], static_span[i]);
502*61c4878aSAndroid Build Coastguard Worker }
503*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,ConstructFromContainer)504*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, ConstructFromContainer) {
505*61c4878aSAndroid Build Coastguard Worker   std::vector<int> vector = {1, 1, 2, 3, 5, 8};
506*61c4878aSAndroid Build Coastguard Worker 
507*61c4878aSAndroid Build Coastguard Worker   span<const int> const_span(vector);
508*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), const_span.data());
509*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), const_span.size());
510*61c4878aSAndroid Build Coastguard Worker 
511*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < const_span.size(); ++i)
512*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], const_span[i]);
513*61c4878aSAndroid Build Coastguard Worker 
514*61c4878aSAndroid Build Coastguard Worker   span<int> dynamic_span(vector);
515*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), dynamic_span.data());
516*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), dynamic_span.size());
517*61c4878aSAndroid Build Coastguard Worker 
518*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < dynamic_span.size(); ++i)
519*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], dynamic_span[i]);
520*61c4878aSAndroid Build Coastguard Worker 
521*61c4878aSAndroid Build Coastguard Worker   span<int, 6> static_span(vector.data(), vector.size());
522*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), static_span.data());
523*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), static_span.size());
524*61c4878aSAndroid Build Coastguard Worker 
525*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < static_span.size(); ++i)
526*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], static_span[i]);
527*61c4878aSAndroid Build Coastguard Worker }
528*61c4878aSAndroid Build Coastguard Worker 
529*61c4878aSAndroid Build Coastguard Worker #if 0
530*61c4878aSAndroid Build Coastguard Worker 
531*61c4878aSAndroid Build Coastguard Worker // Pigweed: gMock matchers are not yet supported.
532*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, ConvertNonConstIntegralToConst) {
533*61c4878aSAndroid Build Coastguard Worker   std::vector<int> vector = {1, 1, 2, 3, 5, 8};
534*61c4878aSAndroid Build Coastguard Worker 
535*61c4878aSAndroid Build Coastguard Worker   span<int> int_span(vector.data(), vector.size());
536*61c4878aSAndroid Build Coastguard Worker   span<const int> const_span(int_span);
537*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(int_span.size(), const_span.size());
538*61c4878aSAndroid Build Coastguard Worker 
539*61c4878aSAndroid Build Coastguard Worker   EXPECT_THAT(const_span, Pointwise(Eq(), int_span));
540*61c4878aSAndroid Build Coastguard Worker 
541*61c4878aSAndroid Build Coastguard Worker   span<int, 6> static_int_span(vector.data(), vector.size());
542*61c4878aSAndroid Build Coastguard Worker   span<const int, 6> static_const_span(static_int_span);
543*61c4878aSAndroid Build Coastguard Worker   EXPECT_THAT(static_const_span, Pointwise(Eq(), static_int_span));
544*61c4878aSAndroid Build Coastguard Worker }
545*61c4878aSAndroid Build Coastguard Worker 
546*61c4878aSAndroid Build Coastguard Worker // Pigweed: gMock matchers are not yet supported.
547*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, ConvertNonConstPointerToConst) {
548*61c4878aSAndroid Build Coastguard Worker   auto a = std::make_unique<int>(11);
549*61c4878aSAndroid Build Coastguard Worker   auto b = std::make_unique<int>(22);
550*61c4878aSAndroid Build Coastguard Worker   auto c = std::make_unique<int>(33);
551*61c4878aSAndroid Build Coastguard Worker   std::vector<int*> vector = {a.get(), b.get(), c.get()};
552*61c4878aSAndroid Build Coastguard Worker 
553*61c4878aSAndroid Build Coastguard Worker   span<int*> non_const_pointer_span(vector);
554*61c4878aSAndroid Build Coastguard Worker   EXPECT_THAT(non_const_pointer_span, Pointwise(Eq(), vector));
555*61c4878aSAndroid Build Coastguard Worker   span<int* const> const_pointer_span(non_const_pointer_span);
556*61c4878aSAndroid Build Coastguard Worker   EXPECT_THAT(const_pointer_span, Pointwise(Eq(), non_const_pointer_span));
557*61c4878aSAndroid Build Coastguard Worker   // Note: no test for conversion from span<int> to span<const int*>, since that
558*61c4878aSAndroid Build Coastguard Worker   // would imply a conversion from int** to const int**, which is unsafe.
559*61c4878aSAndroid Build Coastguard Worker   //
560*61c4878aSAndroid Build Coastguard Worker   // Note: no test for conversion from span<int*> to span<const int* const>,
561*61c4878aSAndroid Build Coastguard Worker   // due to CWG Defect 330:
562*61c4878aSAndroid Build Coastguard Worker   // http://open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#330
563*61c4878aSAndroid Build Coastguard Worker 
564*61c4878aSAndroid Build Coastguard Worker   span<int*, 3> static_non_const_pointer_span(vector.data(), vector.size());
565*61c4878aSAndroid Build Coastguard Worker   EXPECT_THAT(static_non_const_pointer_span, Pointwise(Eq(), vector));
566*61c4878aSAndroid Build Coastguard Worker   span<int* const, 3> static_const_pointer_span(static_non_const_pointer_span);
567*61c4878aSAndroid Build Coastguard Worker   EXPECT_THAT(static_const_pointer_span,
568*61c4878aSAndroid Build Coastguard Worker               Pointwise(Eq(), static_non_const_pointer_span));
569*61c4878aSAndroid Build Coastguard Worker }
570*61c4878aSAndroid Build Coastguard Worker 
571*61c4878aSAndroid Build Coastguard Worker // Pigweed: This test does not work on platforms where int32_t is long int.
572*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, ConvertBetweenEquivalentTypes) {
573*61c4878aSAndroid Build Coastguard Worker   std::vector<int32_t> vector = {2, 4, 8, 16, 32};
574*61c4878aSAndroid Build Coastguard Worker 
575*61c4878aSAndroid Build Coastguard Worker   span<int32_t> int32_t_span(vector);
576*61c4878aSAndroid Build Coastguard Worker   span<int> converted_span(int32_t_span);
577*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(int32_t_span.data(), converted_span.data());
578*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(int32_t_span.size(), converted_span.size());
579*61c4878aSAndroid Build Coastguard Worker 
580*61c4878aSAndroid Build Coastguard Worker   span<int32_t, 5> static_int32_t_span(vector.data(), vector.size());
581*61c4878aSAndroid Build Coastguard Worker   span<int, 5> static_converted_span(static_int32_t_span);
582*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(static_int32_t_span.data(), static_converted_span.data());
583*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(static_int32_t_span.size(), static_converted_span.size());
584*61c4878aSAndroid Build Coastguard Worker }
585*61c4878aSAndroid Build Coastguard Worker 
586*61c4878aSAndroid Build Coastguard Worker #endif  // 0
587*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,TemplatedFirst)588*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, TemplatedFirst) {
589*61c4878aSAndroid Build Coastguard Worker   static constexpr int array[] = {1, 2, 3};
590*61c4878aSAndroid Build Coastguard Worker   constexpr span<const int, 3> span(array);
591*61c4878aSAndroid Build Coastguard Worker 
592*61c4878aSAndroid Build Coastguard Worker   {
593*61c4878aSAndroid Build Coastguard Worker     constexpr auto subspan = span.first<0>();
594*61c4878aSAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
595*61c4878aSAndroid Build Coastguard Worker     static_assert(subspan.empty(), "");
596*61c4878aSAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
597*61c4878aSAndroid Build Coastguard Worker   }
598*61c4878aSAndroid Build Coastguard Worker 
599*61c4878aSAndroid Build Coastguard Worker   {
600*61c4878aSAndroid Build Coastguard Worker     constexpr auto subspan = span.first<1>();
601*61c4878aSAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
602*61c4878aSAndroid Build Coastguard Worker     static_assert(1u == subspan.size(), "");
603*61c4878aSAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
604*61c4878aSAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
605*61c4878aSAndroid Build Coastguard Worker   }
606*61c4878aSAndroid Build Coastguard Worker 
607*61c4878aSAndroid Build Coastguard Worker   {
608*61c4878aSAndroid Build Coastguard Worker     constexpr auto subspan = span.first<2>();
609*61c4878aSAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
610*61c4878aSAndroid Build Coastguard Worker     static_assert(2u == subspan.size(), "");
611*61c4878aSAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
612*61c4878aSAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
613*61c4878aSAndroid Build Coastguard Worker     static_assert(2 == subspan[1], "");
614*61c4878aSAndroid Build Coastguard Worker   }
615*61c4878aSAndroid Build Coastguard Worker 
616*61c4878aSAndroid Build Coastguard Worker   {
617*61c4878aSAndroid Build Coastguard Worker     constexpr auto subspan = span.first<3>();
618*61c4878aSAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
619*61c4878aSAndroid Build Coastguard Worker     static_assert(3u == subspan.size(), "");
620*61c4878aSAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
621*61c4878aSAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
622*61c4878aSAndroid Build Coastguard Worker     static_assert(2 == subspan[1], "");
623*61c4878aSAndroid Build Coastguard Worker     static_assert(3 == subspan[2], "");
624*61c4878aSAndroid Build Coastguard Worker   }
625*61c4878aSAndroid Build Coastguard Worker }
626*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,TemplatedLast)627*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, TemplatedLast) {
628*61c4878aSAndroid Build Coastguard Worker   static constexpr int array[] = {1, 2, 3};
629*61c4878aSAndroid Build Coastguard Worker   constexpr span<const int, 3> span(array);
630*61c4878aSAndroid Build Coastguard Worker 
631*61c4878aSAndroid Build Coastguard Worker   {
632*61c4878aSAndroid Build Coastguard Worker     constexpr auto subspan = span.last<0>();
633*61c4878aSAndroid Build Coastguard Worker     static_assert(span.data() + 3 == subspan.data(), "");
634*61c4878aSAndroid Build Coastguard Worker     static_assert(subspan.empty(), "");
635*61c4878aSAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
636*61c4878aSAndroid Build Coastguard Worker   }
637*61c4878aSAndroid Build Coastguard Worker 
638*61c4878aSAndroid Build Coastguard Worker   {
639*61c4878aSAndroid Build Coastguard Worker     constexpr auto subspan = span.last<1>();
640*61c4878aSAndroid Build Coastguard Worker     static_assert(span.data() + 2 == subspan.data(), "");
641*61c4878aSAndroid Build Coastguard Worker     static_assert(1u == subspan.size(), "");
642*61c4878aSAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
643*61c4878aSAndroid Build Coastguard Worker     static_assert(3 == subspan[0], "");
644*61c4878aSAndroid Build Coastguard Worker   }
645*61c4878aSAndroid Build Coastguard Worker 
646*61c4878aSAndroid Build Coastguard Worker   {
647*61c4878aSAndroid Build Coastguard Worker     constexpr auto subspan = span.last<2>();
648*61c4878aSAndroid Build Coastguard Worker     static_assert(span.data() + 1 == subspan.data(), "");
649*61c4878aSAndroid Build Coastguard Worker     static_assert(2u == subspan.size(), "");
650*61c4878aSAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
651*61c4878aSAndroid Build Coastguard Worker     static_assert(2 == subspan[0], "");
652*61c4878aSAndroid Build Coastguard Worker     static_assert(3 == subspan[1], "");
653*61c4878aSAndroid Build Coastguard Worker   }
654*61c4878aSAndroid Build Coastguard Worker 
655*61c4878aSAndroid Build Coastguard Worker   {
656*61c4878aSAndroid Build Coastguard Worker     constexpr auto subspan = span.last<3>();
657*61c4878aSAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
658*61c4878aSAndroid Build Coastguard Worker     static_assert(3u == subspan.size(), "");
659*61c4878aSAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
660*61c4878aSAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
661*61c4878aSAndroid Build Coastguard Worker     static_assert(2 == subspan[1], "");
662*61c4878aSAndroid Build Coastguard Worker     static_assert(3 == subspan[2], "");
663*61c4878aSAndroid Build Coastguard Worker   }
664*61c4878aSAndroid Build Coastguard Worker }
665*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,TemplatedSubspan)666*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, TemplatedSubspan) {
667*61c4878aSAndroid Build Coastguard Worker   static constexpr int array[] = {1, 2, 3};
668*61c4878aSAndroid Build Coastguard Worker   constexpr span<const int, 3> span(array);
669*61c4878aSAndroid Build Coastguard Worker 
670*61c4878aSAndroid Build Coastguard Worker   {
671*61c4878aSAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<0>();
672*61c4878aSAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
673*61c4878aSAndroid Build Coastguard Worker     static_assert(3u == subspan.size(), "");
674*61c4878aSAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
675*61c4878aSAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
676*61c4878aSAndroid Build Coastguard Worker     static_assert(2 == subspan[1], "");
677*61c4878aSAndroid Build Coastguard Worker     static_assert(3 == subspan[2], "");
678*61c4878aSAndroid Build Coastguard Worker   }
679*61c4878aSAndroid Build Coastguard Worker 
680*61c4878aSAndroid Build Coastguard Worker   {
681*61c4878aSAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<1>();
682*61c4878aSAndroid Build Coastguard Worker     static_assert(span.data() + 1 == subspan.data(), "");
683*61c4878aSAndroid Build Coastguard Worker     static_assert(2u == subspan.size(), "");
684*61c4878aSAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
685*61c4878aSAndroid Build Coastguard Worker     static_assert(2 == subspan[0], "");
686*61c4878aSAndroid Build Coastguard Worker     static_assert(3 == subspan[1], "");
687*61c4878aSAndroid Build Coastguard Worker   }
688*61c4878aSAndroid Build Coastguard Worker 
689*61c4878aSAndroid Build Coastguard Worker   {
690*61c4878aSAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<2>();
691*61c4878aSAndroid Build Coastguard Worker     static_assert(span.data() + 2 == subspan.data(), "");
692*61c4878aSAndroid Build Coastguard Worker     static_assert(1u == subspan.size(), "");
693*61c4878aSAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
694*61c4878aSAndroid Build Coastguard Worker     static_assert(3 == subspan[0], "");
695*61c4878aSAndroid Build Coastguard Worker   }
696*61c4878aSAndroid Build Coastguard Worker 
697*61c4878aSAndroid Build Coastguard Worker   {
698*61c4878aSAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<3>();
699*61c4878aSAndroid Build Coastguard Worker     static_assert(span.data() + 3 == subspan.data(), "");
700*61c4878aSAndroid Build Coastguard Worker     static_assert(subspan.empty(), "");
701*61c4878aSAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
702*61c4878aSAndroid Build Coastguard Worker   }
703*61c4878aSAndroid Build Coastguard Worker 
704*61c4878aSAndroid Build Coastguard Worker   {
705*61c4878aSAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<0, 0>();
706*61c4878aSAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
707*61c4878aSAndroid Build Coastguard Worker     static_assert(subspan.empty(), "");
708*61c4878aSAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
709*61c4878aSAndroid Build Coastguard Worker   }
710*61c4878aSAndroid Build Coastguard Worker 
711*61c4878aSAndroid Build Coastguard Worker   {
712*61c4878aSAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<1, 0>();
713*61c4878aSAndroid Build Coastguard Worker     static_assert(span.data() + 1 == subspan.data(), "");
714*61c4878aSAndroid Build Coastguard Worker     static_assert(subspan.empty(), "");
715*61c4878aSAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
716*61c4878aSAndroid Build Coastguard Worker   }
717*61c4878aSAndroid Build Coastguard Worker 
718*61c4878aSAndroid Build Coastguard Worker   {
719*61c4878aSAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<2, 0>();
720*61c4878aSAndroid Build Coastguard Worker     static_assert(span.data() + 2 == subspan.data(), "");
721*61c4878aSAndroid Build Coastguard Worker     static_assert(subspan.empty(), "");
722*61c4878aSAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
723*61c4878aSAndroid Build Coastguard Worker   }
724*61c4878aSAndroid Build Coastguard Worker 
725*61c4878aSAndroid Build Coastguard Worker   {
726*61c4878aSAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<0, 1>();
727*61c4878aSAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
728*61c4878aSAndroid Build Coastguard Worker     static_assert(1u == subspan.size(), "");
729*61c4878aSAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
730*61c4878aSAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
731*61c4878aSAndroid Build Coastguard Worker   }
732*61c4878aSAndroid Build Coastguard Worker 
733*61c4878aSAndroid Build Coastguard Worker   {
734*61c4878aSAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<1, 1>();
735*61c4878aSAndroid Build Coastguard Worker     static_assert(span.data() + 1 == subspan.data(), "");
736*61c4878aSAndroid Build Coastguard Worker     static_assert(1u == subspan.size(), "");
737*61c4878aSAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
738*61c4878aSAndroid Build Coastguard Worker     static_assert(2 == subspan[0], "");
739*61c4878aSAndroid Build Coastguard Worker   }
740*61c4878aSAndroid Build Coastguard Worker 
741*61c4878aSAndroid Build Coastguard Worker   {
742*61c4878aSAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<2, 1>();
743*61c4878aSAndroid Build Coastguard Worker     static_assert(span.data() + 2 == subspan.data(), "");
744*61c4878aSAndroid Build Coastguard Worker     static_assert(1u == subspan.size(), "");
745*61c4878aSAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
746*61c4878aSAndroid Build Coastguard Worker     static_assert(3 == subspan[0], "");
747*61c4878aSAndroid Build Coastguard Worker   }
748*61c4878aSAndroid Build Coastguard Worker 
749*61c4878aSAndroid Build Coastguard Worker   {
750*61c4878aSAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<0, 2>();
751*61c4878aSAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
752*61c4878aSAndroid Build Coastguard Worker     static_assert(2u == subspan.size(), "");
753*61c4878aSAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
754*61c4878aSAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
755*61c4878aSAndroid Build Coastguard Worker     static_assert(2 == subspan[1], "");
756*61c4878aSAndroid Build Coastguard Worker   }
757*61c4878aSAndroid Build Coastguard Worker 
758*61c4878aSAndroid Build Coastguard Worker   {
759*61c4878aSAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<1, 2>();
760*61c4878aSAndroid Build Coastguard Worker     static_assert(span.data() + 1 == subspan.data(), "");
761*61c4878aSAndroid Build Coastguard Worker     static_assert(2u == subspan.size(), "");
762*61c4878aSAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
763*61c4878aSAndroid Build Coastguard Worker     static_assert(2 == subspan[0], "");
764*61c4878aSAndroid Build Coastguard Worker     static_assert(3 == subspan[1], "");
765*61c4878aSAndroid Build Coastguard Worker   }
766*61c4878aSAndroid Build Coastguard Worker 
767*61c4878aSAndroid Build Coastguard Worker   {
768*61c4878aSAndroid Build Coastguard Worker     constexpr auto subspan = span.subspan<0, 3>();
769*61c4878aSAndroid Build Coastguard Worker     static_assert(span.data() == subspan.data(), "");
770*61c4878aSAndroid Build Coastguard Worker     static_assert(3u == subspan.size(), "");
771*61c4878aSAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
772*61c4878aSAndroid Build Coastguard Worker     static_assert(1 == subspan[0], "");
773*61c4878aSAndroid Build Coastguard Worker     static_assert(2 == subspan[1], "");
774*61c4878aSAndroid Build Coastguard Worker     static_assert(3 == subspan[2], "");
775*61c4878aSAndroid Build Coastguard Worker   }
776*61c4878aSAndroid Build Coastguard Worker }
777*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,SubscriptedBeginIterator)778*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, SubscriptedBeginIterator) {
779*61c4878aSAndroid Build Coastguard Worker   int array[] = {1, 2, 3};
780*61c4878aSAndroid Build Coastguard Worker   span<const int> const_span(array);
781*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < const_span.size(); ++i)
782*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(array[i], const_span.begin()[i]);
783*61c4878aSAndroid Build Coastguard Worker 
784*61c4878aSAndroid Build Coastguard Worker   span<int> mutable_span(array);
785*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < mutable_span.size(); ++i)
786*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(array[i], mutable_span.begin()[i]);
787*61c4878aSAndroid Build Coastguard Worker }
788*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,TemplatedFirstOnDynamicSpan)789*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, TemplatedFirstOnDynamicSpan) {
790*61c4878aSAndroid Build Coastguard Worker   int array[] = {1, 2, 3};
791*61c4878aSAndroid Build Coastguard Worker   span<const int> span(array);
792*61c4878aSAndroid Build Coastguard Worker 
793*61c4878aSAndroid Build Coastguard Worker   {
794*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.first<0>();
795*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
796*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
797*61c4878aSAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
798*61c4878aSAndroid Build Coastguard Worker   }
799*61c4878aSAndroid Build Coastguard Worker 
800*61c4878aSAndroid Build Coastguard Worker   {
801*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.first<1>();
802*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
803*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
804*61c4878aSAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
805*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
806*61c4878aSAndroid Build Coastguard Worker   }
807*61c4878aSAndroid Build Coastguard Worker 
808*61c4878aSAndroid Build Coastguard Worker   {
809*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.first<2>();
810*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
811*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
812*61c4878aSAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
813*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
814*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
815*61c4878aSAndroid Build Coastguard Worker   }
816*61c4878aSAndroid Build Coastguard Worker 
817*61c4878aSAndroid Build Coastguard Worker   {
818*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.first<3>();
819*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
820*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, subspan.size());
821*61c4878aSAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
822*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
823*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
824*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
825*61c4878aSAndroid Build Coastguard Worker   }
826*61c4878aSAndroid Build Coastguard Worker }
827*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,TemplatedLastOnDynamicSpan)828*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, TemplatedLastOnDynamicSpan) {
829*61c4878aSAndroid Build Coastguard Worker   int array[] = {1, 2, 3};
830*61c4878aSAndroid Build Coastguard Worker   span<int> span(array);
831*61c4878aSAndroid Build Coastguard Worker 
832*61c4878aSAndroid Build Coastguard Worker   {
833*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.last<0>();
834*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 3, subspan.data());
835*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
836*61c4878aSAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
837*61c4878aSAndroid Build Coastguard Worker   }
838*61c4878aSAndroid Build Coastguard Worker 
839*61c4878aSAndroid Build Coastguard Worker   {
840*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.last<1>();
841*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
842*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
843*61c4878aSAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
844*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[0]);
845*61c4878aSAndroid Build Coastguard Worker   }
846*61c4878aSAndroid Build Coastguard Worker 
847*61c4878aSAndroid Build Coastguard Worker   {
848*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.last<2>();
849*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
850*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
851*61c4878aSAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
852*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
853*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[1]);
854*61c4878aSAndroid Build Coastguard Worker   }
855*61c4878aSAndroid Build Coastguard Worker 
856*61c4878aSAndroid Build Coastguard Worker   {
857*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.last<3>();
858*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
859*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, subspan.size());
860*61c4878aSAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
861*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
862*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
863*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
864*61c4878aSAndroid Build Coastguard Worker   }
865*61c4878aSAndroid Build Coastguard Worker }
866*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,TemplatedSubspanFromDynamicSpan)867*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, TemplatedSubspanFromDynamicSpan) {
868*61c4878aSAndroid Build Coastguard Worker   int array[] = {1, 2, 3};
869*61c4878aSAndroid Build Coastguard Worker   span<int, 3> span(array);
870*61c4878aSAndroid Build Coastguard Worker 
871*61c4878aSAndroid Build Coastguard Worker   {
872*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan<0>();
873*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
874*61c4878aSAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
875*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, subspan.size());
876*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
877*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
878*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
879*61c4878aSAndroid Build Coastguard Worker   }
880*61c4878aSAndroid Build Coastguard Worker 
881*61c4878aSAndroid Build Coastguard Worker   {
882*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan<1>();
883*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
884*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
885*61c4878aSAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
886*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
887*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[1]);
888*61c4878aSAndroid Build Coastguard Worker   }
889*61c4878aSAndroid Build Coastguard Worker 
890*61c4878aSAndroid Build Coastguard Worker   {
891*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan<2>();
892*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
893*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
894*61c4878aSAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
895*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[0]);
896*61c4878aSAndroid Build Coastguard Worker   }
897*61c4878aSAndroid Build Coastguard Worker 
898*61c4878aSAndroid Build Coastguard Worker   {
899*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan<3>();
900*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 3, subspan.data());
901*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
902*61c4878aSAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
903*61c4878aSAndroid Build Coastguard Worker   }
904*61c4878aSAndroid Build Coastguard Worker 
905*61c4878aSAndroid Build Coastguard Worker   {
906*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan<0, 0>();
907*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
908*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
909*61c4878aSAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
910*61c4878aSAndroid Build Coastguard Worker   }
911*61c4878aSAndroid Build Coastguard Worker 
912*61c4878aSAndroid Build Coastguard Worker   {
913*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan<1, 0>();
914*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
915*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
916*61c4878aSAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
917*61c4878aSAndroid Build Coastguard Worker   }
918*61c4878aSAndroid Build Coastguard Worker 
919*61c4878aSAndroid Build Coastguard Worker   {
920*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan<2, 0>();
921*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
922*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
923*61c4878aSAndroid Build Coastguard Worker     static_assert(0u == decltype(subspan)::extent, "");
924*61c4878aSAndroid Build Coastguard Worker   }
925*61c4878aSAndroid Build Coastguard Worker 
926*61c4878aSAndroid Build Coastguard Worker   {
927*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan<0, 1>();
928*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
929*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
930*61c4878aSAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
931*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
932*61c4878aSAndroid Build Coastguard Worker   }
933*61c4878aSAndroid Build Coastguard Worker 
934*61c4878aSAndroid Build Coastguard Worker   {
935*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan<1, 1>();
936*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
937*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
938*61c4878aSAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
939*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
940*61c4878aSAndroid Build Coastguard Worker   }
941*61c4878aSAndroid Build Coastguard Worker 
942*61c4878aSAndroid Build Coastguard Worker   {
943*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan<2, 1>();
944*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
945*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
946*61c4878aSAndroid Build Coastguard Worker     static_assert(1u == decltype(subspan)::extent, "");
947*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[0]);
948*61c4878aSAndroid Build Coastguard Worker   }
949*61c4878aSAndroid Build Coastguard Worker 
950*61c4878aSAndroid Build Coastguard Worker   {
951*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan<0, 2>();
952*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
953*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
954*61c4878aSAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
955*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
956*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
957*61c4878aSAndroid Build Coastguard Worker   }
958*61c4878aSAndroid Build Coastguard Worker 
959*61c4878aSAndroid Build Coastguard Worker   {
960*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan<1, 2>();
961*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
962*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
963*61c4878aSAndroid Build Coastguard Worker     static_assert(2u == decltype(subspan)::extent, "");
964*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
965*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[1]);
966*61c4878aSAndroid Build Coastguard Worker   }
967*61c4878aSAndroid Build Coastguard Worker 
968*61c4878aSAndroid Build Coastguard Worker   {
969*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan<0, 3>();
970*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
971*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, subspan.size());
972*61c4878aSAndroid Build Coastguard Worker     static_assert(3u == decltype(subspan)::extent, "");
973*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
974*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
975*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
976*61c4878aSAndroid Build Coastguard Worker   }
977*61c4878aSAndroid Build Coastguard Worker }
978*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,First)979*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, First) {
980*61c4878aSAndroid Build Coastguard Worker   int array[] = {1, 2, 3};
981*61c4878aSAndroid Build Coastguard Worker   span<int> span(array);
982*61c4878aSAndroid Build Coastguard Worker 
983*61c4878aSAndroid Build Coastguard Worker   {
984*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.first(0);
985*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
986*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
987*61c4878aSAndroid Build Coastguard Worker   }
988*61c4878aSAndroid Build Coastguard Worker 
989*61c4878aSAndroid Build Coastguard Worker   {
990*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.first(1);
991*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
992*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
993*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
994*61c4878aSAndroid Build Coastguard Worker   }
995*61c4878aSAndroid Build Coastguard Worker 
996*61c4878aSAndroid Build Coastguard Worker   {
997*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.first(2);
998*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
999*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
1000*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
1001*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
1002*61c4878aSAndroid Build Coastguard Worker   }
1003*61c4878aSAndroid Build Coastguard Worker 
1004*61c4878aSAndroid Build Coastguard Worker   {
1005*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.first(3);
1006*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
1007*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, subspan.size());
1008*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
1009*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
1010*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
1011*61c4878aSAndroid Build Coastguard Worker   }
1012*61c4878aSAndroid Build Coastguard Worker }
1013*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,Last)1014*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, Last) {
1015*61c4878aSAndroid Build Coastguard Worker   int array[] = {1, 2, 3};
1016*61c4878aSAndroid Build Coastguard Worker   span<int> span(array);
1017*61c4878aSAndroid Build Coastguard Worker 
1018*61c4878aSAndroid Build Coastguard Worker   {
1019*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.last(0);
1020*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 3, subspan.data());
1021*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
1022*61c4878aSAndroid Build Coastguard Worker   }
1023*61c4878aSAndroid Build Coastguard Worker 
1024*61c4878aSAndroid Build Coastguard Worker   {
1025*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.last(1);
1026*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
1027*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
1028*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[0]);
1029*61c4878aSAndroid Build Coastguard Worker   }
1030*61c4878aSAndroid Build Coastguard Worker 
1031*61c4878aSAndroid Build Coastguard Worker   {
1032*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.last(2);
1033*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
1034*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
1035*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
1036*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[1]);
1037*61c4878aSAndroid Build Coastguard Worker   }
1038*61c4878aSAndroid Build Coastguard Worker 
1039*61c4878aSAndroid Build Coastguard Worker   {
1040*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.last(3);
1041*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
1042*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, subspan.size());
1043*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
1044*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
1045*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
1046*61c4878aSAndroid Build Coastguard Worker   }
1047*61c4878aSAndroid Build Coastguard Worker }
1048*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,Subspan)1049*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, Subspan) {
1050*61c4878aSAndroid Build Coastguard Worker   int array[] = {1, 2, 3};
1051*61c4878aSAndroid Build Coastguard Worker   span<int> span(array);
1052*61c4878aSAndroid Build Coastguard Worker 
1053*61c4878aSAndroid Build Coastguard Worker   {
1054*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan(0);
1055*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
1056*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, subspan.size());
1057*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
1058*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
1059*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
1060*61c4878aSAndroid Build Coastguard Worker   }
1061*61c4878aSAndroid Build Coastguard Worker 
1062*61c4878aSAndroid Build Coastguard Worker   {
1063*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan(1);
1064*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
1065*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
1066*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
1067*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[1]);
1068*61c4878aSAndroid Build Coastguard Worker   }
1069*61c4878aSAndroid Build Coastguard Worker 
1070*61c4878aSAndroid Build Coastguard Worker   {
1071*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan(2);
1072*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
1073*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
1074*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[0]);
1075*61c4878aSAndroid Build Coastguard Worker   }
1076*61c4878aSAndroid Build Coastguard Worker 
1077*61c4878aSAndroid Build Coastguard Worker   {
1078*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan(3);
1079*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 3, subspan.data());
1080*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
1081*61c4878aSAndroid Build Coastguard Worker   }
1082*61c4878aSAndroid Build Coastguard Worker 
1083*61c4878aSAndroid Build Coastguard Worker   {
1084*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan(0, 0);
1085*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
1086*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
1087*61c4878aSAndroid Build Coastguard Worker   }
1088*61c4878aSAndroid Build Coastguard Worker 
1089*61c4878aSAndroid Build Coastguard Worker   {
1090*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan(1, 0);
1091*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
1092*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
1093*61c4878aSAndroid Build Coastguard Worker   }
1094*61c4878aSAndroid Build Coastguard Worker 
1095*61c4878aSAndroid Build Coastguard Worker   {
1096*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan(2, 0);
1097*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
1098*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, subspan.size());
1099*61c4878aSAndroid Build Coastguard Worker   }
1100*61c4878aSAndroid Build Coastguard Worker 
1101*61c4878aSAndroid Build Coastguard Worker   {
1102*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan(0, 1);
1103*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
1104*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
1105*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
1106*61c4878aSAndroid Build Coastguard Worker   }
1107*61c4878aSAndroid Build Coastguard Worker 
1108*61c4878aSAndroid Build Coastguard Worker   {
1109*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan(1, 1);
1110*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
1111*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
1112*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
1113*61c4878aSAndroid Build Coastguard Worker   }
1114*61c4878aSAndroid Build Coastguard Worker 
1115*61c4878aSAndroid Build Coastguard Worker   {
1116*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan(2, 1);
1117*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 2, subspan.data());
1118*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1u, subspan.size());
1119*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[0]);
1120*61c4878aSAndroid Build Coastguard Worker   }
1121*61c4878aSAndroid Build Coastguard Worker 
1122*61c4878aSAndroid Build Coastguard Worker   {
1123*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan(0, 2);
1124*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
1125*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
1126*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
1127*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
1128*61c4878aSAndroid Build Coastguard Worker   }
1129*61c4878aSAndroid Build Coastguard Worker 
1130*61c4878aSAndroid Build Coastguard Worker   {
1131*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan(1, 2);
1132*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data() + 1, subspan.data());
1133*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2u, subspan.size());
1134*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[0]);
1135*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[1]);
1136*61c4878aSAndroid Build Coastguard Worker   }
1137*61c4878aSAndroid Build Coastguard Worker 
1138*61c4878aSAndroid Build Coastguard Worker   {
1139*61c4878aSAndroid Build Coastguard Worker     auto subspan = span.subspan(0, 3);
1140*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.data(), subspan.data());
1141*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(span.size(), subspan.size());
1142*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(1, subspan[0]);
1143*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(2, subspan[1]);
1144*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3, subspan[2]);
1145*61c4878aSAndroid Build Coastguard Worker   }
1146*61c4878aSAndroid Build Coastguard Worker }
1147*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,Size)1148*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, Size) {
1149*61c4878aSAndroid Build Coastguard Worker   {
1150*61c4878aSAndroid Build Coastguard Worker     span<int> span;
1151*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, span.size());
1152*61c4878aSAndroid Build Coastguard Worker   }
1153*61c4878aSAndroid Build Coastguard Worker 
1154*61c4878aSAndroid Build Coastguard Worker   {
1155*61c4878aSAndroid Build Coastguard Worker     int array[] = {1, 2, 3};
1156*61c4878aSAndroid Build Coastguard Worker     span<int> span(array);
1157*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, span.size());
1158*61c4878aSAndroid Build Coastguard Worker   }
1159*61c4878aSAndroid Build Coastguard Worker }
1160*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,SizeBytes)1161*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, SizeBytes) {
1162*61c4878aSAndroid Build Coastguard Worker   {
1163*61c4878aSAndroid Build Coastguard Worker     span<int> span;
1164*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, span.size_bytes());
1165*61c4878aSAndroid Build Coastguard Worker   }
1166*61c4878aSAndroid Build Coastguard Worker 
1167*61c4878aSAndroid Build Coastguard Worker   {
1168*61c4878aSAndroid Build Coastguard Worker     int array[] = {1, 2, 3};
1169*61c4878aSAndroid Build Coastguard Worker     span<int> span(array);
1170*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(3u * sizeof(int), span.size_bytes());
1171*61c4878aSAndroid Build Coastguard Worker   }
1172*61c4878aSAndroid Build Coastguard Worker }
1173*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,Empty)1174*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, Empty) {
1175*61c4878aSAndroid Build Coastguard Worker   {
1176*61c4878aSAndroid Build Coastguard Worker     span<int> span;
1177*61c4878aSAndroid Build Coastguard Worker     EXPECT_TRUE(span.empty());
1178*61c4878aSAndroid Build Coastguard Worker   }
1179*61c4878aSAndroid Build Coastguard Worker 
1180*61c4878aSAndroid Build Coastguard Worker   {
1181*61c4878aSAndroid Build Coastguard Worker     int array[] = {1, 2, 3};
1182*61c4878aSAndroid Build Coastguard Worker     span<int> span(array);
1183*61c4878aSAndroid Build Coastguard Worker     EXPECT_FALSE(span.empty());
1184*61c4878aSAndroid Build Coastguard Worker   }
1185*61c4878aSAndroid Build Coastguard Worker }
1186*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,OperatorAt)1187*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, OperatorAt) {
1188*61c4878aSAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 6, 1, 8, 0};
1189*61c4878aSAndroid Build Coastguard Worker   constexpr span<const int> span(kArray);
1190*61c4878aSAndroid Build Coastguard Worker 
1191*61c4878aSAndroid Build Coastguard Worker   static_assert(&kArray[0] == &span[0],
1192*61c4878aSAndroid Build Coastguard Worker                 "span[0] does not refer to the same element as kArray[0]");
1193*61c4878aSAndroid Build Coastguard Worker   static_assert(&kArray[1] == &span[1],
1194*61c4878aSAndroid Build Coastguard Worker                 "span[1] does not refer to the same element as kArray[1]");
1195*61c4878aSAndroid Build Coastguard Worker   static_assert(&kArray[2] == &span[2],
1196*61c4878aSAndroid Build Coastguard Worker                 "span[2] does not refer to the same element as kArray[2]");
1197*61c4878aSAndroid Build Coastguard Worker   static_assert(&kArray[3] == &span[3],
1198*61c4878aSAndroid Build Coastguard Worker                 "span[3] does not refer to the same element as kArray[3]");
1199*61c4878aSAndroid Build Coastguard Worker   static_assert(&kArray[4] == &span[4],
1200*61c4878aSAndroid Build Coastguard Worker                 "span[4] does not refer to the same element as kArray[4]");
1201*61c4878aSAndroid Build Coastguard Worker }
1202*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,Front)1203*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, Front) {
1204*61c4878aSAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 6, 1, 8, 0};
1205*61c4878aSAndroid Build Coastguard Worker   constexpr span<const int> span(kArray);
1206*61c4878aSAndroid Build Coastguard Worker   static_assert(&kArray[0] == &span.front(),
1207*61c4878aSAndroid Build Coastguard Worker                 "span.front() does not refer to the same element as kArray[0]");
1208*61c4878aSAndroid Build Coastguard Worker }
1209*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,Back)1210*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, Back) {
1211*61c4878aSAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 6, 1, 8, 0};
1212*61c4878aSAndroid Build Coastguard Worker   constexpr span<const int> span(kArray);
1213*61c4878aSAndroid Build Coastguard Worker   static_assert(&kArray[4] == &span.back(),
1214*61c4878aSAndroid Build Coastguard Worker                 "span.back() does not refer to the same element as kArray[4]");
1215*61c4878aSAndroid Build Coastguard Worker }
1216*61c4878aSAndroid Build Coastguard Worker 
1217*61c4878aSAndroid Build Coastguard Worker // Pigweed: This test uses gMock features not yet supported in Pigweed.
1218*61c4878aSAndroid Build Coastguard Worker #if 0
1219*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, Iterator) {
1220*61c4878aSAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 6, 1, 8, 0};
1221*61c4878aSAndroid Build Coastguard Worker   constexpr span<const int> span(kArray);
1222*61c4878aSAndroid Build Coastguard Worker 
1223*61c4878aSAndroid Build Coastguard Worker   std::vector<int> results;
1224*61c4878aSAndroid Build Coastguard Worker   for (int i : span)
1225*61c4878aSAndroid Build Coastguard Worker     results.emplace_back(i);
1226*61c4878aSAndroid Build Coastguard Worker   EXPECT_THAT(results, ElementsAre(1, 6, 1, 8, 0));
1227*61c4878aSAndroid Build Coastguard Worker }
1228*61c4878aSAndroid Build Coastguard Worker #endif  // 0
1229*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,ConstexprIterator)1230*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, ConstexprIterator) {
1231*61c4878aSAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 6, 1, 8, 0};
1232*61c4878aSAndroid Build Coastguard Worker   constexpr span<const int> span(kArray);
1233*61c4878aSAndroid Build Coastguard Worker 
1234*61c4878aSAndroid Build Coastguard Worker   static_assert(
1235*61c4878aSAndroid Build Coastguard Worker       constexpr_equal(
1236*61c4878aSAndroid Build Coastguard Worker           std::begin(kArray), std::end(kArray), span.begin(), span.end()),
1237*61c4878aSAndroid Build Coastguard Worker       "");
1238*61c4878aSAndroid Build Coastguard Worker   static_assert(1 == span.begin()[0], "");
1239*61c4878aSAndroid Build Coastguard Worker   // Pigweed: These tests assume an iterator object, but Pigweed's span uses a
1240*61c4878aSAndroid Build Coastguard Worker   //          simple pointer.
1241*61c4878aSAndroid Build Coastguard Worker #if 0
1242*61c4878aSAndroid Build Coastguard Worker   static_assert(1 == *(span.begin() += 0), "");
1243*61c4878aSAndroid Build Coastguard Worker   static_assert(6 == *(span.begin() += 1), "");
1244*61c4878aSAndroid Build Coastguard Worker 
1245*61c4878aSAndroid Build Coastguard Worker   static_assert(1 == *((span.begin() + 1) -= 1), "");
1246*61c4878aSAndroid Build Coastguard Worker   static_assert(6 == *((span.begin() + 1) -= 0), "");
1247*61c4878aSAndroid Build Coastguard Worker #endif  // 0
1248*61c4878aSAndroid Build Coastguard Worker }
1249*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,ReverseIterator)1250*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, ReverseIterator) {
1251*61c4878aSAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 6, 1, 8, 0};
1252*61c4878aSAndroid Build Coastguard Worker   constexpr span<const int> span(kArray);
1253*61c4878aSAndroid Build Coastguard Worker 
1254*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::equal(
1255*61c4878aSAndroid Build Coastguard Worker       std::rbegin(kArray), std::rend(kArray), span.rbegin(), span.rend()));
1256*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::equal(std::crbegin(kArray),
1257*61c4878aSAndroid Build Coastguard Worker                          std::crend(kArray),
1258*61c4878aSAndroid Build Coastguard Worker                          std::crbegin(span),
1259*61c4878aSAndroid Build Coastguard Worker                          std::crend(span)));
1260*61c4878aSAndroid Build Coastguard Worker }
1261*61c4878aSAndroid Build Coastguard Worker 
1262*61c4878aSAndroid Build Coastguard Worker // Pigweed: These are tests for make_span, which is not included in Pigweed's
1263*61c4878aSAndroid Build Coastguard Worker //          implementation, since class template deduction is available.
1264*61c4878aSAndroid Build Coastguard Worker #if 0
1265*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, AsBytes) {
1266*61c4878aSAndroid Build Coastguard Worker   {
1267*61c4878aSAndroid Build Coastguard Worker     constexpr int kArray[] = {2, 3, 5, 7, 11, 13};
1268*61c4878aSAndroid Build Coastguard Worker     span<const uint8_t, sizeof(kArray)> bytes_span =
1269*61c4878aSAndroid Build Coastguard Worker         as_bytes(make_span(kArray));
1270*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(reinterpret_cast<const uint8_t*>(kArray), bytes_span.data());
1271*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(sizeof(kArray), bytes_span.size());
1272*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(bytes_span.size(), bytes_span.size_bytes());
1273*61c4878aSAndroid Build Coastguard Worker   }
1274*61c4878aSAndroid Build Coastguard Worker 
1275*61c4878aSAndroid Build Coastguard Worker   {
1276*61c4878aSAndroid Build Coastguard Worker     std::vector<int> vec = {1, 1, 2, 3, 5, 8};
1277*61c4878aSAndroid Build Coastguard Worker     span<int> mutable_span(vec);
1278*61c4878aSAndroid Build Coastguard Worker     span<const uint8_t> bytes_span = as_bytes(mutable_span);
1279*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(reinterpret_cast<const uint8_t*>(vec.data()), bytes_span.data());
1280*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(sizeof(int) * vec.size(), bytes_span.size());
1281*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(bytes_span.size(), bytes_span.size_bytes());
1282*61c4878aSAndroid Build Coastguard Worker   }
1283*61c4878aSAndroid Build Coastguard Worker }
1284*61c4878aSAndroid Build Coastguard Worker 
1285*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, AsWritableBytes) {
1286*61c4878aSAndroid Build Coastguard Worker   std::vector<int> vec = {1, 1, 2, 3, 5, 8};
1287*61c4878aSAndroid Build Coastguard Worker   span<int> mutable_span(vec);
1288*61c4878aSAndroid Build Coastguard Worker   span<uint8_t> writable_bytes_span = as_writable_bytes(mutable_span);
1289*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(reinterpret_cast<uint8_t*>(vec.data()), writable_bytes_span.data());
1290*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(sizeof(int) * vec.size(), writable_bytes_span.size());
1291*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(writable_bytes_span.size(), writable_bytes_span.size_bytes());
1292*61c4878aSAndroid Build Coastguard Worker 
1293*61c4878aSAndroid Build Coastguard Worker   // Set the first entry of vec to zero while writing through the span.
1294*61c4878aSAndroid Build Coastguard Worker   std::fill(writable_bytes_span.data(),
1295*61c4878aSAndroid Build Coastguard Worker             writable_bytes_span.data() + sizeof(int), 0);
1296*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(0, vec[0]);
1297*61c4878aSAndroid Build Coastguard Worker }
1298*61c4878aSAndroid Build Coastguard Worker 
1299*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromDataAndSize) {
1300*61c4878aSAndroid Build Coastguard Worker   int* nullint = nullptr;
1301*61c4878aSAndroid Build Coastguard Worker   auto empty_span = make_span(nullint, 0);
1302*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(empty_span.empty());
1303*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, empty_span.data());
1304*61c4878aSAndroid Build Coastguard Worker 
1305*61c4878aSAndroid Build Coastguard Worker   std::vector<int> vector = {1, 1, 2, 3, 5, 8};
1306*61c4878aSAndroid Build Coastguard Worker   span<int> expected_span(vector.data(), vector.size());
1307*61c4878aSAndroid Build Coastguard Worker   auto made_span = make_span(vector.data(), vector.size());
1308*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.data(), made_span.data());
1309*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.size(), made_span.size());
1310*61c4878aSAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == dynamic_extent, "");
1311*61c4878aSAndroid Build Coastguard Worker   static_assert(
1312*61c4878aSAndroid Build Coastguard Worker       std::is_same<decltype(expected_span), decltype(made_span)>::value,
1313*61c4878aSAndroid Build Coastguard Worker       "the type of made_span differs from expected_span!");
1314*61c4878aSAndroid Build Coastguard Worker }
1315*61c4878aSAndroid Build Coastguard Worker 
1316*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromPointerPair) {
1317*61c4878aSAndroid Build Coastguard Worker   int* nullint = nullptr;
1318*61c4878aSAndroid Build Coastguard Worker   auto empty_span = make_span(nullint, nullint);
1319*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(empty_span.empty());
1320*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, empty_span.data());
1321*61c4878aSAndroid Build Coastguard Worker 
1322*61c4878aSAndroid Build Coastguard Worker   std::vector<int> vector = {1, 1, 2, 3, 5, 8};
1323*61c4878aSAndroid Build Coastguard Worker   span<int> expected_span(vector.data(), vector.size());
1324*61c4878aSAndroid Build Coastguard Worker   auto made_span = make_span(vector.data(), vector.data() + vector.size());
1325*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.data(), made_span.data());
1326*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.size(), made_span.size());
1327*61c4878aSAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == dynamic_extent, "");
1328*61c4878aSAndroid Build Coastguard Worker   static_assert(
1329*61c4878aSAndroid Build Coastguard Worker       std::is_same<decltype(expected_span), decltype(made_span)>::value,
1330*61c4878aSAndroid Build Coastguard Worker       "the type of made_span differs from expected_span!");
1331*61c4878aSAndroid Build Coastguard Worker }
1332*61c4878aSAndroid Build Coastguard Worker 
1333*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromConstexprArray) {
1334*61c4878aSAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 2, 3, 4, 5};
1335*61c4878aSAndroid Build Coastguard Worker   constexpr span<const int, 5> expected_span(kArray);
1336*61c4878aSAndroid Build Coastguard Worker   constexpr auto made_span = make_span(kArray);
1337*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.data(), made_span.data());
1338*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.size(), made_span.size());
1339*61c4878aSAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == 5, "");
1340*61c4878aSAndroid Build Coastguard Worker   static_assert(
1341*61c4878aSAndroid Build Coastguard Worker       std::is_same<decltype(expected_span), decltype(made_span)>::value,
1342*61c4878aSAndroid Build Coastguard Worker       "the type of made_span differs from expected_span!");
1343*61c4878aSAndroid Build Coastguard Worker }
1344*61c4878aSAndroid Build Coastguard Worker 
1345*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromStdArray) {
1346*61c4878aSAndroid Build Coastguard Worker   const std::array<int, 5> kArray = {{1, 2, 3, 4, 5}};
1347*61c4878aSAndroid Build Coastguard Worker   span<const int, 5> expected_span(kArray);
1348*61c4878aSAndroid Build Coastguard Worker   auto made_span = make_span(kArray);
1349*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.data(), made_span.data());
1350*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.size(), made_span.size());
1351*61c4878aSAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == 5, "");
1352*61c4878aSAndroid Build Coastguard Worker   static_assert(
1353*61c4878aSAndroid Build Coastguard Worker       std::is_same<decltype(expected_span), decltype(made_span)>::value,
1354*61c4878aSAndroid Build Coastguard Worker       "the type of made_span differs from expected_span!");
1355*61c4878aSAndroid Build Coastguard Worker }
1356*61c4878aSAndroid Build Coastguard Worker 
1357*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromConstContainer) {
1358*61c4878aSAndroid Build Coastguard Worker   const std::vector<int> vector = {-1, -2, -3, -4, -5};
1359*61c4878aSAndroid Build Coastguard Worker   span<const int> expected_span(vector);
1360*61c4878aSAndroid Build Coastguard Worker   auto made_span = make_span(vector);
1361*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.data(), made_span.data());
1362*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.size(), made_span.size());
1363*61c4878aSAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == dynamic_extent, "");
1364*61c4878aSAndroid Build Coastguard Worker   static_assert(
1365*61c4878aSAndroid Build Coastguard Worker       std::is_same<decltype(expected_span), decltype(made_span)>::value,
1366*61c4878aSAndroid Build Coastguard Worker       "the type of made_span differs from expected_span!");
1367*61c4878aSAndroid Build Coastguard Worker }
1368*61c4878aSAndroid Build Coastguard Worker 
1369*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, MakeStaticSpanFromConstContainer) {
1370*61c4878aSAndroid Build Coastguard Worker   const std::vector<int> vector = {-1, -2, -3, -4, -5};
1371*61c4878aSAndroid Build Coastguard Worker   span<const int, 5> expected_span(vector.data(), vector.size());
1372*61c4878aSAndroid Build Coastguard Worker   auto made_span = make_span<5>(vector);
1373*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.data(), made_span.data());
1374*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.size(), made_span.size());
1375*61c4878aSAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == 5, "");
1376*61c4878aSAndroid Build Coastguard Worker   static_assert(
1377*61c4878aSAndroid Build Coastguard Worker       std::is_same<decltype(expected_span), decltype(made_span)>::value,
1378*61c4878aSAndroid Build Coastguard Worker       "the type of made_span differs from expected_span!");
1379*61c4878aSAndroid Build Coastguard Worker }
1380*61c4878aSAndroid Build Coastguard Worker 
1381*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromContainer) {
1382*61c4878aSAndroid Build Coastguard Worker   std::vector<int> vector = {-1, -2, -3, -4, -5};
1383*61c4878aSAndroid Build Coastguard Worker   span<int> expected_span(vector);
1384*61c4878aSAndroid Build Coastguard Worker   auto made_span = make_span(vector);
1385*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.data(), made_span.data());
1386*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.size(), made_span.size());
1387*61c4878aSAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == dynamic_extent, "");
1388*61c4878aSAndroid Build Coastguard Worker   static_assert(
1389*61c4878aSAndroid Build Coastguard Worker       std::is_same<decltype(expected_span), decltype(made_span)>::value,
1390*61c4878aSAndroid Build Coastguard Worker       "the type of made_span differs from expected_span!");
1391*61c4878aSAndroid Build Coastguard Worker }
1392*61c4878aSAndroid Build Coastguard Worker 
1393*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, MakeStaticSpanFromContainer) {
1394*61c4878aSAndroid Build Coastguard Worker   std::vector<int> vector = {-1, -2, -3, -4, -5};
1395*61c4878aSAndroid Build Coastguard Worker   span<int, 5> expected_span(vector.data(), vector.size());
1396*61c4878aSAndroid Build Coastguard Worker   auto made_span = make_span<5>(vector);
1397*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.data(), make_span<5>(vector).data());
1398*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.size(), make_span<5>(vector).size());
1399*61c4878aSAndroid Build Coastguard Worker   static_assert(decltype(make_span<5>(vector))::extent == 5, "");
1400*61c4878aSAndroid Build Coastguard Worker   static_assert(
1401*61c4878aSAndroid Build Coastguard Worker       std::is_same<decltype(expected_span), decltype(made_span)>::value,
1402*61c4878aSAndroid Build Coastguard Worker       "the type of made_span differs from expected_span!");
1403*61c4878aSAndroid Build Coastguard Worker }
1404*61c4878aSAndroid Build Coastguard Worker 
1405*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, MakeStaticSpanFromConstexprContainer) {
1406*61c4878aSAndroid Build Coastguard Worker   constexpr StringPiece str = "Hello, World";
1407*61c4878aSAndroid Build Coastguard Worker   constexpr auto made_span = make_span<12>(str);
1408*61c4878aSAndroid Build Coastguard Worker   static_assert(str.data() == made_span.data(), "Error: data() does not match");
1409*61c4878aSAndroid Build Coastguard Worker   static_assert(str.size() == made_span.size(), "Error: size() does not match");
1410*61c4878aSAndroid Build Coastguard Worker   static_assert(std::is_same<decltype(str)::value_type,
1411*61c4878aSAndroid Build Coastguard Worker                              decltype(made_span)::value_type>::value,
1412*61c4878aSAndroid Build Coastguard Worker                 "Error: value_type does not match");
1413*61c4878aSAndroid Build Coastguard Worker   static_assert(str.size() == decltype(made_span)::extent,
1414*61c4878aSAndroid Build Coastguard Worker                 "Error: extent does not match");
1415*61c4878aSAndroid Build Coastguard Worker }
1416*61c4878aSAndroid Build Coastguard Worker 
1417*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromRValueContainer) {
1418*61c4878aSAndroid Build Coastguard Worker   std::vector<int> vector = {-1, -2, -3, -4, -5};
1419*61c4878aSAndroid Build Coastguard Worker   span<const int> expected_span(vector);
1420*61c4878aSAndroid Build Coastguard Worker   // Note: While static_cast<T&&>(foo) is effectively just a fancy spelling of
1421*61c4878aSAndroid Build Coastguard Worker   // std::move(foo), make_span does not actually take ownership of the passed in
1422*61c4878aSAndroid Build Coastguard Worker   // container. Writing it this way makes it more obvious that we simply care
1423*61c4878aSAndroid Build Coastguard Worker   // about the right behavour when passing rvalues.
1424*61c4878aSAndroid Build Coastguard Worker   auto made_span = make_span(static_cast<std::vector<int>&&>(vector));
1425*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.data(), made_span.data());
1426*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.size(), made_span.size());
1427*61c4878aSAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == dynamic_extent, "");
1428*61c4878aSAndroid Build Coastguard Worker   static_assert(
1429*61c4878aSAndroid Build Coastguard Worker       std::is_same<decltype(expected_span), decltype(made_span)>::value,
1430*61c4878aSAndroid Build Coastguard Worker       "the type of made_span differs from expected_span!");
1431*61c4878aSAndroid Build Coastguard Worker }
1432*61c4878aSAndroid Build Coastguard Worker 
1433*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, MakeStaticSpanFromRValueContainer) {
1434*61c4878aSAndroid Build Coastguard Worker   std::vector<int> vector = {-1, -2, -3, -4, -5};
1435*61c4878aSAndroid Build Coastguard Worker   span<const int, 5> expected_span(vector.data(), vector.size());
1436*61c4878aSAndroid Build Coastguard Worker   // Note: While static_cast<T&&>(foo) is effectively just a fancy spelling of
1437*61c4878aSAndroid Build Coastguard Worker   // std::move(foo), make_span does not actually take ownership of the passed in
1438*61c4878aSAndroid Build Coastguard Worker   // container. Writing it this way makes it more obvious that we simply care
1439*61c4878aSAndroid Build Coastguard Worker   // about the right behavour when passing rvalues.
1440*61c4878aSAndroid Build Coastguard Worker   auto made_span = make_span<5>(static_cast<std::vector<int>&&>(vector));
1441*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.data(), made_span.data());
1442*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(expected_span.size(), made_span.size());
1443*61c4878aSAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == 5, "");
1444*61c4878aSAndroid Build Coastguard Worker   static_assert(
1445*61c4878aSAndroid Build Coastguard Worker       std::is_same<decltype(expected_span), decltype(made_span)>::value,
1446*61c4878aSAndroid Build Coastguard Worker       "the type of made_span differs from expected_span!");
1447*61c4878aSAndroid Build Coastguard Worker }
1448*61c4878aSAndroid Build Coastguard Worker 
1449*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromDynamicSpan) {
1450*61c4878aSAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 2, 3, 4, 5};
1451*61c4878aSAndroid Build Coastguard Worker   constexpr span<const int> expected_span(kArray);
1452*61c4878aSAndroid Build Coastguard Worker   constexpr auto made_span = make_span(expected_span);
1453*61c4878aSAndroid Build Coastguard Worker   static_assert(std::is_same<decltype(expected_span)::element_type,
1454*61c4878aSAndroid Build Coastguard Worker                              decltype(made_span)::element_type>::value,
1455*61c4878aSAndroid Build Coastguard Worker                 "make_span(span) should have the same element_type as span");
1456*61c4878aSAndroid Build Coastguard Worker 
1457*61c4878aSAndroid Build Coastguard Worker   static_assert(expected_span.data() == made_span.data(),
1458*61c4878aSAndroid Build Coastguard Worker                 "make_span(span) should have the same data() as span");
1459*61c4878aSAndroid Build Coastguard Worker 
1460*61c4878aSAndroid Build Coastguard Worker   static_assert(expected_span.size() == made_span.size(),
1461*61c4878aSAndroid Build Coastguard Worker                 "make_span(span) should have the same size() as span");
1462*61c4878aSAndroid Build Coastguard Worker 
1463*61c4878aSAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == decltype(expected_span)::extent,
1464*61c4878aSAndroid Build Coastguard Worker                 "make_span(span) should have the same extent as span");
1465*61c4878aSAndroid Build Coastguard Worker 
1466*61c4878aSAndroid Build Coastguard Worker   static_assert(
1467*61c4878aSAndroid Build Coastguard Worker       std::is_same<decltype(expected_span), decltype(made_span)>::value,
1468*61c4878aSAndroid Build Coastguard Worker       "the type of made_span differs from expected_span!");
1469*61c4878aSAndroid Build Coastguard Worker }
1470*61c4878aSAndroid Build Coastguard Worker 
1471*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, MakeSpanFromStaticSpan) {
1472*61c4878aSAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 2, 3, 4, 5};
1473*61c4878aSAndroid Build Coastguard Worker   constexpr span<const int, 5> expected_span(kArray);
1474*61c4878aSAndroid Build Coastguard Worker   constexpr auto made_span = make_span(expected_span);
1475*61c4878aSAndroid Build Coastguard Worker   static_assert(std::is_same<decltype(expected_span)::element_type,
1476*61c4878aSAndroid Build Coastguard Worker                              decltype(made_span)::element_type>::value,
1477*61c4878aSAndroid Build Coastguard Worker                 "make_span(span) should have the same element_type as span");
1478*61c4878aSAndroid Build Coastguard Worker 
1479*61c4878aSAndroid Build Coastguard Worker   static_assert(expected_span.data() == made_span.data(),
1480*61c4878aSAndroid Build Coastguard Worker                 "make_span(span) should have the same data() as span");
1481*61c4878aSAndroid Build Coastguard Worker 
1482*61c4878aSAndroid Build Coastguard Worker   static_assert(expected_span.size() == made_span.size(),
1483*61c4878aSAndroid Build Coastguard Worker                 "make_span(span) should have the same size() as span");
1484*61c4878aSAndroid Build Coastguard Worker 
1485*61c4878aSAndroid Build Coastguard Worker   static_assert(decltype(made_span)::extent == decltype(expected_span)::extent,
1486*61c4878aSAndroid Build Coastguard Worker                 "make_span(span) should have the same extent as span");
1487*61c4878aSAndroid Build Coastguard Worker 
1488*61c4878aSAndroid Build Coastguard Worker   static_assert(
1489*61c4878aSAndroid Build Coastguard Worker       std::is_same<decltype(expected_span), decltype(made_span)>::value,
1490*61c4878aSAndroid Build Coastguard Worker       "the type of made_span differs from expected_span!");
1491*61c4878aSAndroid Build Coastguard Worker }
1492*61c4878aSAndroid Build Coastguard Worker #endif  // 0
1493*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,EnsureConstexprGoodness)1494*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, EnsureConstexprGoodness) {
1495*61c4878aSAndroid Build Coastguard Worker   static constexpr int kArray[] = {5, 4, 3, 2, 1};
1496*61c4878aSAndroid Build Coastguard Worker   constexpr span<const int> constexpr_span(kArray);
1497*61c4878aSAndroid Build Coastguard Worker   const size_t size = 2;
1498*61c4878aSAndroid Build Coastguard Worker 
1499*61c4878aSAndroid Build Coastguard Worker   const size_t start = 1;
1500*61c4878aSAndroid Build Coastguard Worker   constexpr span<const int> subspan =
1501*61c4878aSAndroid Build Coastguard Worker       constexpr_span.subspan(start, start + size);
1502*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < subspan.size(); ++i)
1503*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(kArray[start + i], subspan[i]);
1504*61c4878aSAndroid Build Coastguard Worker 
1505*61c4878aSAndroid Build Coastguard Worker   constexpr span<const int> firsts = constexpr_span.first(size);
1506*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < firsts.size(); ++i)
1507*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(kArray[i], firsts[i]);
1508*61c4878aSAndroid Build Coastguard Worker 
1509*61c4878aSAndroid Build Coastguard Worker   constexpr span<const int> lasts = constexpr_span.last(size);
1510*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < lasts.size(); ++i) {
1511*61c4878aSAndroid Build Coastguard Worker     const size_t j = (std::size(kArray) - size) + i;
1512*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(kArray[j], lasts[i]);
1513*61c4878aSAndroid Build Coastguard Worker   }
1514*61c4878aSAndroid Build Coastguard Worker 
1515*61c4878aSAndroid Build Coastguard Worker   constexpr int item = constexpr_span[size];
1516*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(kArray[size], item);
1517*61c4878aSAndroid Build Coastguard Worker }
1518*61c4878aSAndroid Build Coastguard Worker 
1519*61c4878aSAndroid Build Coastguard Worker #if 0
1520*61c4878aSAndroid Build Coastguard Worker 
1521*61c4878aSAndroid Build Coastguard Worker // Pigweed: Death tests are not yet supported.
1522*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, OutOfBoundsDeath) {
1523*61c4878aSAndroid Build Coastguard Worker   constexpr span<int, 0> kEmptySpan;
1524*61c4878aSAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kEmptySpan[0], "");
1525*61c4878aSAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kEmptySpan.first(1), "");
1526*61c4878aSAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kEmptySpan.last(1), "");
1527*61c4878aSAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kEmptySpan.subspan(1), "");
1528*61c4878aSAndroid Build Coastguard Worker 
1529*61c4878aSAndroid Build Coastguard Worker   constexpr span<int> kEmptyDynamicSpan;
1530*61c4878aSAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kEmptyDynamicSpan[0], "");
1531*61c4878aSAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kEmptyDynamicSpan.front(), "");
1532*61c4878aSAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kEmptyDynamicSpan.first(1), "");
1533*61c4878aSAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kEmptyDynamicSpan.last(1), "");
1534*61c4878aSAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kEmptyDynamicSpan.back(), "");
1535*61c4878aSAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kEmptyDynamicSpan.subspan(1), "");
1536*61c4878aSAndroid Build Coastguard Worker 
1537*61c4878aSAndroid Build Coastguard Worker   static constexpr int kArray[] = {0, 1, 2};
1538*61c4878aSAndroid Build Coastguard Worker   constexpr span<const int> kNonEmptyDynamicSpan(kArray);
1539*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(3U, kNonEmptyDynamicSpan.size());
1540*61c4878aSAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kNonEmptyDynamicSpan[4], "");
1541*61c4878aSAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kNonEmptyDynamicSpan.subspan(10), "");
1542*61c4878aSAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED(kNonEmptyDynamicSpan.subspan(1, 7), "");
1543*61c4878aSAndroid Build Coastguard Worker }
1544*61c4878aSAndroid Build Coastguard Worker 
1545*61c4878aSAndroid Build Coastguard Worker // Pigweed: These tests use CheckedContiguousConstIterator, which isn't used in
1546*61c4878aSAndroid Build Coastguard Worker //          Pigweed's version.
1547*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, IteratorIsRangeMoveSafe) {
1548*61c4878aSAndroid Build Coastguard Worker   static constexpr int kArray[] = {1, 6, 1, 8, 0};
1549*61c4878aSAndroid Build Coastguard Worker   const size_t kNumElements = 5;
1550*61c4878aSAndroid Build Coastguard Worker   constexpr span<const int> span(kArray);
1551*61c4878aSAndroid Build Coastguard Worker 
1552*61c4878aSAndroid Build Coastguard Worker   static constexpr int kOverlappingStartIndexes[] = {-4, 0, 3, 4};
1553*61c4878aSAndroid Build Coastguard Worker   static constexpr int kNonOverlappingStartIndexes[] = {-7, -5, 5, 7};
1554*61c4878aSAndroid Build Coastguard Worker 
1555*61c4878aSAndroid Build Coastguard Worker   // Overlapping ranges.
1556*61c4878aSAndroid Build Coastguard Worker   for (const int dest_start_index : kOverlappingStartIndexes) {
1557*61c4878aSAndroid Build Coastguard Worker     EXPECT_FALSE(CheckedContiguousIterator<const int>::IsRangeMoveSafe(
1558*61c4878aSAndroid Build Coastguard Worker         span.begin(), span.end(),
1559*61c4878aSAndroid Build Coastguard Worker         CheckedContiguousIterator<const int>(
1560*61c4878aSAndroid Build Coastguard Worker             span.data() + dest_start_index,
1561*61c4878aSAndroid Build Coastguard Worker             span.data() + dest_start_index + kNumElements)));
1562*61c4878aSAndroid Build Coastguard Worker     EXPECT_FALSE(CheckedContiguousConstIterator<const int>::IsRangeMoveSafe(
1563*61c4878aSAndroid Build Coastguard Worker         std::cbegin(span), std::cend(span),
1564*61c4878aSAndroid Build Coastguard Worker         CheckedContiguousConstIterator<const int>(
1565*61c4878aSAndroid Build Coastguard Worker             span.data() + dest_start_index,
1566*61c4878aSAndroid Build Coastguard Worker             span.data() + dest_start_index + kNumElements)));
1567*61c4878aSAndroid Build Coastguard Worker   }
1568*61c4878aSAndroid Build Coastguard Worker 
1569*61c4878aSAndroid Build Coastguard Worker   // Non-overlapping ranges.
1570*61c4878aSAndroid Build Coastguard Worker   for (const int dest_start_index : kNonOverlappingStartIndexes) {
1571*61c4878aSAndroid Build Coastguard Worker     EXPECT_TRUE(CheckedContiguousIterator<const int>::IsRangeMoveSafe(
1572*61c4878aSAndroid Build Coastguard Worker         span.begin(), span.end(),
1573*61c4878aSAndroid Build Coastguard Worker         CheckedContiguousIterator<const int>(
1574*61c4878aSAndroid Build Coastguard Worker             span.data() + dest_start_index,
1575*61c4878aSAndroid Build Coastguard Worker             span.data() + dest_start_index + kNumElements)));
1576*61c4878aSAndroid Build Coastguard Worker     EXPECT_TRUE(CheckedContiguousConstIterator<const int>::IsRangeMoveSafe(
1577*61c4878aSAndroid Build Coastguard Worker         std::cbegin(span), std::cend(span),
1578*61c4878aSAndroid Build Coastguard Worker         CheckedContiguousConstIterator<const int>(
1579*61c4878aSAndroid Build Coastguard Worker             span.data() + dest_start_index,
1580*61c4878aSAndroid Build Coastguard Worker             span.data() + dest_start_index + kNumElements)));
1581*61c4878aSAndroid Build Coastguard Worker   }
1582*61c4878aSAndroid Build Coastguard Worker 
1583*61c4878aSAndroid Build Coastguard Worker   // IsRangeMoveSafe is true if the length to be moved is 0.
1584*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(CheckedContiguousIterator<const int>::IsRangeMoveSafe(
1585*61c4878aSAndroid Build Coastguard Worker       span.begin(), span.begin(),
1586*61c4878aSAndroid Build Coastguard Worker       CheckedContiguousIterator<const int>(span.data(), span.data())));
1587*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(CheckedContiguousConstIterator<const int>::IsRangeMoveSafe(
1588*61c4878aSAndroid Build Coastguard Worker       std::cbegin(span), std::cbegin(span),
1589*61c4878aSAndroid Build Coastguard Worker       CheckedContiguousConstIterator<const int>(span.data(), span.data())));
1590*61c4878aSAndroid Build Coastguard Worker 
1591*61c4878aSAndroid Build Coastguard Worker   // IsRangeMoveSafe is false if end < begin.
1592*61c4878aSAndroid Build Coastguard Worker   EXPECT_FALSE(CheckedContiguousIterator<const int>::IsRangeMoveSafe(
1593*61c4878aSAndroid Build Coastguard Worker       span.end(), span.begin(),
1594*61c4878aSAndroid Build Coastguard Worker       CheckedContiguousIterator<const int>(span.data(), span.data())));
1595*61c4878aSAndroid Build Coastguard Worker   EXPECT_FALSE(CheckedContiguousConstIterator<const int>::IsRangeMoveSafe(
1596*61c4878aSAndroid Build Coastguard Worker       std::cend(span), std::cbegin(span),
1597*61c4878aSAndroid Build Coastguard Worker       CheckedContiguousConstIterator<const int>(span.data(), span.data())));
1598*61c4878aSAndroid Build Coastguard Worker }
1599*61c4878aSAndroid Build Coastguard Worker 
1600*61c4878aSAndroid Build Coastguard Worker // Pigweed: gMock matchers are not yet supported.
1601*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, Sort) {
1602*61c4878aSAndroid Build Coastguard Worker   int array[] = {5, 4, 3, 2, 1};
1603*61c4878aSAndroid Build Coastguard Worker 
1604*61c4878aSAndroid Build Coastguard Worker   span<int> dynamic_span = array;
1605*61c4878aSAndroid Build Coastguard Worker   std::sort(dynamic_span.begin(), dynamic_span.end());
1606*61c4878aSAndroid Build Coastguard Worker   EXPECT_THAT(array, ElementsAre(1, 2, 3, 4, 5));
1607*61c4878aSAndroid Build Coastguard Worker   std::sort(dynamic_span.rbegin(), dynamic_span.rend());
1608*61c4878aSAndroid Build Coastguard Worker   EXPECT_THAT(array, ElementsAre(5, 4, 3, 2, 1));
1609*61c4878aSAndroid Build Coastguard Worker 
1610*61c4878aSAndroid Build Coastguard Worker   span<int, 5> static_span = array;
1611*61c4878aSAndroid Build Coastguard Worker   std::sort(static_span.rbegin(), static_span.rend(), std::greater<>());
1612*61c4878aSAndroid Build Coastguard Worker   EXPECT_THAT(array, ElementsAre(1, 2, 3, 4, 5));
1613*61c4878aSAndroid Build Coastguard Worker   std::sort(static_span.begin(), static_span.end(), std::greater<>());
1614*61c4878aSAndroid Build Coastguard Worker   EXPECT_THAT(array, ElementsAre(5, 4, 3, 2, 1));
1615*61c4878aSAndroid Build Coastguard Worker }
1616*61c4878aSAndroid Build Coastguard Worker #endif  // 0
1617*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,SpanExtentConversions)1618*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, SpanExtentConversions) {
1619*61c4878aSAndroid Build Coastguard Worker   // Statically checks that various conversions between spans of dynamic and
1620*61c4878aSAndroid Build Coastguard Worker   // static extent are possible or not.
1621*61c4878aSAndroid Build Coastguard Worker 
1622*61c4878aSAndroid Build Coastguard Worker   // This test fails with the real C++20 std::span, so skip it.
1623*61c4878aSAndroid Build Coastguard Worker   // static_assert(
1624*61c4878aSAndroid Build Coastguard Worker   //     !std::is_constructible<span<int, 0>, span<int>>::value,
1625*61c4878aSAndroid Build Coastguard Worker   //     "Error: static span should not be constructible from dynamic span");
1626*61c4878aSAndroid Build Coastguard Worker 
1627*61c4878aSAndroid Build Coastguard Worker   static_assert(!std::is_constructible<span<int, 2>, span<int, 1>>::value,
1628*61c4878aSAndroid Build Coastguard Worker                 "Error: static span should not be constructible from static "
1629*61c4878aSAndroid Build Coastguard Worker                 "span with different extent");
1630*61c4878aSAndroid Build Coastguard Worker 
1631*61c4878aSAndroid Build Coastguard Worker   static_assert(std::is_convertible<span<int, 0>, span<int>>::value,
1632*61c4878aSAndroid Build Coastguard Worker                 "Error: static span should be convertible to dynamic span");
1633*61c4878aSAndroid Build Coastguard Worker 
1634*61c4878aSAndroid Build Coastguard Worker   static_assert(std::is_convertible<span<int>, span<int>>::value,
1635*61c4878aSAndroid Build Coastguard Worker                 "Error: dynamic span should be convertible to dynamic span");
1636*61c4878aSAndroid Build Coastguard Worker 
1637*61c4878aSAndroid Build Coastguard Worker   static_assert(std::is_convertible<span<int, 2>, span<int, 2>>::value,
1638*61c4878aSAndroid Build Coastguard Worker                 "Error: static span should be convertible to static span");
1639*61c4878aSAndroid Build Coastguard Worker }
1640*61c4878aSAndroid Build Coastguard Worker 
TEST(SpanTest,IteratorConversions)1641*61c4878aSAndroid Build Coastguard Worker TEST(SpanTest, IteratorConversions) {
1642*61c4878aSAndroid Build Coastguard Worker   static_assert(std::is_convertible<span<int>::iterator,
1643*61c4878aSAndroid Build Coastguard Worker                                     span<const int>::iterator>::value,
1644*61c4878aSAndroid Build Coastguard Worker                 "Error: iterator should be convertible to const iterator");
1645*61c4878aSAndroid Build Coastguard Worker 
1646*61c4878aSAndroid Build Coastguard Worker   static_assert(!std::is_convertible<span<const int>::iterator,
1647*61c4878aSAndroid Build Coastguard Worker                                      span<int>::iterator>::value,
1648*61c4878aSAndroid Build Coastguard Worker                 "Error: const iterator should not be convertible to iterator");
1649*61c4878aSAndroid Build Coastguard Worker }
1650*61c4878aSAndroid Build Coastguard Worker 
1651*61c4878aSAndroid Build Coastguard Worker // NOLINTEND(modernize-unary-static-assert)
1652*61c4878aSAndroid Build Coastguard Worker 
1653*61c4878aSAndroid Build Coastguard Worker }  // namespace pw
1654