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