diff options
author | mdempsky <mdempsky@chromium.org> | 2015-10-14 18:06:10 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-10-15 01:06:45 +0000 |
commit | 137978257f920ebdaa7d65493f39194a6a4a2e0c (patch) | |
tree | 6c8f48a96b8ea87f3a8d67ca0bf6250bab880b04 /base/containers | |
parent | 92a1f510cfed4bc6b9c2973f6d7db387d80d8570 (diff) | |
download | chromium_src-137978257f920ebdaa7d65493f39194a6a4a2e0c.zip chromium_src-137978257f920ebdaa7d65493f39194a6a4a2e0c.tar.gz chromium_src-137978257f920ebdaa7d65493f39194a6a4a2e0c.tar.bz2 |
Extend base::Reversed to support iterating arrays
C++11's range-based for syntax supports iterating arrays,
so it makes sense to support arrays in base::Reversed too.
Review URL: https://codereview.chromium.org/1360423002
Cr-Commit-Position: refs/heads/master@{#354181}
Diffstat (limited to 'base/containers')
-rw-r--r-- | base/containers/adapters.h | 25 | ||||
-rw-r--r-- | base/containers/adapters_unittest.cc | 14 |
2 files changed, 37 insertions, 2 deletions
diff --git a/base/containers/adapters.h b/base/containers/adapters.h index cc151fc2..fa671b4 100644 --- a/base/containers/adapters.h +++ b/base/containers/adapters.h @@ -5,6 +5,10 @@ #ifndef BASE_CONTAINERS_ADAPTERS_H_ #define BASE_CONTAINERS_ADAPTERS_H_ +#include <stddef.h> + +#include <iterator> + #include "base/macros.h" namespace base { @@ -15,11 +19,13 @@ namespace internal { template <typename T> class ReversedAdapter { public: - typedef decltype(static_cast<T*>(nullptr)->rbegin()) Iterator; + using Iterator = decltype(static_cast<T*>(nullptr)->rbegin()); explicit ReversedAdapter(T& t) : t_(t) {} ReversedAdapter(const ReversedAdapter& ra) : t_(ra.t_) {} + // TODO(mdempsky): Once we can use C++14 library features, use std::rbegin + // and std::rend instead, so we can remove the specialization below. Iterator begin() const { return t_.rbegin(); } Iterator end() const { return t_.rend(); } @@ -29,6 +35,23 @@ class ReversedAdapter { DISALLOW_ASSIGN(ReversedAdapter); }; +template <typename T, size_t N> +class ReversedAdapter<T[N]> { + public: + using Iterator = std::reverse_iterator<T*>; + + explicit ReversedAdapter(T (&t)[N]) : t_(t) {} + ReversedAdapter(const ReversedAdapter& ra) : t_(ra.t_) {} + + Iterator begin() const { return Iterator(&t_[N]); } + Iterator end() const { return Iterator(&t_[0]); } + + private: + T (&t_)[N]; + + DISALLOW_ASSIGN(ReversedAdapter); +}; + } // namespace internal // Reversed returns a container adapter usable in a range-based "for" statement diff --git a/base/containers/adapters_unittest.cc b/base/containers/adapters_unittest.cc index 4c87472..92554b7 100644 --- a/base/containers/adapters_unittest.cc +++ b/base/containers/adapters_unittest.cc @@ -25,7 +25,19 @@ TEST(AdaptersTest, Reversed) { EXPECT_EQ(101, v[2]); } -TEST(AdaptersTest, ConstReversed) { +TEST(AdaptersTest, ReversedArray) { + int v[3] = {3, 2, 1}; + int j = 0; + for (int& i : base::Reversed(v)) { + EXPECT_EQ(++j, i); + i += 100; + } + EXPECT_EQ(103, v[0]); + EXPECT_EQ(102, v[1]); + EXPECT_EQ(101, v[2]); +} + +TEST(AdaptersTest, ReversedConst) { std::vector<int> v; v.push_back(3); v.push_back(2); |