Commit ae846887 authored by mdempsky's avatar mdempsky Committed by Commit bot

Add base::Reversed() as an adapter for range-based for loops in reverse

See also https://groups.google.com/a/chromium.org/d/msg/chromium-dev/utDItV2a7aE/IeVDbl5L77cJ

Review URL: https://codereview.chromium.org/605243003

Cr-Commit-Position: refs/heads/master@{#297216}
parent bddf8dd3
...@@ -119,6 +119,7 @@ component("base") { ...@@ -119,6 +119,7 @@ component("base") {
"command_line.cc", "command_line.cc",
"command_line.h", "command_line.h",
"compiler_specific.h", "compiler_specific.h",
"containers/adapters.h",
"containers/hash_tables.h", "containers/hash_tables.h",
"containers/linked_list.h", "containers/linked_list.h",
"containers/mru_cache.h", "containers/mru_cache.h",
...@@ -1103,6 +1104,7 @@ test("base_unittests") { ...@@ -1103,6 +1104,7 @@ test("base_unittests") {
"callback_unittest.nc", "callback_unittest.nc",
"cancelable_callback_unittest.cc", "cancelable_callback_unittest.cc",
"command_line_unittest.cc", "command_line_unittest.cc",
"containers/adapters_unittest.cc",
"containers/hash_tables_unittest.cc", "containers/hash_tables_unittest.cc",
"containers/linked_list_unittest.cc", "containers/linked_list_unittest.cc",
"containers/mru_cache_unittest.cc", "containers/mru_cache_unittest.cc",
......
...@@ -447,6 +447,7 @@ ...@@ -447,6 +447,7 @@
'callback_unittest.nc', 'callback_unittest.nc',
'cancelable_callback_unittest.cc', 'cancelable_callback_unittest.cc',
'command_line_unittest.cc', 'command_line_unittest.cc',
'containers/adapters_unittest.cc',
'containers/hash_tables_unittest.cc', 'containers/hash_tables_unittest.cc',
'containers/linked_list_unittest.cc', 'containers/linked_list_unittest.cc',
'containers/mru_cache_unittest.cc', 'containers/mru_cache_unittest.cc',
......
...@@ -122,6 +122,7 @@ ...@@ -122,6 +122,7 @@
'command_line.cc', 'command_line.cc',
'command_line.h', 'command_line.h',
'compiler_specific.h', 'compiler_specific.h',
'containers/adapters.h',
'containers/hash_tables.h', 'containers/hash_tables.h',
'containers/linked_list.h', 'containers/linked_list.h',
'containers/mru_cache.h', 'containers/mru_cache.h',
......
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef BASE_CONTAINERS_ADAPTERS_H_
#define BASE_CONTAINERS_ADAPTERS_H_
#include "base/macros.h"
namespace base {
namespace internal {
// Internal adapter class for implementing base::Reversed.
template <typename T>
class ReversedAdapter {
public:
typedef decltype(static_cast<T*>(nullptr)->rbegin()) Iterator;
explicit ReversedAdapter(T& t) : t_(t) {}
ReversedAdapter(const ReversedAdapter& ra) : t_(ra.t_) {}
Iterator begin() const { return t_.rbegin(); }
Iterator end() const { return t_.rend(); }
private:
T& t_;
DISALLOW_ASSIGN(ReversedAdapter);
};
} // namespace internal
// Reversed returns a container adapter usable in a range-based "for" statement
// for iterating a reversible container in reverse order.
//
// Example:
//
// std::vector<int> v = ...;
// for (int i : base::Reversed(v)) {
// // iterates through v from back to front
// }
template <typename T>
internal::ReversedAdapter<T> Reversed(T& t) {
return internal::ReversedAdapter<T>(t);
}
} // namespace base
#endif // BASE_CONTAINERS_ADAPTERS_H_
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/containers/adapters.h"
#include <vector>
#include "testing/gtest/include/gtest/gtest.h"
namespace {
TEST(AdaptersTest, Reversed) {
std::vector<int> v;
v.push_back(3);
v.push_back(2);
v.push_back(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, ConstReversed) {
std::vector<int> v;
v.push_back(3);
v.push_back(2);
v.push_back(1);
const std::vector<int>& cv = v;
int j = 0;
for (int i : base::Reversed(cv)) {
EXPECT_EQ(++j, i);
}
}
} // namespace
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment