1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file. 4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Slightly adapted for inclusion in V8. 6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2014 the V8 project authors. All rights reserved. 7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifndef V8_BASE_ADAPTERS_H_ 9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_BASE_ADAPTERS_H_ 10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/base/macros.h" 12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 { 14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace base { 15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Internal adapter class for implementing base::Reversed. 17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename T> 18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass ReversedAdapter { 19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef decltype(static_cast<T*>(nullptr)->rbegin()) Iterator; 21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch explicit ReversedAdapter(T& t) : t_(t) {} 23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ReversedAdapter(const ReversedAdapter& ra) : t_(ra.t_) {} 24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Iterator begin() const { return t_.rbegin(); } 26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Iterator end() const { return t_.rend(); } 27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch T& t_; 30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_ASSIGN(ReversedAdapter); 32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Reversed returns a container adapter usable in a range-based "for" statement 35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// for iterating a reversible container in reverse order. 36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// 37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Example: 38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// 39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// std::vector<int> v = ...; 40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// for (int i : base::Reversed(v)) { 41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// // iterates through v from back to front 42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// } 43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename T> 44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochReversedAdapter<T> Reversed(T& t) { 45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ReversedAdapter<T>(t); 46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace base 49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif // V8_BASE_ADAPTERS_H_ 52