1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_CONTAINERS_ADAPTERS_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_CONTAINERS_ADAPTERS_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stddef.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include <iterator> 11*6777b538SAndroid Build Coastguard Worker #include <utility> 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr_exclusion.h" 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker namespace base { 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker namespace internal { 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Worker // Internal adapter class for implementing base::Reversed. 20*6777b538SAndroid Build Coastguard Worker template <typename T> 21*6777b538SAndroid Build Coastguard Worker class ReversedAdapter { 22*6777b538SAndroid Build Coastguard Worker public: 23*6777b538SAndroid Build Coastguard Worker using Iterator = decltype(std::rbegin(std::declval<T&>())); 24*6777b538SAndroid Build Coastguard Worker ReversedAdapter(T & t)25*6777b538SAndroid Build Coastguard Worker explicit ReversedAdapter(T& t) : t_(t) {} ReversedAdapter(const ReversedAdapter & ra)26*6777b538SAndroid Build Coastguard Worker ReversedAdapter(const ReversedAdapter& ra) : t_(ra.t_) {} 27*6777b538SAndroid Build Coastguard Worker ReversedAdapter& operator=(const ReversedAdapter&) = delete; 28*6777b538SAndroid Build Coastguard Worker begin()29*6777b538SAndroid Build Coastguard Worker Iterator begin() const { return std::rbegin(t_); } end()30*6777b538SAndroid Build Coastguard Worker Iterator end() const { return std::rend(t_); } 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker private: 33*6777b538SAndroid Build Coastguard Worker // RAW_PTR_EXCLUSION: References a STACK_ALLOCATED class. It is only used 34*6777b538SAndroid Build Coastguard Worker // inside for loops. Ideally, the container being iterated over should be the 35*6777b538SAndroid Build Coastguard Worker // one held via a raw_ref/raw_ptrs. 36*6777b538SAndroid Build Coastguard Worker RAW_PTR_EXCLUSION T& t_; 37*6777b538SAndroid Build Coastguard Worker }; 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Worker } // namespace internal 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker // Reversed returns a container adapter usable in a range-based "for" statement 42*6777b538SAndroid Build Coastguard Worker // for iterating a reversible container in reverse order. 43*6777b538SAndroid Build Coastguard Worker // 44*6777b538SAndroid Build Coastguard Worker // Example: 45*6777b538SAndroid Build Coastguard Worker // 46*6777b538SAndroid Build Coastguard Worker // std::vector<int> v = ...; 47*6777b538SAndroid Build Coastguard Worker // for (int i : base::Reversed(v)) { 48*6777b538SAndroid Build Coastguard Worker // // iterates through v from back to front 49*6777b538SAndroid Build Coastguard Worker // } 50*6777b538SAndroid Build Coastguard Worker template <typename T> Reversed(T & t)51*6777b538SAndroid Build Coastguard Workerinternal::ReversedAdapter<T> Reversed(T& t) { 52*6777b538SAndroid Build Coastguard Worker return internal::ReversedAdapter<T>(t); 53*6777b538SAndroid Build Coastguard Worker } 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker } // namespace base 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Worker #endif // BASE_CONTAINERS_ADAPTERS_H_ 58