From e2c548503beb7d5398acd537dc4cab2d3c4775f7 Mon Sep 17 00:00:00 2001 From: Alessio Bazzica Date: Tue, 20 Oct 2020 17:24:55 +0200 Subject: [PATCH] rtc::ArrayView reverse iterators - rtc::ArrayView::rbegin() - rtc::ArrayView::rend() - rtc::ArrayView::crbegin() - rtc::ArrayView::crend() Bug: webrtc:7494 Change-Id: Id773d66cc9da8bd58def1dba35a706914440ef37 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/189880 Reviewed-by: Karl Wiberg Commit-Queue: Alessio Bazzica Cr-Commit-Position: refs/heads/master@{#32458} --- api/array_view.h | 13 ++++++++++ api/array_view_unittest.cc | 52 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/api/array_view.h b/api/array_view.h index a66369a3d3..df365cb740 100644 --- a/api/array_view.h +++ b/api/array_view.h @@ -13,6 +13,7 @@ #include #include +#include #include #include "rtc_base/checks.h" @@ -258,6 +259,18 @@ class ArrayView final : public impl::ArrayViewBase { T* end() const { return this->data() + this->size(); } const T* cbegin() const { return this->data(); } const T* cend() const { return this->data() + this->size(); } + std::reverse_iterator rbegin() const { + return std::make_reverse_iterator(end()); + } + std::reverse_iterator rend() const { + return std::make_reverse_iterator(begin()); + } + std::reverse_iterator crbegin() const { + return std::make_reverse_iterator(cend()); + } + std::reverse_iterator crend() const { + return std::make_reverse_iterator(cbegin()); + } ArrayView subview(size_t offset, size_t size) const { return offset < this->size() diff --git a/api/array_view_unittest.cc b/api/array_view_unittest.cc index 0357f68aa2..97267df006 100644 --- a/api/array_view_unittest.cc +++ b/api/array_view_unittest.cc @@ -451,6 +451,20 @@ TEST(ArrayViewTest, TestIterationEmpty) { } } +TEST(ArrayViewTest, TestReverseIterationEmpty) { + // Variable-size. + ArrayView>>> av; + EXPECT_EQ(av.rbegin(), av.rend()); + EXPECT_EQ(av.crbegin(), av.crend()); + EXPECT_TRUE(av.empty()); + + // Fixed-size. + ArrayView>>, 0> af; + EXPECT_EQ(af.begin(), af.end()); + EXPECT_EQ(af.cbegin(), af.cend()); + EXPECT_TRUE(af.empty()); +} + TEST(ArrayViewTest, TestIterationVariable) { char arr[] = "Arrr!"; ArrayView av(arr); @@ -472,6 +486,25 @@ TEST(ArrayViewTest, TestIterationVariable) { } } +TEST(ArrayViewTest, TestReverseIterationVariable) { + char arr[] = "Arrr!"; + ArrayView av(arr); + EXPECT_EQ('\0', *av.rbegin()); + EXPECT_EQ('\0', *av.crbegin()); + EXPECT_EQ('A', *(av.rend() - 1)); + EXPECT_EQ('A', *(av.crend() - 1)); + + const char* cit = av.cend() - 1; + for (auto crit = av.crbegin(); crit != av.crend(); ++crit, --cit) { + EXPECT_EQ(*cit, *crit); + } + + char* it = av.end() - 1; + for (auto rit = av.rbegin(); rit != av.rend(); ++rit, --it) { + EXPECT_EQ(*it, *rit); + } +} + TEST(ArrayViewTest, TestIterationFixed) { char arr[] = "Arrr!"; ArrayView av(arr); @@ -493,6 +526,25 @@ TEST(ArrayViewTest, TestIterationFixed) { } } +TEST(ArrayViewTest, TestReverseIterationFixed) { + char arr[] = "Arrr!"; + ArrayView av(arr); + EXPECT_EQ('\0', *av.rbegin()); + EXPECT_EQ('\0', *av.crbegin()); + EXPECT_EQ('A', *(av.rend() - 1)); + EXPECT_EQ('A', *(av.crend() - 1)); + + const char* cit = av.cend() - 1; + for (auto crit = av.crbegin(); crit != av.crend(); ++crit, --cit) { + EXPECT_EQ(*cit, *crit); + } + + char* it = av.end() - 1; + for (auto rit = av.rbegin(); rit != av.rend(); ++rit, --it) { + EXPECT_EQ(*it, *rit); + } +} + TEST(ArrayViewTest, TestEmpty) { EXPECT_TRUE(ArrayView().empty()); const int a[] = {1, 2, 3};