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