xref: /aosp_15_r20/external/cronet/base/containers/adapters.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2014 The Chromium 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 BASE_CONTAINERS_ADAPTERS_H_
6 #define BASE_CONTAINERS_ADAPTERS_H_
7 
8 #include <stddef.h>
9 
10 #include <iterator>
11 #include <utility>
12 
13 #include "base/memory/raw_ptr_exclusion.h"
14 
15 namespace base {
16 
17 namespace internal {
18 
19 // Internal adapter class for implementing base::Reversed.
20 template <typename T>
21 class ReversedAdapter {
22  public:
23   using Iterator = decltype(std::rbegin(std::declval<T&>()));
24 
ReversedAdapter(T & t)25   explicit ReversedAdapter(T& t) : t_(t) {}
ReversedAdapter(const ReversedAdapter & ra)26   ReversedAdapter(const ReversedAdapter& ra) : t_(ra.t_) {}
27   ReversedAdapter& operator=(const ReversedAdapter&) = delete;
28 
begin()29   Iterator begin() const { return std::rbegin(t_); }
end()30   Iterator end() const { return std::rend(t_); }
31 
32  private:
33   // RAW_PTR_EXCLUSION: References a STACK_ALLOCATED class. It is only used
34   // inside for loops. Ideally, the container being iterated over should be the
35   // one held via a raw_ref/raw_ptrs.
36   RAW_PTR_EXCLUSION T& t_;
37 };
38 
39 }  // namespace internal
40 
41 // Reversed returns a container adapter usable in a range-based "for" statement
42 // for iterating a reversible container in reverse order.
43 //
44 // Example:
45 //
46 //   std::vector<int> v = ...;
47 //   for (int i : base::Reversed(v)) {
48 //     // iterates through v from back to front
49 //   }
50 template <typename T>
Reversed(T & t)51 internal::ReversedAdapter<T> Reversed(T& t) {
52   return internal::ReversedAdapter<T>(t);
53 }
54 
55 }  // namespace base
56 
57 #endif  // BASE_CONTAINERS_ADAPTERS_H_
58