summaryrefslogtreecommitdiffstats
path: root/base/containers
diff options
context:
space:
mode:
authormdempsky <mdempsky@chromium.org>2015-10-14 18:06:10 -0700
committerCommit bot <commit-bot@chromium.org>2015-10-15 01:06:45 +0000
commit137978257f920ebdaa7d65493f39194a6a4a2e0c (patch)
tree6c8f48a96b8ea87f3a8d67ca0bf6250bab880b04 /base/containers
parent92a1f510cfed4bc6b9c2973f6d7db387d80d8570 (diff)
downloadchromium_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.h25
-rw-r--r--base/containers/adapters_unittest.cc14
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);