1 // Copyright 2020 The Chromium Authors. All rights reserved. 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 THIRD_PARTY_BASE_CONTAINERS_ADAPTERS_H_ 6 #define THIRD_PARTY_BASE_CONTAINERS_ADAPTERS_H_ 7 8 #include <stddef.h> 9 10 #include <iterator> 11 #include <utility> 12 13 namespace pdfium { 14 namespace base { 15 16 namespace internal { 17 18 // Internal adapter class for implementing base::Reversed. 19 template <typename T> 20 class ReversedAdapter { 21 public: 22 using Iterator = decltype(std::rbegin(std::declval<T&>())); 23 ReversedAdapter(T & t)24 explicit ReversedAdapter(T& t) : t_(t) {} ReversedAdapter(const ReversedAdapter & ra)25 ReversedAdapter(const ReversedAdapter& ra) : t_(ra.t_) {} 26 ReversedAdapter& operator=(const ReversedAdapter&) = delete; 27 begin()28 Iterator begin() const { return std::rbegin(t_); } end()29 Iterator end() const { return std::rend(t_); } 30 31 private: 32 T& t_; 33 }; 34 35 } // namespace internal 36 37 // Reversed returns a container adapter usable in a range-based "for" statement 38 // for iterating a reversible container in reverse order. 39 // 40 // Example: 41 // 42 // std::vector<int> v = ...; 43 // for (int i : base::Reversed(v)) { 44 // // iterates through v from back to front 45 // } 46 template <typename T> Reversed(T & t)47internal::ReversedAdapter<T> Reversed(T& t) { 48 return internal::ReversedAdapter<T>(t); 49 } 50 51 } // namespace base 52 } // namespace pdfium 53 54 #endif // THIRD_PARTY_BASE_CONTAINERS_ADAPTERS_H_ 55