tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

adapters.h (1533B)


      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 
     25  explicit ReversedAdapter(T& t) : t_(t) {}
     26  ReversedAdapter(const ReversedAdapter& ra) : t_(ra.t_) {}
     27  ReversedAdapter& operator=(const ReversedAdapter&) = delete;
     28 
     29  Iterator begin() const { return std::rbegin(t_); }
     30  Iterator end() const { return std::rend(t_); }
     31 
     32 private:
     33  // Not a raw_ref<...> for performance reasons: on-stack pointer.
     34  // It is only used inside for loops. Ideally, the container being iterated
     35  // over should be the 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>
     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_