xref: /aosp_15_r20/external/libchrome/base/containers/adapters.h (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #ifndef BASE_CONTAINERS_ADAPTERS_H_
6*635a8641SAndroid Build Coastguard Worker #define BASE_CONTAINERS_ADAPTERS_H_
7*635a8641SAndroid Build Coastguard Worker 
8*635a8641SAndroid Build Coastguard Worker #include <stddef.h>
9*635a8641SAndroid Build Coastguard Worker 
10*635a8641SAndroid Build Coastguard Worker #include <iterator>
11*635a8641SAndroid Build Coastguard Worker 
12*635a8641SAndroid Build Coastguard Worker #include "base/macros.h"
13*635a8641SAndroid Build Coastguard Worker 
14*635a8641SAndroid Build Coastguard Worker namespace base {
15*635a8641SAndroid Build Coastguard Worker 
16*635a8641SAndroid Build Coastguard Worker namespace internal {
17*635a8641SAndroid Build Coastguard Worker 
18*635a8641SAndroid Build Coastguard Worker // Internal adapter class for implementing base::Reversed.
19*635a8641SAndroid Build Coastguard Worker template <typename T>
20*635a8641SAndroid Build Coastguard Worker class ReversedAdapter {
21*635a8641SAndroid Build Coastguard Worker  public:
22*635a8641SAndroid Build Coastguard Worker   using Iterator = decltype(static_cast<T*>(nullptr)->rbegin());
23*635a8641SAndroid Build Coastguard Worker 
ReversedAdapter(T & t)24*635a8641SAndroid Build Coastguard Worker   explicit ReversedAdapter(T& t) : t_(t) {}
ReversedAdapter(const ReversedAdapter & ra)25*635a8641SAndroid Build Coastguard Worker   ReversedAdapter(const ReversedAdapter& ra) : t_(ra.t_) {}
26*635a8641SAndroid Build Coastguard Worker 
27*635a8641SAndroid Build Coastguard Worker   // TODO(mdempsky): Once we can use C++14 library features, use std::rbegin
28*635a8641SAndroid Build Coastguard Worker   // and std::rend instead, so we can remove the specialization below.
begin()29*635a8641SAndroid Build Coastguard Worker   Iterator begin() const { return t_.rbegin(); }
end()30*635a8641SAndroid Build Coastguard Worker   Iterator end() const { return t_.rend(); }
31*635a8641SAndroid Build Coastguard Worker 
32*635a8641SAndroid Build Coastguard Worker  private:
33*635a8641SAndroid Build Coastguard Worker   T& t_;
34*635a8641SAndroid Build Coastguard Worker 
35*635a8641SAndroid Build Coastguard Worker   DISALLOW_ASSIGN(ReversedAdapter);
36*635a8641SAndroid Build Coastguard Worker };
37*635a8641SAndroid Build Coastguard Worker 
38*635a8641SAndroid Build Coastguard Worker template <typename T, size_t N>
39*635a8641SAndroid Build Coastguard Worker class ReversedAdapter<T[N]> {
40*635a8641SAndroid Build Coastguard Worker  public:
41*635a8641SAndroid Build Coastguard Worker   using Iterator = std::reverse_iterator<T*>;
42*635a8641SAndroid Build Coastguard Worker 
ReversedAdapter(T (& t)[N])43*635a8641SAndroid Build Coastguard Worker   explicit ReversedAdapter(T (&t)[N]) : t_(t) {}
ReversedAdapter(const ReversedAdapter & ra)44*635a8641SAndroid Build Coastguard Worker   ReversedAdapter(const ReversedAdapter& ra) : t_(ra.t_) {}
45*635a8641SAndroid Build Coastguard Worker 
begin()46*635a8641SAndroid Build Coastguard Worker   Iterator begin() const { return Iterator(&t_[N]); }
end()47*635a8641SAndroid Build Coastguard Worker   Iterator end() const { return Iterator(&t_[0]); }
48*635a8641SAndroid Build Coastguard Worker 
49*635a8641SAndroid Build Coastguard Worker  private:
50*635a8641SAndroid Build Coastguard Worker   T (&t_)[N];
51*635a8641SAndroid Build Coastguard Worker 
52*635a8641SAndroid Build Coastguard Worker   DISALLOW_ASSIGN(ReversedAdapter);
53*635a8641SAndroid Build Coastguard Worker };
54*635a8641SAndroid Build Coastguard Worker 
55*635a8641SAndroid Build Coastguard Worker }  // namespace internal
56*635a8641SAndroid Build Coastguard Worker 
57*635a8641SAndroid Build Coastguard Worker // Reversed returns a container adapter usable in a range-based "for" statement
58*635a8641SAndroid Build Coastguard Worker // for iterating a reversible container in reverse order.
59*635a8641SAndroid Build Coastguard Worker //
60*635a8641SAndroid Build Coastguard Worker // Example:
61*635a8641SAndroid Build Coastguard Worker //
62*635a8641SAndroid Build Coastguard Worker //   std::vector<int> v = ...;
63*635a8641SAndroid Build Coastguard Worker //   for (int i : base::Reversed(v)) {
64*635a8641SAndroid Build Coastguard Worker //     // iterates through v from back to front
65*635a8641SAndroid Build Coastguard Worker //   }
66*635a8641SAndroid Build Coastguard Worker template <typename T>
Reversed(T & t)67*635a8641SAndroid Build Coastguard Worker internal::ReversedAdapter<T> Reversed(T& t) {
68*635a8641SAndroid Build Coastguard Worker   return internal::ReversedAdapter<T>(t);
69*635a8641SAndroid Build Coastguard Worker }
70*635a8641SAndroid Build Coastguard Worker 
71*635a8641SAndroid Build Coastguard Worker }  // namespace base
72*635a8641SAndroid Build Coastguard Worker 
73*635a8641SAndroid Build Coastguard Worker #endif  // BASE_CONTAINERS_ADAPTERS_H_
74