adapters.h 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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. #ifndef BASE_CONTAINERS_ADAPTERS_H_
  5. #define BASE_CONTAINERS_ADAPTERS_H_
  6. #include <stddef.h>
  7. #include <iterator>
  8. #include <utility>
  9. #include "base/macros.h"
  10. namespace base {
  11. namespace internal {
  12. // Internal adapter class for implementing base::Reversed.
  13. template <typename T>
  14. class ReversedAdapter {
  15. public:
  16. using Iterator = decltype(std::rbegin(std::declval<T&>()));
  17. explicit ReversedAdapter(T& t) : t_(t) {}
  18. ReversedAdapter(const ReversedAdapter& ra) : t_(ra.t_) {}
  19. Iterator begin() const { return std::rbegin(t_); }
  20. Iterator end() const { return std::rend(t_); }
  21. private:
  22. T& t_;
  23. DISALLOW_ASSIGN(ReversedAdapter);
  24. };
  25. } // namespace internal
  26. // Reversed returns a container adapter usable in a range-based "for" statement
  27. // for iterating a reversible container in reverse order.
  28. //
  29. // Example:
  30. //
  31. // std::vector<int> v = ...;
  32. // for (int i : base::Reversed(v)) {
  33. // // iterates through v from back to front
  34. // }
  35. template <typename T>
  36. internal::ReversedAdapter<T> Reversed(T& t) {
  37. return internal::ReversedAdapter<T>(t);
  38. }
  39. } // namespace base
  40. #endif // BASE_CONTAINERS_ADAPTERS_H_