| // Copyright 2014 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef BASE_CONTAINERS_ADAPTERS_H_ | 
 | #define BASE_CONTAINERS_ADAPTERS_H_ | 
 |  | 
 | #include <stddef.h> | 
 |  | 
 | #include <iterator> | 
 |  | 
 | #include "base/macros.h" | 
 |  | 
 | namespace base { | 
 |  | 
 | namespace internal { | 
 |  | 
 | // Internal adapter class for implementing base::Reversed. | 
 | template <typename T> | 
 | class ReversedAdapter { | 
 |  public: | 
 |   using Iterator = decltype(static_cast<T*>(nullptr)->rbegin()); | 
 |  | 
 |   explicit ReversedAdapter(T& t) : t_(t) {} | 
 |   ReversedAdapter(const ReversedAdapter& ra) : t_(ra.t_) {} | 
 |  | 
 |   // TODO(mdempsky): Once we can use C++14 library features, use std::rbegin | 
 |   // and std::rend instead, so we can remove the specialization below. | 
 |   Iterator begin() const { return t_.rbegin(); } | 
 |   Iterator end() const { return t_.rend(); } | 
 |  | 
 |  private: | 
 |   T& t_; | 
 |  | 
 |   DISALLOW_ASSIGN(ReversedAdapter); | 
 | }; | 
 |  | 
 | template <typename T, size_t N> | 
 | class ReversedAdapter<T[N]> { | 
 |  public: | 
 |   using Iterator = std::reverse_iterator<T*>; | 
 |  | 
 |   explicit ReversedAdapter(T (&t)[N]) : t_(t) {} | 
 |   ReversedAdapter(const ReversedAdapter& ra) : t_(ra.t_) {} | 
 |  | 
 |   Iterator begin() const { return Iterator(&t_[N]); } | 
 |   Iterator end() const { return Iterator(&t_[0]); } | 
 |  | 
 |  private: | 
 |   T (&t_)[N]; | 
 |  | 
 |   DISALLOW_ASSIGN(ReversedAdapter); | 
 | }; | 
 |  | 
 | }  // namespace internal | 
 |  | 
 | // Reversed returns a container adapter usable in a range-based "for" statement | 
 | // for iterating a reversible container in reverse order. | 
 | // | 
 | // Example: | 
 | // | 
 | //   std::vector<int> v = ...; | 
 | //   for (int i : base::Reversed(v)) { | 
 | //     // iterates through v from back to front | 
 | //   } | 
 | template <typename T> | 
 | internal::ReversedAdapter<T> Reversed(T& t) { | 
 |   return internal::ReversedAdapter<T>(t); | 
 | } | 
 |  | 
 | }  // namespace base | 
 |  | 
 | #endif  // BASE_CONTAINERS_ADAPTERS_H_ |