• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)46 internal::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