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 <kwiberg@webrtc.org> Commit-Queue: Alessio Bazzica <alessiob@webrtc.org> Cr-Commit-Position: refs/heads/master@{#32458}
This commit is contained in:
parent
4e8c115960
commit
e2c548503b
@ -13,6 +13,7 @@
|
||||
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <iterator>
|
||||
#include <type_traits>
|
||||
|
||||
#include "rtc_base/checks.h"
|
||||
@ -258,6 +259,18 @@ class ArrayView final : public impl::ArrayViewBase<T, Size> {
|
||||
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<T*> rbegin() const {
|
||||
return std::make_reverse_iterator(end());
|
||||
}
|
||||
std::reverse_iterator<T*> rend() const {
|
||||
return std::make_reverse_iterator(begin());
|
||||
}
|
||||
std::reverse_iterator<const T*> crbegin() const {
|
||||
return std::make_reverse_iterator(cend());
|
||||
}
|
||||
std::reverse_iterator<const T*> crend() const {
|
||||
return std::make_reverse_iterator(cbegin());
|
||||
}
|
||||
|
||||
ArrayView<T> subview(size_t offset, size_t size) const {
|
||||
return offset < this->size()
|
||||
|
||||
@ -451,6 +451,20 @@ TEST(ArrayViewTest, TestIterationEmpty) {
|
||||
}
|
||||
}
|
||||
|
||||
TEST(ArrayViewTest, TestReverseIterationEmpty) {
|
||||
// Variable-size.
|
||||
ArrayView<std::vector<std::vector<std::vector<std::string>>>> av;
|
||||
EXPECT_EQ(av.rbegin(), av.rend());
|
||||
EXPECT_EQ(av.crbegin(), av.crend());
|
||||
EXPECT_TRUE(av.empty());
|
||||
|
||||
// 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());
|
||||
EXPECT_TRUE(af.empty());
|
||||
}
|
||||
|
||||
TEST(ArrayViewTest, TestIterationVariable) {
|
||||
char arr[] = "Arrr!";
|
||||
ArrayView<char> av(arr);
|
||||
@ -472,6 +486,25 @@ TEST(ArrayViewTest, TestIterationVariable) {
|
||||
}
|
||||
}
|
||||
|
||||
TEST(ArrayViewTest, TestReverseIterationVariable) {
|
||||
char arr[] = "Arrr!";
|
||||
ArrayView<char> 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<char, 6> av(arr);
|
||||
@ -493,6 +526,25 @@ TEST(ArrayViewTest, TestIterationFixed) {
|
||||
}
|
||||
}
|
||||
|
||||
TEST(ArrayViewTest, TestReverseIterationFixed) {
|
||||
char arr[] = "Arrr!";
|
||||
ArrayView<char, 6> 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<int>().empty());
|
||||
const int a[] = {1, 2, 3};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user