xref: /aosp_15_r20/external/pdfium/third_party/base/containers/adapters.h (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
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)47 internal::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