[go: nahoru, domu]

blob: c331b1fd6aac058c7801a5bbc7bb40d58ad03643 [file] [log] [blame]
Avi Drissmane4622aa2022-09-08 20:36:061// Copyright 2014 The Chromium Authors
mdempskyae846882014-09-29 18:48:122// 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
mdempsky13797822015-10-15 01:06:108#include <stddef.h>
9
10#include <iterator>
Avi Drissman7ca220e2018-12-28 01:53:5911#include <utility>
mdempsky13797822015-10-15 01:06:1012
Bartek Nowierski02011882023-06-20 19:00:1013#include "base/memory/raw_ptr_exclusion.h"
Ali Hijazia8877892022-11-10 20:51:0314
mdempskyae846882014-09-29 18:48:1215namespace base {
16
17namespace internal {
18
19// Internal adapter class for implementing base::Reversed.
20template <typename T>
21class ReversedAdapter {
22 public:
Avi Drissman7ca220e2018-12-28 01:53:5923 using Iterator = decltype(std::rbegin(std::declval<T&>()));
mdempskyae846882014-09-29 18:48:1224
25 explicit ReversedAdapter(T& t) : t_(t) {}
26 ReversedAdapter(const ReversedAdapter& ra) : t_(ra.t_) {}
Lei Zhang6825df42020-06-23 16:17:4327 ReversedAdapter& operator=(const ReversedAdapter&) = delete;
mdempskyae846882014-09-29 18:48:1228
Bartek Nowierski02011882023-06-20 19:00:1029 Iterator begin() const { return std::rbegin(t_); }
30 Iterator end() const { return std::rend(t_); }
mdempskyae846882014-09-29 18:48:1231
32 private:
Bartek Nowierskif5eeeba2024-01-25 12:49:3933 // 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.
Bartek Nowierski02011882023-06-20 19:00:1036 RAW_PTR_EXCLUSION T& t_;
mdempskyae846882014-09-29 18:48:1237};
38
mdempskyae846882014-09-29 18:48:1239} // 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// }
50template <typename T>
51internal::ReversedAdapter<T> Reversed(T& t) {
52 return internal::ReversedAdapter<T>(t);
53}
54
55} // namespace base
56
57#endif // BASE_CONTAINERS_ADAPTERS_H_