Index: webrtc/base/array_view_unittest.cc |
diff --git a/webrtc/base/array_view_unittest.cc b/webrtc/base/array_view_unittest.cc |
index f7fe9fa36bc164c4d6395987ef2230c05f1834c0..035f25ca497d5bcb6cab0b6ab3ffb3b41b95d0e2 100644 |
--- a/webrtc/base/array_view_unittest.cc |
+++ b/webrtc/base/array_view_unittest.cc |
@@ -44,15 +44,27 @@ TEST(ArrayViewTest, TestConstructFromPtrAndArray) { |
ArrayView<char> y = arr; |
EXPECT_EQ(6u, y.size()); |
EXPECT_EQ(arr, y.data()); |
+ ArrayView<char, 6> yf = arr; |
+ static_assert(yf.size() == 6, ""); |
+ EXPECT_EQ(arr, yf.data()); |
ArrayView<const char> z(arr + 1, 3); |
EXPECT_EQ(3u, z.size()); |
EXPECT_EQ(arr + 1, z.data()); |
+ ArrayView<const char, 3> zf(arr + 1, 3); |
+ static_assert(zf.size() == 3, ""); |
+ EXPECT_EQ(arr + 1, zf.data()); |
ArrayView<const char> w(arr, 2); |
EXPECT_EQ(2u, w.size()); |
EXPECT_EQ(arr, w.data()); |
+ ArrayView<const char, 2> wf(arr, 2); |
+ static_assert(wf.size() == 2, ""); |
+ EXPECT_EQ(arr, wf.data()); |
ArrayView<char> q(arr, 0); |
EXPECT_EQ(0u, q.size()); |
EXPECT_EQ(nullptr, q.data()); |
+ ArrayView<char, 0> qf(arr, 0); |
+ static_assert(qf.size() == 0, ""); |
+ EXPECT_EQ(nullptr, qf.data()); |
#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) |
// DCHECK error (nullptr with nonzero size). |
EXPECT_DEATH(ArrayView<int>(static_cast<int*>(nullptr), 5), ""); |
@@ -62,7 +74,7 @@ TEST(ArrayViewTest, TestConstructFromPtrAndArray) { |
// ArrayView<float> n(arr + 2, 2); |
} |
-TEST(ArrayViewTest, TestCopyConstructor) { |
+TEST(ArrayViewTest, TestCopyConstructorVariable) { |
char arr[] = "Arrr!"; |
ArrayView<char> x = arr; |
EXPECT_EQ(6u, x.size()); |
@@ -79,7 +91,38 @@ TEST(ArrayViewTest, TestCopyConstructor) { |
// ArrayView<char> v = z; // Compile error, because can't drop const. |
} |
-TEST(ArrayViewTest, TestCopyAssignment) { |
+TEST(ArrayViewTest, TestCopyConstructorFixed) { |
+ char arr[] = "Arrr!"; |
+ ArrayView<char, 6> x = arr; |
+ static_assert(x.size() == 6, ""); |
+ EXPECT_EQ(arr, x.data()); |
+ |
+ // Copy fixed -> fixed. |
+ ArrayView<char, 6> y = x; // Copy non-const -> non-const. |
+ static_assert(y.size() == 6, ""); |
+ EXPECT_EQ(arr, y.data()); |
+ ArrayView<const char, 6> z = x; // Copy non-const -> const. |
+ static_assert(z.size() == 6, ""); |
+ EXPECT_EQ(arr, z.data()); |
+ ArrayView<const char, 6> w = z; // Copy const -> const. |
+ static_assert(w.size() == 6, ""); |
+ EXPECT_EQ(arr, w.data()); |
+ // ArrayView<char, 6> v = z; // Compile error, because can't drop const. |
+ |
+ // Copy fixed -> variable. |
+ ArrayView<char> yv = x; // Copy non-const -> non-const. |
+ EXPECT_EQ(6u, yv.size()); |
+ EXPECT_EQ(arr, yv.data()); |
+ ArrayView<const char> zv = x; // Copy non-const -> const. |
+ EXPECT_EQ(6u, zv.size()); |
+ EXPECT_EQ(arr, zv.data()); |
+ ArrayView<const char> wv = z; // Copy const -> const. |
+ EXPECT_EQ(6u, wv.size()); |
+ EXPECT_EQ(arr, wv.data()); |
+ // ArrayView<char> vv = z; // Compile error, because can't drop const. |
+} |
+ |
+TEST(ArrayViewTest, TestCopyAssignmentVariable) { |
char arr[] = "Arrr!"; |
ArrayView<char> x(arr); |
EXPECT_EQ(6u, x.size()); |
@@ -100,6 +143,42 @@ TEST(ArrayViewTest, TestCopyAssignment) { |
// v = z; // Compile error, because can't drop const. |
} |
+TEST(ArrayViewTest, TestCopyAssignmentFixed) { |
+ char arr[] = "Arrr!"; |
+ char init[] = "Init!"; |
+ ArrayView<char, 6> x(arr); |
+ EXPECT_EQ(arr, x.data()); |
+ |
+ // Copy fixed -> fixed. |
+ ArrayView<char, 6> y(init); |
+ y = x; // Copy non-const -> non-const. |
+ EXPECT_EQ(arr, y.data()); |
+ ArrayView<const char, 6> z(init); |
+ z = x; // Copy non-const -> const. |
+ EXPECT_EQ(arr, z.data()); |
+ ArrayView<const char, 6> w(init); |
+ w = z; // Copy const -> const. |
+ EXPECT_EQ(arr, w.data()); |
+ // ArrayView<char, 6> v(init); |
+ // v = z; // Compile error, because can't drop const. |
+ |
+ // Copy fixed -> variable. |
+ ArrayView<char> yv; |
+ yv = x; // Copy non-const -> non-const. |
+ EXPECT_EQ(6u, yv.size()); |
+ EXPECT_EQ(arr, yv.data()); |
+ ArrayView<const char> zv; |
+ zv = x; // Copy non-const -> const. |
+ EXPECT_EQ(6u, zv.size()); |
+ EXPECT_EQ(arr, zv.data()); |
+ ArrayView<const char> wv; |
+ wv = z; // Copy const -> const. |
+ EXPECT_EQ(6u, wv.size()); |
+ EXPECT_EQ(arr, wv.data()); |
+ // ArrayView<char> v; |
+ // v = z; // Compile error, because can't drop const. |
+} |
+ |
TEST(ArrayViewTest, TestStdVector) { |
std::vector<int> v; |
v.push_back(3); |
@@ -146,7 +225,7 @@ TEST(ArrayViewTest, TestRtcBuffer) { |
// ArrayView<uint8_t> w = cb; // Compile error, because can't drop const. |
} |
-TEST(ArrayViewTest, TestSwap) { |
+TEST(ArrayViewTest, TestSwapVariable) { |
const char arr[] = "Arrr!"; |
const char aye[] = "Aye, Cap'n!"; |
ArrayView<const char> x(arr); |
@@ -165,11 +244,28 @@ TEST(ArrayViewTest, TestSwap) { |
// swap(x, z); // Compile error, because can't drop const. |
} |
+TEST(FixArrayViewTest, TestSwapFixed) { |
+ const char arr[] = "Arr!"; |
+ char aye[] = "Aye!"; |
+ ArrayView<const char, 5> x(arr); |
+ EXPECT_EQ(arr, x.data()); |
+ ArrayView<const char, 5> y(aye); |
+ EXPECT_EQ(aye, y.data()); |
+ using std::swap; |
+ swap(x, y); |
+ EXPECT_EQ(aye, x.data()); |
+ EXPECT_EQ(arr, y.data()); |
+ // ArrayView<char, 5> z(aye); |
+ // swap(x, z); // Compile error, because can't drop const. |
+ // ArrayView<const char, 4> w(aye, 4); |
+ // swap(x, w); // Compile error, because different sizes. |
+} |
+ |
TEST(ArrayViewTest, TestIndexing) { |
char arr[] = "abcdefg"; |
ArrayView<char> x(arr); |
const ArrayView<char> y(arr); |
- ArrayView<const char> z(arr); |
+ ArrayView<const char, 8> z(arr); |
EXPECT_EQ(8u, x.size()); |
EXPECT_EQ(8u, y.size()); |
EXPECT_EQ(8u, z.size()); |
@@ -188,18 +284,26 @@ TEST(ArrayViewTest, TestIndexing) { |
} |
TEST(ArrayViewTest, TestIterationEmpty) { |
+ // Variable-size. |
ArrayView<std::vector<std::vector<std::vector<std::string>>>> av; |
- EXPECT_FALSE(av.begin()); |
- EXPECT_FALSE(av.cbegin()); |
- EXPECT_FALSE(av.end()); |
- EXPECT_FALSE(av.cend()); |
+ EXPECT_EQ(av.begin(), av.end()); |
+ EXPECT_EQ(av.cbegin(), av.cend()); |
for (auto& e : av) { |
EXPECT_TRUE(false); |
EXPECT_EQ(42u, e.size()); // Dummy use of e to prevent unused var warning. |
} |
+ |
+ // Fixed-size. |
+ ArrayView<std::vector<std::vector<std::vector<std::string>>>, 0> af; |
+ EXPECT_EQ(af.begin(), af.end()); |
+ EXPECT_EQ(af.cbegin(), af.cend()); |
+ for (auto& e : af) { |
+ EXPECT_TRUE(false); |
+ EXPECT_EQ(42u, e.size()); // Dummy use of e to prevent unused var warning. |
+ } |
} |
-TEST(ArrayViewTest, TestIteration) { |
+TEST(ArrayViewTest, TestIterationVariable) { |
char arr[] = "Arrr!"; |
ArrayView<char> av(arr); |
EXPECT_EQ('A', *av.begin()); |
@@ -220,23 +324,57 @@ TEST(ArrayViewTest, TestIteration) { |
} |
} |
+TEST(ArrayViewTest, TestIterationFixed) { |
+ char arr[] = "Arrr!"; |
+ ArrayView<char, 6> av(arr); |
+ EXPECT_EQ('A', *av.begin()); |
+ EXPECT_EQ('A', *av.cbegin()); |
+ EXPECT_EQ('\0', *(av.end() - 1)); |
+ EXPECT_EQ('\0', *(av.cend() - 1)); |
+ char i = 0; |
+ for (auto& e : av) { |
+ EXPECT_EQ(arr + i, &e); |
+ e = 's' + i; |
+ ++i; |
+ } |
+ i = 0; |
+ for (auto& e : ArrayView<const char, 6>(av)) { |
+ EXPECT_EQ(arr + i, &e); |
+ // e = 'q' + i; // Compile error, because e is a const char&. |
+ ++i; |
+ } |
+} |
+ |
TEST(ArrayViewTest, TestEmpty) { |
EXPECT_TRUE(ArrayView<int>().empty()); |
const int a[] = {1, 2, 3}; |
EXPECT_FALSE(ArrayView<const int>(a).empty()); |
+ |
+ static_assert(ArrayView<int, 0>::empty(), ""); |
+ static_assert(!ArrayView<int, 3>::empty(), ""); |
} |
TEST(ArrayViewTest, TestCompare) { |
int a[] = {1, 2, 3}; |
int b[] = {1, 2, 3}; |
+ |
EXPECT_EQ(ArrayView<int>(a), ArrayView<int>(a)); |
+ EXPECT_EQ((ArrayView<int, 3>(a)), (ArrayView<int, 3>(a))); |
+ EXPECT_EQ(ArrayView<int>(a), (ArrayView<int, 3>(a))); |
EXPECT_EQ(ArrayView<int>(), ArrayView<int>()); |
+ EXPECT_EQ(ArrayView<int>(), ArrayView<int>(a, 0)); |
+ EXPECT_EQ(ArrayView<int>(a, 0), ArrayView<int>(b, 0)); |
+ EXPECT_EQ((ArrayView<int, 0>(a, 0)), ArrayView<int>()); |
+ |
EXPECT_NE(ArrayView<int>(a), ArrayView<int>(b)); |
+ EXPECT_NE((ArrayView<int, 3>(a)), (ArrayView<int, 3>(b))); |
+ EXPECT_NE((ArrayView<int, 3>(a)), ArrayView<int>(b)); |
EXPECT_NE(ArrayView<int>(a), ArrayView<int>()); |
EXPECT_NE(ArrayView<int>(a), ArrayView<int>(a, 2)); |
+ EXPECT_NE((ArrayView<int, 3>(a)), (ArrayView<int, 2>(a, 2))); |
} |
-TEST(ArrayViewTest, TestSubView) { |
+TEST(ArrayViewTest, TestSubViewVariable) { |
int a[] = {1, 2, 3}; |
ArrayView<int> av(a); |
@@ -253,4 +391,21 @@ TEST(ArrayViewTest, TestSubView) { |
EXPECT_THAT(av.subview(1, 3), ElementsAre(2, 3)); |
} |
+TEST(ArrayViewTest, TestSubViewFixed) { |
+ int a[] = {1, 2, 3}; |
+ ArrayView<int, 3> av(a); |
+ |
+ EXPECT_EQ(av.subview(0), av); |
+ |
+ EXPECT_THAT(av.subview(1), ElementsAre(2, 3)); |
+ EXPECT_THAT(av.subview(2), ElementsAre(3)); |
+ EXPECT_THAT(av.subview(3), IsEmpty()); |
+ EXPECT_THAT(av.subview(4), IsEmpty()); |
+ |
+ EXPECT_THAT(av.subview(1, 0), IsEmpty()); |
+ EXPECT_THAT(av.subview(1, 1), ElementsAre(2)); |
+ EXPECT_THAT(av.subview(1, 2), ElementsAre(2, 3)); |
+ EXPECT_THAT(av.subview(1, 3), ElementsAre(2, 3)); |
+} |
+ |
} // namespace rtc |