Line data Source code
1 : // Copyright 2014 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 : // Slightly adapted for inclusion in V8.
6 : // Copyright 2014 the V8 project authors. All rights reserved.
7 :
8 : #ifndef V8_BASE_ADAPTERS_H_
9 : #define V8_BASE_ADAPTERS_H_
10 :
11 : #include <iterator>
12 :
13 : #include "src/base/macros.h"
14 :
15 : namespace v8 {
16 : namespace base {
17 :
18 : // Internal adapter class for implementing base::Reversed.
19 : template <typename T>
20 : class ReversedAdapter {
21 : public:
22 : using Iterator =
23 : std::reverse_iterator<decltype(std::begin(std::declval<T>()))>;
24 :
25 112 : explicit ReversedAdapter(T& t) : t_(t) {}
26 : ReversedAdapter(const ReversedAdapter& ra) V8_NOEXCEPT = default;
27 :
28 : // TODO(clemensh): Use std::rbegin/std::rend once we have C++14 support.
29 112 : Iterator begin() const { return Iterator(std::end(t_)); }
30 112 : Iterator end() const { return Iterator(std::begin(t_)); }
31 :
32 : private:
33 : T& t_;
34 :
35 : DISALLOW_ASSIGN(ReversedAdapter);
36 : };
37 :
38 : // Reversed returns a container adapter usable in a range-based "for" statement
39 : // for iterating a reversible container in reverse order.
40 : //
41 : // Example:
42 : //
43 : // std::vector<int> v = ...;
44 : // for (int i : base::Reversed(v)) {
45 : // // iterates through v from back to front
46 : // }
47 : template <typename T>
48 112 : ReversedAdapter<T> Reversed(T& t) {
49 112 : return ReversedAdapter<T>(t);
50 : }
51 :
52 : } // namespace base
53 : } // namespace v8
54 :
55 : #endif // V8_BASE_ADAPTERS_H_
|