1*635a8641SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors. All rights reserved. 2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file. 4*635a8641SAndroid Build Coastguard Worker 5*635a8641SAndroid Build Coastguard Worker #ifndef BASE_CONTAINERS_ADAPTERS_H_ 6*635a8641SAndroid Build Coastguard Worker #define BASE_CONTAINERS_ADAPTERS_H_ 7*635a8641SAndroid Build Coastguard Worker 8*635a8641SAndroid Build Coastguard Worker #include <stddef.h> 9*635a8641SAndroid Build Coastguard Worker 10*635a8641SAndroid Build Coastguard Worker #include <iterator> 11*635a8641SAndroid Build Coastguard Worker 12*635a8641SAndroid Build Coastguard Worker #include "base/macros.h" 13*635a8641SAndroid Build Coastguard Worker 14*635a8641SAndroid Build Coastguard Worker namespace base { 15*635a8641SAndroid Build Coastguard Worker 16*635a8641SAndroid Build Coastguard Worker namespace internal { 17*635a8641SAndroid Build Coastguard Worker 18*635a8641SAndroid Build Coastguard Worker // Internal adapter class for implementing base::Reversed. 19*635a8641SAndroid Build Coastguard Worker template <typename T> 20*635a8641SAndroid Build Coastguard Worker class ReversedAdapter { 21*635a8641SAndroid Build Coastguard Worker public: 22*635a8641SAndroid Build Coastguard Worker using Iterator = decltype(static_cast<T*>(nullptr)->rbegin()); 23*635a8641SAndroid Build Coastguard Worker ReversedAdapter(T & t)24*635a8641SAndroid Build Coastguard Worker explicit ReversedAdapter(T& t) : t_(t) {} ReversedAdapter(const ReversedAdapter & ra)25*635a8641SAndroid Build Coastguard Worker ReversedAdapter(const ReversedAdapter& ra) : t_(ra.t_) {} 26*635a8641SAndroid Build Coastguard Worker 27*635a8641SAndroid Build Coastguard Worker // TODO(mdempsky): Once we can use C++14 library features, use std::rbegin 28*635a8641SAndroid Build Coastguard Worker // and std::rend instead, so we can remove the specialization below. begin()29*635a8641SAndroid Build Coastguard Worker Iterator begin() const { return t_.rbegin(); } end()30*635a8641SAndroid Build Coastguard Worker Iterator end() const { return t_.rend(); } 31*635a8641SAndroid Build Coastguard Worker 32*635a8641SAndroid Build Coastguard Worker private: 33*635a8641SAndroid Build Coastguard Worker T& t_; 34*635a8641SAndroid Build Coastguard Worker 35*635a8641SAndroid Build Coastguard Worker DISALLOW_ASSIGN(ReversedAdapter); 36*635a8641SAndroid Build Coastguard Worker }; 37*635a8641SAndroid Build Coastguard Worker 38*635a8641SAndroid Build Coastguard Worker template <typename T, size_t N> 39*635a8641SAndroid Build Coastguard Worker class ReversedAdapter<T[N]> { 40*635a8641SAndroid Build Coastguard Worker public: 41*635a8641SAndroid Build Coastguard Worker using Iterator = std::reverse_iterator<T*>; 42*635a8641SAndroid Build Coastguard Worker ReversedAdapter(T (& t)[N])43*635a8641SAndroid Build Coastguard Worker explicit ReversedAdapter(T (&t)[N]) : t_(t) {} ReversedAdapter(const ReversedAdapter & ra)44*635a8641SAndroid Build Coastguard Worker ReversedAdapter(const ReversedAdapter& ra) : t_(ra.t_) {} 45*635a8641SAndroid Build Coastguard Worker begin()46*635a8641SAndroid Build Coastguard Worker Iterator begin() const { return Iterator(&t_[N]); } end()47*635a8641SAndroid Build Coastguard Worker Iterator end() const { return Iterator(&t_[0]); } 48*635a8641SAndroid Build Coastguard Worker 49*635a8641SAndroid Build Coastguard Worker private: 50*635a8641SAndroid Build Coastguard Worker T (&t_)[N]; 51*635a8641SAndroid Build Coastguard Worker 52*635a8641SAndroid Build Coastguard Worker DISALLOW_ASSIGN(ReversedAdapter); 53*635a8641SAndroid Build Coastguard Worker }; 54*635a8641SAndroid Build Coastguard Worker 55*635a8641SAndroid Build Coastguard Worker } // namespace internal 56*635a8641SAndroid Build Coastguard Worker 57*635a8641SAndroid Build Coastguard Worker // Reversed returns a container adapter usable in a range-based "for" statement 58*635a8641SAndroid Build Coastguard Worker // for iterating a reversible container in reverse order. 59*635a8641SAndroid Build Coastguard Worker // 60*635a8641SAndroid Build Coastguard Worker // Example: 61*635a8641SAndroid Build Coastguard Worker // 62*635a8641SAndroid Build Coastguard Worker // std::vector<int> v = ...; 63*635a8641SAndroid Build Coastguard Worker // for (int i : base::Reversed(v)) { 64*635a8641SAndroid Build Coastguard Worker // // iterates through v from back to front 65*635a8641SAndroid Build Coastguard Worker // } 66*635a8641SAndroid Build Coastguard Worker template <typename T> Reversed(T & t)67*635a8641SAndroid Build Coastguard Workerinternal::ReversedAdapter<T> Reversed(T& t) { 68*635a8641SAndroid Build Coastguard Worker return internal::ReversedAdapter<T>(t); 69*635a8641SAndroid Build Coastguard Worker } 70*635a8641SAndroid Build Coastguard Worker 71*635a8641SAndroid Build Coastguard Worker } // namespace base 72*635a8641SAndroid Build Coastguard Worker 73*635a8641SAndroid Build Coastguard Worker #endif // BASE_CONTAINERS_ADAPTERS_H_ 74