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