From a28780e994692f2494d8d54fb4539003a212dd6b Mon Sep 17 00:00:00 2001 From: danilchap Date: Fri, 18 Nov 2016 01:46:23 -0800 Subject: [PATCH] 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} --- webrtc/base/array_view.h | 7 +++++++ webrtc/base/array_view_unittest.cc | 21 +++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/webrtc/base/array_view.h b/webrtc/base/array_view.h index 5c1ffe2489..aa73ef72f6 100644 --- a/webrtc/base/array_view.h +++ b/webrtc/base/array_view.h @@ -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) { diff --git a/webrtc/base/array_view_unittest.cc b/webrtc/base/array_view_unittest.cc index 91facb0043..f7fe9fa36b 100644 --- a/webrtc/base/array_view_unittest.cc +++ b/webrtc/base/array_view_unittest.cc @@ -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 void Call(ArrayView) {} @@ -232,4 +236,21 @@ TEST(ArrayViewTest, TestCompare) { EXPECT_NE(ArrayView(a), ArrayView(a, 2)); } +TEST(ArrayViewTest, TestSubView) { + int a[] = {1, 2, 3}; + ArrayView 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