xref: /aosp_15_r20/external/webrtc/api/array_view_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright 2015 The WebRTC Project Authors. All rights reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #include "api/array_view.h"
12*d9f75844SAndroid Build Coastguard Worker 
13*d9f75844SAndroid Build Coastguard Worker #include <algorithm>
14*d9f75844SAndroid Build Coastguard Worker #include <array>
15*d9f75844SAndroid Build Coastguard Worker #include <string>
16*d9f75844SAndroid Build Coastguard Worker #include <utility>
17*d9f75844SAndroid Build Coastguard Worker #include <vector>
18*d9f75844SAndroid Build Coastguard Worker 
19*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/buffer.h"
20*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h"
21*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/gunit.h"
22*d9f75844SAndroid Build Coastguard Worker #include "test/gmock.h"
23*d9f75844SAndroid Build Coastguard Worker 
24*d9f75844SAndroid Build Coastguard Worker namespace rtc {
25*d9f75844SAndroid Build Coastguard Worker 
26*d9f75844SAndroid Build Coastguard Worker namespace {
27*d9f75844SAndroid Build Coastguard Worker 
28*d9f75844SAndroid Build Coastguard Worker using ::testing::ElementsAre;
29*d9f75844SAndroid Build Coastguard Worker using ::testing::IsEmpty;
30*d9f75844SAndroid Build Coastguard Worker 
31*d9f75844SAndroid Build Coastguard Worker template <typename T>
Call(ArrayView<T> av)32*d9f75844SAndroid Build Coastguard Worker size_t Call(ArrayView<T> av) {
33*d9f75844SAndroid Build Coastguard Worker   return av.size();
34*d9f75844SAndroid Build Coastguard Worker }
35*d9f75844SAndroid Build Coastguard Worker 
36*d9f75844SAndroid Build Coastguard Worker template <typename T, size_t N>
CallFixed(ArrayView<T,N> av)37*d9f75844SAndroid Build Coastguard Worker void CallFixed(ArrayView<T, N> av) {}
38*d9f75844SAndroid Build Coastguard Worker 
39*d9f75844SAndroid Build Coastguard Worker }  // namespace
40*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewDeathTest,TestConstructFromPtrAndArray)41*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewDeathTest, TestConstructFromPtrAndArray) {
42*d9f75844SAndroid Build Coastguard Worker   char arr[] = "Arrr!";
43*d9f75844SAndroid Build Coastguard Worker   const char carr[] = "Carrr!";
44*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, Call<const char>(arr));
45*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(7u, Call<const char>(carr));
46*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, Call<char>(arr));
47*d9f75844SAndroid Build Coastguard Worker   // Call<char>(carr);  // Compile error, because can't drop const.
48*d9f75844SAndroid Build Coastguard Worker   // Call<int>(arr);  // Compile error, because incompatible types.
49*d9f75844SAndroid Build Coastguard Worker   ArrayView<int*> x;
50*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0u, x.size());
51*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, x.data());
52*d9f75844SAndroid Build Coastguard Worker   ArrayView<char> y = arr;
53*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, y.size());
54*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, y.data());
55*d9f75844SAndroid Build Coastguard Worker   ArrayView<char, 6> yf = arr;
56*d9f75844SAndroid Build Coastguard Worker   static_assert(yf.size() == 6, "");
57*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, yf.data());
58*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char> z(arr + 1, 3);
59*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(3u, z.size());
60*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr + 1, z.data());
61*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char, 3> zf(arr + 1, 3);
62*d9f75844SAndroid Build Coastguard Worker   static_assert(zf.size() == 3, "");
63*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr + 1, zf.data());
64*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char> w(arr, 2);
65*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(2u, w.size());
66*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, w.data());
67*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char, 2> wf(arr, 2);
68*d9f75844SAndroid Build Coastguard Worker   static_assert(wf.size() == 2, "");
69*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, wf.data());
70*d9f75844SAndroid Build Coastguard Worker   ArrayView<char> q(arr, 0);
71*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0u, q.size());
72*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, q.data());
73*d9f75844SAndroid Build Coastguard Worker   ArrayView<char, 0> qf(arr, 0);
74*d9f75844SAndroid Build Coastguard Worker   static_assert(qf.size() == 0, "");
75*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, qf.data());
76*d9f75844SAndroid Build Coastguard Worker #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
77*d9f75844SAndroid Build Coastguard Worker   // DCHECK error (nullptr with nonzero size).
78*d9f75844SAndroid Build Coastguard Worker   EXPECT_DEATH(ArrayView<int>(static_cast<int*>(nullptr), 5), "");
79*d9f75844SAndroid Build Coastguard Worker #endif
80*d9f75844SAndroid Build Coastguard Worker   // These are compile errors, because incompatible types.
81*d9f75844SAndroid Build Coastguard Worker   // ArrayView<int> m = arr;
82*d9f75844SAndroid Build Coastguard Worker   // ArrayView<float> n(arr + 2, 2);
83*d9f75844SAndroid Build Coastguard Worker }
84*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestCopyConstructorVariableLvalue)85*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestCopyConstructorVariableLvalue) {
86*d9f75844SAndroid Build Coastguard Worker   char arr[] = "Arrr!";
87*d9f75844SAndroid Build Coastguard Worker   ArrayView<char> x = arr;
88*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, x.size());
89*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, x.data());
90*d9f75844SAndroid Build Coastguard Worker   ArrayView<char> y = x;  // Copy non-const -> non-const.
91*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, y.size());
92*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, y.data());
93*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char> z = x;  // Copy non-const -> const.
94*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, z.size());
95*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, z.data());
96*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char> w = z;  // Copy const -> const.
97*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, w.size());
98*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, w.data());
99*d9f75844SAndroid Build Coastguard Worker   // ArrayView<char> v = z;  // Compile error, because can't drop const.
100*d9f75844SAndroid Build Coastguard Worker }
101*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestCopyConstructorVariableRvalue)102*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestCopyConstructorVariableRvalue) {
103*d9f75844SAndroid Build Coastguard Worker   char arr[] = "Arrr!";
104*d9f75844SAndroid Build Coastguard Worker   ArrayView<char> x = arr;
105*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, x.size());
106*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, x.data());
107*d9f75844SAndroid Build Coastguard Worker   ArrayView<char> y = std::move(x);  // Copy non-const -> non-const.
108*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, y.size());
109*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, y.data());
110*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char> z = std::move(x);  // Copy non-const -> const.
111*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, z.size());
112*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, z.data());
113*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char> w = std::move(z);  // Copy const -> const.
114*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, w.size());
115*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, w.data());
116*d9f75844SAndroid Build Coastguard Worker   // ArrayView<char> v = std::move(z);  // Error, because can't drop const.
117*d9f75844SAndroid Build Coastguard Worker }
118*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestCopyConstructorFixedLvalue)119*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestCopyConstructorFixedLvalue) {
120*d9f75844SAndroid Build Coastguard Worker   char arr[] = "Arrr!";
121*d9f75844SAndroid Build Coastguard Worker   ArrayView<char, 6> x = arr;
122*d9f75844SAndroid Build Coastguard Worker   static_assert(x.size() == 6, "");
123*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, x.data());
124*d9f75844SAndroid Build Coastguard Worker 
125*d9f75844SAndroid Build Coastguard Worker   // Copy fixed -> fixed.
126*d9f75844SAndroid Build Coastguard Worker   ArrayView<char, 6> y = x;  // Copy non-const -> non-const.
127*d9f75844SAndroid Build Coastguard Worker   static_assert(y.size() == 6, "");
128*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, y.data());
129*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char, 6> z = x;  // Copy non-const -> const.
130*d9f75844SAndroid Build Coastguard Worker   static_assert(z.size() == 6, "");
131*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, z.data());
132*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char, 6> w = z;  // Copy const -> const.
133*d9f75844SAndroid Build Coastguard Worker   static_assert(w.size() == 6, "");
134*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, w.data());
135*d9f75844SAndroid Build Coastguard Worker   // ArrayView<char, 6> v = z;  // Compile error, because can't drop const.
136*d9f75844SAndroid Build Coastguard Worker 
137*d9f75844SAndroid Build Coastguard Worker   // Copy fixed -> variable.
138*d9f75844SAndroid Build Coastguard Worker   ArrayView<char> yv = x;  // Copy non-const -> non-const.
139*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, yv.size());
140*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, yv.data());
141*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char> zv = x;  // Copy non-const -> const.
142*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, zv.size());
143*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, zv.data());
144*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char> wv = z;  // Copy const -> const.
145*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, wv.size());
146*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, wv.data());
147*d9f75844SAndroid Build Coastguard Worker   // ArrayView<char> vv = z;  // Compile error, because can't drop const.
148*d9f75844SAndroid Build Coastguard Worker }
149*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestCopyConstructorFixedRvalue)150*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestCopyConstructorFixedRvalue) {
151*d9f75844SAndroid Build Coastguard Worker   char arr[] = "Arrr!";
152*d9f75844SAndroid Build Coastguard Worker   ArrayView<char, 6> x = arr;
153*d9f75844SAndroid Build Coastguard Worker   static_assert(x.size() == 6, "");
154*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, x.data());
155*d9f75844SAndroid Build Coastguard Worker 
156*d9f75844SAndroid Build Coastguard Worker   // Copy fixed -> fixed.
157*d9f75844SAndroid Build Coastguard Worker   ArrayView<char, 6> y = std::move(x);  // Copy non-const -> non-const.
158*d9f75844SAndroid Build Coastguard Worker   static_assert(y.size() == 6, "");
159*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, y.data());
160*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char, 6> z = std::move(x);  // Copy non-const -> const.
161*d9f75844SAndroid Build Coastguard Worker   static_assert(z.size() == 6, "");
162*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, z.data());
163*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char, 6> w = std::move(z);  // Copy const -> const.
164*d9f75844SAndroid Build Coastguard Worker   static_assert(w.size() == 6, "");
165*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, w.data());
166*d9f75844SAndroid Build Coastguard Worker   // ArrayView<char, 6> v = std::move(z);  // Error, because can't drop const.
167*d9f75844SAndroid Build Coastguard Worker 
168*d9f75844SAndroid Build Coastguard Worker   // Copy fixed -> variable.
169*d9f75844SAndroid Build Coastguard Worker   ArrayView<char> yv = std::move(x);  // Copy non-const -> non-const.
170*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, yv.size());
171*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, yv.data());
172*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char> zv = std::move(x);  // Copy non-const -> const.
173*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, zv.size());
174*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, zv.data());
175*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char> wv = std::move(z);  // Copy const -> const.
176*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, wv.size());
177*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, wv.data());
178*d9f75844SAndroid Build Coastguard Worker   // ArrayView<char> vv = std::move(z);  // Error, because can't drop const.
179*d9f75844SAndroid Build Coastguard Worker }
180*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestCopyAssignmentVariableLvalue)181*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestCopyAssignmentVariableLvalue) {
182*d9f75844SAndroid Build Coastguard Worker   char arr[] = "Arrr!";
183*d9f75844SAndroid Build Coastguard Worker   ArrayView<char> x(arr);
184*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, x.size());
185*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, x.data());
186*d9f75844SAndroid Build Coastguard Worker   ArrayView<char> y;
187*d9f75844SAndroid Build Coastguard Worker   y = x;  // Copy non-const -> non-const.
188*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, y.size());
189*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, y.data());
190*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char> z;
191*d9f75844SAndroid Build Coastguard Worker   z = x;  // Copy non-const -> const.
192*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, z.size());
193*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, z.data());
194*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char> w;
195*d9f75844SAndroid Build Coastguard Worker   w = z;  // Copy const -> const.
196*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, w.size());
197*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, w.data());
198*d9f75844SAndroid Build Coastguard Worker   // ArrayView<char> v;
199*d9f75844SAndroid Build Coastguard Worker   // v = z;  // Compile error, because can't drop const.
200*d9f75844SAndroid Build Coastguard Worker }
201*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestCopyAssignmentVariableRvalue)202*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestCopyAssignmentVariableRvalue) {
203*d9f75844SAndroid Build Coastguard Worker   char arr[] = "Arrr!";
204*d9f75844SAndroid Build Coastguard Worker   ArrayView<char> x(arr);
205*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, x.size());
206*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, x.data());
207*d9f75844SAndroid Build Coastguard Worker   ArrayView<char> y;
208*d9f75844SAndroid Build Coastguard Worker   y = std::move(x);  // Copy non-const -> non-const.
209*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, y.size());
210*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, y.data());
211*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char> z;
212*d9f75844SAndroid Build Coastguard Worker   z = std::move(x);  // Copy non-const -> const.
213*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, z.size());
214*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, z.data());
215*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char> w;
216*d9f75844SAndroid Build Coastguard Worker   w = std::move(z);  // Copy const -> const.
217*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, w.size());
218*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, w.data());
219*d9f75844SAndroid Build Coastguard Worker   // ArrayView<char> v;
220*d9f75844SAndroid Build Coastguard Worker   // v = std::move(z);  // Compile error, because can't drop const.
221*d9f75844SAndroid Build Coastguard Worker }
222*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestCopyAssignmentFixedLvalue)223*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestCopyAssignmentFixedLvalue) {
224*d9f75844SAndroid Build Coastguard Worker   char arr[] = "Arrr!";
225*d9f75844SAndroid Build Coastguard Worker   char init[] = "Init!";
226*d9f75844SAndroid Build Coastguard Worker   ArrayView<char, 6> x(arr);
227*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, x.data());
228*d9f75844SAndroid Build Coastguard Worker 
229*d9f75844SAndroid Build Coastguard Worker   // Copy fixed -> fixed.
230*d9f75844SAndroid Build Coastguard Worker   ArrayView<char, 6> y(init);
231*d9f75844SAndroid Build Coastguard Worker   y = x;  // Copy non-const -> non-const.
232*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, y.data());
233*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char, 6> z(init);
234*d9f75844SAndroid Build Coastguard Worker   z = x;  // Copy non-const -> const.
235*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, z.data());
236*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char, 6> w(init);
237*d9f75844SAndroid Build Coastguard Worker   w = z;  // Copy const -> const.
238*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, w.data());
239*d9f75844SAndroid Build Coastguard Worker   // ArrayView<char, 6> v(init);
240*d9f75844SAndroid Build Coastguard Worker   // v = z;  // Compile error, because can't drop const.
241*d9f75844SAndroid Build Coastguard Worker 
242*d9f75844SAndroid Build Coastguard Worker   // Copy fixed -> variable.
243*d9f75844SAndroid Build Coastguard Worker   ArrayView<char> yv;
244*d9f75844SAndroid Build Coastguard Worker   yv = x;  // Copy non-const -> non-const.
245*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, yv.size());
246*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, yv.data());
247*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char> zv;
248*d9f75844SAndroid Build Coastguard Worker   zv = x;  // Copy non-const -> const.
249*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, zv.size());
250*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, zv.data());
251*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char> wv;
252*d9f75844SAndroid Build Coastguard Worker   wv = z;  // Copy const -> const.
253*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, wv.size());
254*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, wv.data());
255*d9f75844SAndroid Build Coastguard Worker   // ArrayView<char> v;
256*d9f75844SAndroid Build Coastguard Worker   // v = z;  // Compile error, because can't drop const.
257*d9f75844SAndroid Build Coastguard Worker }
258*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestCopyAssignmentFixedRvalue)259*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestCopyAssignmentFixedRvalue) {
260*d9f75844SAndroid Build Coastguard Worker   char arr[] = "Arrr!";
261*d9f75844SAndroid Build Coastguard Worker   char init[] = "Init!";
262*d9f75844SAndroid Build Coastguard Worker   ArrayView<char, 6> x(arr);
263*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, x.data());
264*d9f75844SAndroid Build Coastguard Worker 
265*d9f75844SAndroid Build Coastguard Worker   // Copy fixed -> fixed.
266*d9f75844SAndroid Build Coastguard Worker   ArrayView<char, 6> y(init);
267*d9f75844SAndroid Build Coastguard Worker   y = std::move(x);  // Copy non-const -> non-const.
268*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, y.data());
269*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char, 6> z(init);
270*d9f75844SAndroid Build Coastguard Worker   z = std::move(x);  // Copy non-const -> const.
271*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, z.data());
272*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char, 6> w(init);
273*d9f75844SAndroid Build Coastguard Worker   w = std::move(z);  // Copy const -> const.
274*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, w.data());
275*d9f75844SAndroid Build Coastguard Worker   // ArrayView<char, 6> v(init);
276*d9f75844SAndroid Build Coastguard Worker   // v = std::move(z);  // Compile error, because can't drop const.
277*d9f75844SAndroid Build Coastguard Worker 
278*d9f75844SAndroid Build Coastguard Worker   // Copy fixed -> variable.
279*d9f75844SAndroid Build Coastguard Worker   ArrayView<char> yv;
280*d9f75844SAndroid Build Coastguard Worker   yv = std::move(x);  // Copy non-const -> non-const.
281*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, yv.size());
282*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, yv.data());
283*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char> zv;
284*d9f75844SAndroid Build Coastguard Worker   zv = std::move(x);  // Copy non-const -> const.
285*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, zv.size());
286*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, zv.data());
287*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char> wv;
288*d9f75844SAndroid Build Coastguard Worker   wv = std::move(z);  // Copy const -> const.
289*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, wv.size());
290*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, wv.data());
291*d9f75844SAndroid Build Coastguard Worker   // ArrayView<char> v;
292*d9f75844SAndroid Build Coastguard Worker   // v = std::move(z);  // Compile error, because can't drop const.
293*d9f75844SAndroid Build Coastguard Worker }
294*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestStdArray)295*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestStdArray) {
296*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(4u, Call<const int>(std::array<int, 4>{1, 2, 3, 4}));
297*d9f75844SAndroid Build Coastguard Worker   CallFixed<const int, 3>(std::array<int, 3>{2, 3, 4});
298*d9f75844SAndroid Build Coastguard Worker   constexpr size_t size = 5;
299*d9f75844SAndroid Build Coastguard Worker   std::array<float, size> arr{};
300*d9f75844SAndroid Build Coastguard Worker   // Fixed size view.
301*d9f75844SAndroid Build Coastguard Worker   rtc::ArrayView<float, size> arr_view_fixed(arr);
302*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr.data(), arr_view_fixed.data());
303*d9f75844SAndroid Build Coastguard Worker   static_assert(size == arr_view_fixed.size(), "");
304*d9f75844SAndroid Build Coastguard Worker   // Variable size view.
305*d9f75844SAndroid Build Coastguard Worker   rtc::ArrayView<float> arr_view(arr);
306*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr.data(), arr_view.data());
307*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(size, arr_view.size());
308*d9f75844SAndroid Build Coastguard Worker }
309*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestConstStdArray)310*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestConstStdArray) {
311*d9f75844SAndroid Build Coastguard Worker   constexpr size_t size = 5;
312*d9f75844SAndroid Build Coastguard Worker 
313*d9f75844SAndroid Build Coastguard Worker   constexpr std::array<float, size> constexpr_arr{};
314*d9f75844SAndroid Build Coastguard Worker   rtc::ArrayView<const float, size> constexpr_arr_view(constexpr_arr);
315*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(constexpr_arr.data(), constexpr_arr_view.data());
316*d9f75844SAndroid Build Coastguard Worker   static_assert(constexpr_arr.size() == constexpr_arr_view.size(), "");
317*d9f75844SAndroid Build Coastguard Worker 
318*d9f75844SAndroid Build Coastguard Worker   const std::array<float, size> const_arr{};
319*d9f75844SAndroid Build Coastguard Worker   rtc::ArrayView<const float, size> const_arr_view(const_arr);
320*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(const_arr.data(), const_arr_view.data());
321*d9f75844SAndroid Build Coastguard Worker   static_assert(const_arr.size() == const_arr_view.size(), "");
322*d9f75844SAndroid Build Coastguard Worker 
323*d9f75844SAndroid Build Coastguard Worker   std::array<float, size> non_const_arr{};
324*d9f75844SAndroid Build Coastguard Worker   rtc::ArrayView<const float, size> non_const_arr_view(non_const_arr);
325*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(non_const_arr.data(), non_const_arr_view.data());
326*d9f75844SAndroid Build Coastguard Worker   static_assert(non_const_arr.size() == non_const_arr_view.size(), "");
327*d9f75844SAndroid Build Coastguard Worker }
328*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestStdVector)329*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestStdVector) {
330*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(3u, Call<const int>(std::vector<int>{4, 5, 6}));
331*d9f75844SAndroid Build Coastguard Worker   std::vector<int> v;
332*d9f75844SAndroid Build Coastguard Worker   v.push_back(3);
333*d9f75844SAndroid Build Coastguard Worker   v.push_back(11);
334*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(2u, Call<const int>(v));
335*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(2u, Call<int>(v));
336*d9f75844SAndroid Build Coastguard Worker   // Call<unsigned int>(v);  // Compile error, because incompatible types.
337*d9f75844SAndroid Build Coastguard Worker   ArrayView<int> x = v;
338*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(2u, x.size());
339*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(v.data(), x.data());
340*d9f75844SAndroid Build Coastguard Worker   ArrayView<const int> y;
341*d9f75844SAndroid Build Coastguard Worker   y = v;
342*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(2u, y.size());
343*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(v.data(), y.data());
344*d9f75844SAndroid Build Coastguard Worker   // ArrayView<double> d = v;  // Compile error, because incompatible types.
345*d9f75844SAndroid Build Coastguard Worker   const std::vector<int> cv;
346*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0u, Call<const int>(cv));
347*d9f75844SAndroid Build Coastguard Worker   // Call<int>(cv);  // Compile error, because can't drop const.
348*d9f75844SAndroid Build Coastguard Worker   ArrayView<const int> z = cv;
349*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0u, z.size());
350*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, z.data());
351*d9f75844SAndroid Build Coastguard Worker   // ArrayView<int> w = cv;  // Compile error, because can't drop const.
352*d9f75844SAndroid Build Coastguard Worker }
353*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestRtcBuffer)354*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestRtcBuffer) {
355*d9f75844SAndroid Build Coastguard Worker   rtc::Buffer b = "so buffer";
356*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(10u, Call<const uint8_t>(b));
357*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(10u, Call<uint8_t>(b));
358*d9f75844SAndroid Build Coastguard Worker   // Call<int8_t>(b);  // Compile error, because incompatible types.
359*d9f75844SAndroid Build Coastguard Worker   ArrayView<uint8_t> x = b;
360*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(10u, x.size());
361*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(b.data(), x.data());
362*d9f75844SAndroid Build Coastguard Worker   ArrayView<const uint8_t> y;
363*d9f75844SAndroid Build Coastguard Worker   y = b;
364*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(10u, y.size());
365*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(b.data(), y.data());
366*d9f75844SAndroid Build Coastguard Worker   // ArrayView<char> d = b;  // Compile error, because incompatible types.
367*d9f75844SAndroid Build Coastguard Worker   const rtc::Buffer cb = "very const";
368*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(11u, Call<const uint8_t>(cb));
369*d9f75844SAndroid Build Coastguard Worker   // Call<uint8_t>(cb);  // Compile error, because can't drop const.
370*d9f75844SAndroid Build Coastguard Worker   ArrayView<const uint8_t> z = cb;
371*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(11u, z.size());
372*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(cb.data(), z.data());
373*d9f75844SAndroid Build Coastguard Worker   // ArrayView<uint8_t> w = cb;  // Compile error, because can't drop const.
374*d9f75844SAndroid Build Coastguard Worker }
375*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestSwapVariable)376*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestSwapVariable) {
377*d9f75844SAndroid Build Coastguard Worker   const char arr[] = "Arrr!";
378*d9f75844SAndroid Build Coastguard Worker   const char aye[] = "Aye, Cap'n!";
379*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char> x(arr);
380*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, x.size());
381*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, x.data());
382*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char> y(aye);
383*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(12u, y.size());
384*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(aye, y.data());
385*d9f75844SAndroid Build Coastguard Worker   using std::swap;
386*d9f75844SAndroid Build Coastguard Worker   swap(x, y);
387*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(12u, x.size());
388*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(aye, x.data());
389*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(6u, y.size());
390*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, y.data());
391*d9f75844SAndroid Build Coastguard Worker   // ArrayView<char> z;
392*d9f75844SAndroid Build Coastguard Worker   // swap(x, z);  // Compile error, because can't drop const.
393*d9f75844SAndroid Build Coastguard Worker }
394*d9f75844SAndroid Build Coastguard Worker 
TEST(FixArrayViewTest,TestSwapFixed)395*d9f75844SAndroid Build Coastguard Worker TEST(FixArrayViewTest, TestSwapFixed) {
396*d9f75844SAndroid Build Coastguard Worker   const char arr[] = "Arr!";
397*d9f75844SAndroid Build Coastguard Worker   char aye[] = "Aye!";
398*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char, 5> x(arr);
399*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, x.data());
400*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char, 5> y(aye);
401*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(aye, y.data());
402*d9f75844SAndroid Build Coastguard Worker   using std::swap;
403*d9f75844SAndroid Build Coastguard Worker   swap(x, y);
404*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(aye, x.data());
405*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(arr, y.data());
406*d9f75844SAndroid Build Coastguard Worker   // ArrayView<char, 5> z(aye);
407*d9f75844SAndroid Build Coastguard Worker   // swap(x, z);  // Compile error, because can't drop const.
408*d9f75844SAndroid Build Coastguard Worker   // ArrayView<const char, 4> w(aye, 4);
409*d9f75844SAndroid Build Coastguard Worker   // swap(x, w);  // Compile error, because different sizes.
410*d9f75844SAndroid Build Coastguard Worker }
411*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewDeathTest,TestIndexing)412*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewDeathTest, TestIndexing) {
413*d9f75844SAndroid Build Coastguard Worker   char arr[] = "abcdefg";
414*d9f75844SAndroid Build Coastguard Worker   ArrayView<char> x(arr);
415*d9f75844SAndroid Build Coastguard Worker   const ArrayView<char> y(arr);
416*d9f75844SAndroid Build Coastguard Worker   ArrayView<const char, 8> z(arr);
417*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(8u, x.size());
418*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(8u, y.size());
419*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(8u, z.size());
420*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ('b', x[1]);
421*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ('c', y[2]);
422*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ('d', z[3]);
423*d9f75844SAndroid Build Coastguard Worker   x[3] = 'X';
424*d9f75844SAndroid Build Coastguard Worker   y[2] = 'Y';
425*d9f75844SAndroid Build Coastguard Worker   // z[1] = 'Z';  // Compile error, because z's element type is const char.
426*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ('b', x[1]);
427*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ('Y', y[2]);
428*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ('X', z[3]);
429*d9f75844SAndroid Build Coastguard Worker #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
430*d9f75844SAndroid Build Coastguard Worker   EXPECT_DEATH(z[8], "");  // DCHECK error (index out of bounds).
431*d9f75844SAndroid Build Coastguard Worker #endif
432*d9f75844SAndroid Build Coastguard Worker }
433*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestIterationEmpty)434*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestIterationEmpty) {
435*d9f75844SAndroid Build Coastguard Worker   // Variable-size.
436*d9f75844SAndroid Build Coastguard Worker   ArrayView<std::vector<std::vector<std::vector<std::string>>>> av;
437*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(av.begin(), av.end());
438*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(av.cbegin(), av.cend());
439*d9f75844SAndroid Build Coastguard Worker   for (auto& e : av) {
440*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(false);
441*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(42u, e.size());  // Dummy use of e to prevent unused var warning.
442*d9f75844SAndroid Build Coastguard Worker   }
443*d9f75844SAndroid Build Coastguard Worker 
444*d9f75844SAndroid Build Coastguard Worker   // Fixed-size.
445*d9f75844SAndroid Build Coastguard Worker   ArrayView<std::vector<std::vector<std::vector<std::string>>>, 0> af;
446*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(af.begin(), af.end());
447*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(af.cbegin(), af.cend());
448*d9f75844SAndroid Build Coastguard Worker   for (auto& e : af) {
449*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(false);
450*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(42u, e.size());  // Dummy use of e to prevent unused var warning.
451*d9f75844SAndroid Build Coastguard Worker   }
452*d9f75844SAndroid Build Coastguard Worker }
453*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestReverseIterationEmpty)454*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestReverseIterationEmpty) {
455*d9f75844SAndroid Build Coastguard Worker   // Variable-size.
456*d9f75844SAndroid Build Coastguard Worker   ArrayView<std::vector<std::vector<std::vector<std::string>>>> av;
457*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(av.rbegin(), av.rend());
458*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(av.crbegin(), av.crend());
459*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(av.empty());
460*d9f75844SAndroid Build Coastguard Worker 
461*d9f75844SAndroid Build Coastguard Worker   // Fixed-size.
462*d9f75844SAndroid Build Coastguard Worker   ArrayView<std::vector<std::vector<std::vector<std::string>>>, 0> af;
463*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(af.begin(), af.end());
464*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(af.cbegin(), af.cend());
465*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(af.empty());
466*d9f75844SAndroid Build Coastguard Worker }
467*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestIterationVariable)468*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestIterationVariable) {
469*d9f75844SAndroid Build Coastguard Worker   char arr[] = "Arrr!";
470*d9f75844SAndroid Build Coastguard Worker   ArrayView<char> av(arr);
471*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ('A', *av.begin());
472*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ('A', *av.cbegin());
473*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ('\0', *(av.end() - 1));
474*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ('\0', *(av.cend() - 1));
475*d9f75844SAndroid Build Coastguard Worker   char i = 0;
476*d9f75844SAndroid Build Coastguard Worker   for (auto& e : av) {
477*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(arr + i, &e);
478*d9f75844SAndroid Build Coastguard Worker     e = 's' + i;
479*d9f75844SAndroid Build Coastguard Worker     ++i;
480*d9f75844SAndroid Build Coastguard Worker   }
481*d9f75844SAndroid Build Coastguard Worker   i = 0;
482*d9f75844SAndroid Build Coastguard Worker   for (auto& e : ArrayView<const char>(av)) {
483*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(arr + i, &e);
484*d9f75844SAndroid Build Coastguard Worker     // e = 'q' + i;  // Compile error, because e is a const char&.
485*d9f75844SAndroid Build Coastguard Worker     ++i;
486*d9f75844SAndroid Build Coastguard Worker   }
487*d9f75844SAndroid Build Coastguard Worker }
488*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestReverseIterationVariable)489*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestReverseIterationVariable) {
490*d9f75844SAndroid Build Coastguard Worker   char arr[] = "Arrr!";
491*d9f75844SAndroid Build Coastguard Worker   ArrayView<char> av(arr);
492*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ('\0', *av.rbegin());
493*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ('\0', *av.crbegin());
494*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ('A', *(av.rend() - 1));
495*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ('A', *(av.crend() - 1));
496*d9f75844SAndroid Build Coastguard Worker 
497*d9f75844SAndroid Build Coastguard Worker   const char* cit = av.cend() - 1;
498*d9f75844SAndroid Build Coastguard Worker   for (auto crit = av.crbegin(); crit != av.crend(); ++crit, --cit) {
499*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(*cit, *crit);
500*d9f75844SAndroid Build Coastguard Worker   }
501*d9f75844SAndroid Build Coastguard Worker 
502*d9f75844SAndroid Build Coastguard Worker   char* it = av.end() - 1;
503*d9f75844SAndroid Build Coastguard Worker   for (auto rit = av.rbegin(); rit != av.rend(); ++rit, --it) {
504*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(*it, *rit);
505*d9f75844SAndroid Build Coastguard Worker   }
506*d9f75844SAndroid Build Coastguard Worker }
507*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestIterationFixed)508*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestIterationFixed) {
509*d9f75844SAndroid Build Coastguard Worker   char arr[] = "Arrr!";
510*d9f75844SAndroid Build Coastguard Worker   ArrayView<char, 6> av(arr);
511*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ('A', *av.begin());
512*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ('A', *av.cbegin());
513*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ('\0', *(av.end() - 1));
514*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ('\0', *(av.cend() - 1));
515*d9f75844SAndroid Build Coastguard Worker   char i = 0;
516*d9f75844SAndroid Build Coastguard Worker   for (auto& e : av) {
517*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(arr + i, &e);
518*d9f75844SAndroid Build Coastguard Worker     e = 's' + i;
519*d9f75844SAndroid Build Coastguard Worker     ++i;
520*d9f75844SAndroid Build Coastguard Worker   }
521*d9f75844SAndroid Build Coastguard Worker   i = 0;
522*d9f75844SAndroid Build Coastguard Worker   for (auto& e : ArrayView<const char, 6>(av)) {
523*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(arr + i, &e);
524*d9f75844SAndroid Build Coastguard Worker     // e = 'q' + i;  // Compile error, because e is a const char&.
525*d9f75844SAndroid Build Coastguard Worker     ++i;
526*d9f75844SAndroid Build Coastguard Worker   }
527*d9f75844SAndroid Build Coastguard Worker }
528*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestReverseIterationFixed)529*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestReverseIterationFixed) {
530*d9f75844SAndroid Build Coastguard Worker   char arr[] = "Arrr!";
531*d9f75844SAndroid Build Coastguard Worker   ArrayView<char, 6> av(arr);
532*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ('\0', *av.rbegin());
533*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ('\0', *av.crbegin());
534*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ('A', *(av.rend() - 1));
535*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ('A', *(av.crend() - 1));
536*d9f75844SAndroid Build Coastguard Worker 
537*d9f75844SAndroid Build Coastguard Worker   const char* cit = av.cend() - 1;
538*d9f75844SAndroid Build Coastguard Worker   for (auto crit = av.crbegin(); crit != av.crend(); ++crit, --cit) {
539*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(*cit, *crit);
540*d9f75844SAndroid Build Coastguard Worker   }
541*d9f75844SAndroid Build Coastguard Worker 
542*d9f75844SAndroid Build Coastguard Worker   char* it = av.end() - 1;
543*d9f75844SAndroid Build Coastguard Worker   for (auto rit = av.rbegin(); rit != av.rend(); ++rit, --it) {
544*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(*it, *rit);
545*d9f75844SAndroid Build Coastguard Worker   }
546*d9f75844SAndroid Build Coastguard Worker }
547*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestEmpty)548*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestEmpty) {
549*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(ArrayView<int>().empty());
550*d9f75844SAndroid Build Coastguard Worker   const int a[] = {1, 2, 3};
551*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(ArrayView<const int>(a).empty());
552*d9f75844SAndroid Build Coastguard Worker 
553*d9f75844SAndroid Build Coastguard Worker   static_assert(ArrayView<int, 0>::empty(), "");
554*d9f75844SAndroid Build Coastguard Worker   static_assert(!ArrayView<int, 3>::empty(), "");
555*d9f75844SAndroid Build Coastguard Worker }
556*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestCompare)557*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestCompare) {
558*d9f75844SAndroid Build Coastguard Worker   int a[] = {1, 2, 3};
559*d9f75844SAndroid Build Coastguard Worker   int b[] = {1, 2, 3};
560*d9f75844SAndroid Build Coastguard Worker 
561*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(ArrayView<int>(a), ArrayView<int>(a));
562*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ((ArrayView<int, 3>(a)), (ArrayView<int, 3>(a)));
563*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(ArrayView<int>(a), (ArrayView<int, 3>(a)));
564*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(ArrayView<int>(), ArrayView<int>());
565*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(ArrayView<int>(), ArrayView<int>(a, 0));
566*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(ArrayView<int>(a, 0), ArrayView<int>(b, 0));
567*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ((ArrayView<int, 0>(a, 0)), ArrayView<int>());
568*d9f75844SAndroid Build Coastguard Worker 
569*d9f75844SAndroid Build Coastguard Worker   EXPECT_NE(ArrayView<int>(a), ArrayView<int>(b));
570*d9f75844SAndroid Build Coastguard Worker   EXPECT_NE((ArrayView<int, 3>(a)), (ArrayView<int, 3>(b)));
571*d9f75844SAndroid Build Coastguard Worker   EXPECT_NE((ArrayView<int, 3>(a)), ArrayView<int>(b));
572*d9f75844SAndroid Build Coastguard Worker   EXPECT_NE(ArrayView<int>(a), ArrayView<int>());
573*d9f75844SAndroid Build Coastguard Worker   EXPECT_NE(ArrayView<int>(a), ArrayView<int>(a, 2));
574*d9f75844SAndroid Build Coastguard Worker   EXPECT_NE((ArrayView<int, 3>(a)), (ArrayView<int, 2>(a, 2)));
575*d9f75844SAndroid Build Coastguard Worker }
576*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestSubViewVariable)577*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestSubViewVariable) {
578*d9f75844SAndroid Build Coastguard Worker   int a[] = {1, 2, 3};
579*d9f75844SAndroid Build Coastguard Worker   ArrayView<int> av(a);
580*d9f75844SAndroid Build Coastguard Worker 
581*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(av.subview(0), av);
582*d9f75844SAndroid Build Coastguard Worker 
583*d9f75844SAndroid Build Coastguard Worker   EXPECT_THAT(av.subview(1), ElementsAre(2, 3));
584*d9f75844SAndroid Build Coastguard Worker   EXPECT_THAT(av.subview(2), ElementsAre(3));
585*d9f75844SAndroid Build Coastguard Worker   EXPECT_THAT(av.subview(3), IsEmpty());
586*d9f75844SAndroid Build Coastguard Worker   EXPECT_THAT(av.subview(4), IsEmpty());
587*d9f75844SAndroid Build Coastguard Worker 
588*d9f75844SAndroid Build Coastguard Worker   EXPECT_THAT(av.subview(1, 0), IsEmpty());
589*d9f75844SAndroid Build Coastguard Worker   EXPECT_THAT(av.subview(1, 1), ElementsAre(2));
590*d9f75844SAndroid Build Coastguard Worker   EXPECT_THAT(av.subview(1, 2), ElementsAre(2, 3));
591*d9f75844SAndroid Build Coastguard Worker   EXPECT_THAT(av.subview(1, 3), ElementsAre(2, 3));
592*d9f75844SAndroid Build Coastguard Worker }
593*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestSubViewFixed)594*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestSubViewFixed) {
595*d9f75844SAndroid Build Coastguard Worker   int a[] = {1, 2, 3};
596*d9f75844SAndroid Build Coastguard Worker   ArrayView<int, 3> av(a);
597*d9f75844SAndroid Build Coastguard Worker 
598*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(av.subview(0), av);
599*d9f75844SAndroid Build Coastguard Worker 
600*d9f75844SAndroid Build Coastguard Worker   EXPECT_THAT(av.subview(1), ElementsAre(2, 3));
601*d9f75844SAndroid Build Coastguard Worker   EXPECT_THAT(av.subview(2), ElementsAre(3));
602*d9f75844SAndroid Build Coastguard Worker   EXPECT_THAT(av.subview(3), IsEmpty());
603*d9f75844SAndroid Build Coastguard Worker   EXPECT_THAT(av.subview(4), IsEmpty());
604*d9f75844SAndroid Build Coastguard Worker 
605*d9f75844SAndroid Build Coastguard Worker   EXPECT_THAT(av.subview(1, 0), IsEmpty());
606*d9f75844SAndroid Build Coastguard Worker   EXPECT_THAT(av.subview(1, 1), ElementsAre(2));
607*d9f75844SAndroid Build Coastguard Worker   EXPECT_THAT(av.subview(1, 2), ElementsAre(2, 3));
608*d9f75844SAndroid Build Coastguard Worker   EXPECT_THAT(av.subview(1, 3), ElementsAre(2, 3));
609*d9f75844SAndroid Build Coastguard Worker }
610*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestReinterpretCastFixedSize)611*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestReinterpretCastFixedSize) {
612*d9f75844SAndroid Build Coastguard Worker   uint8_t bytes[] = {1, 2, 3};
613*d9f75844SAndroid Build Coastguard Worker   ArrayView<uint8_t, 3> uint8_av(bytes);
614*d9f75844SAndroid Build Coastguard Worker   ArrayView<int8_t, 3> int8_av = reinterpret_array_view<int8_t>(uint8_av);
615*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(int8_av.size(), uint8_av.size());
616*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(int8_av[0], 1);
617*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(int8_av[1], 2);
618*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(int8_av[2], 3);
619*d9f75844SAndroid Build Coastguard Worker }
620*d9f75844SAndroid Build Coastguard Worker 
TEST(ArrayViewTest,TestReinterpretCastVariableSize)621*d9f75844SAndroid Build Coastguard Worker TEST(ArrayViewTest, TestReinterpretCastVariableSize) {
622*d9f75844SAndroid Build Coastguard Worker   std::vector<int8_t> v = {1, 2, 3};
623*d9f75844SAndroid Build Coastguard Worker   ArrayView<int8_t> int8_av(v);
624*d9f75844SAndroid Build Coastguard Worker   ArrayView<uint8_t> uint8_av = reinterpret_array_view<uint8_t>(int8_av);
625*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(int8_av.size(), uint8_av.size());
626*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(uint8_av[0], 1);
627*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(uint8_av[1], 2);
628*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(uint8_av[2], 3);
629*d9f75844SAndroid Build Coastguard Worker }
630*d9f75844SAndroid Build Coastguard Worker }  // namespace rtc
631