Introduce ArrayView::subview function

to return portion of the original view

BUG=None

Review-Url: https://codereview.webrtc.org/2502383004
Cr-Commit-Position: refs/heads/master@{#15149}
This commit is contained in:
danilchap 2016-11-18 01:46:23 -08:00 committed by Commit bot
parent 509e4fe8e6
commit a28780e994
2 changed files with 28 additions and 0 deletions

View File

@ -120,6 +120,13 @@ class ArrayView final {
const T* cbegin() const { return data_; }
const T* cend() const { return data_ + size_; }
ArrayView subview(size_t offset, size_t size) const {
if (offset >= size_)
return ArrayView();
return ArrayView(data_ + offset, std::min(size, size_ - offset));
}
ArrayView subview(size_t offset) const { return subview(offset, size_); }
// Comparing two ArrayViews compares their (pointer,size) pairs; it does
// *not* dereference the pointers.
friend bool operator==(const ArrayView& a, const ArrayView& b) {

View File

@ -16,11 +16,15 @@
#include "webrtc/base/buffer.h"
#include "webrtc/base/checks.h"
#include "webrtc/base/gunit.h"
#include "webrtc/test/gmock.h"
namespace rtc {
namespace {
using ::testing::ElementsAre;
using ::testing::IsEmpty;
template <typename T>
void Call(ArrayView<T>) {}
@ -232,4 +236,21 @@ TEST(ArrayViewTest, TestCompare) {
EXPECT_NE(ArrayView<int>(a), ArrayView<int>(a, 2));
}
TEST(ArrayViewTest, TestSubView) {
int a[] = {1, 2, 3};
ArrayView<int> 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