1958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Copyright 2014 the V8 project authors. All rights reserved.
2958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Use of this source code is governed by a BSD-style license that can be
3958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// found in the LICENSE file.
4958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#ifndef V8_BASE_ITERATOR_H_
6958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define V8_BASE_ITERATOR_H_
7958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
8958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include <iterator>
9958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
10958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniernamespace v8 {
11958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniernamespace base {
12958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
13958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// The intention of the base::iterator_range class is to encapsulate two
14958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// iterators so that the range defined by the iterators can be used like
15958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// a regular STL container (actually only a subset of the full container
16958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// functionality is available usually).
17958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertemplate <typename ForwardIterator>
18958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass iterator_range {
19958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
20958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  typedef ForwardIterator iterator;
21958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  typedef ForwardIterator const_iterator;
22958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  typedef typename std::iterator_traits<iterator>::pointer pointer;
23958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  typedef typename std::iterator_traits<iterator>::reference reference;
24958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  typedef typename std::iterator_traits<iterator>::value_type value_type;
25958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  typedef
26958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      typename std::iterator_traits<iterator>::difference_type difference_type;
27958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
28958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  iterator_range() : begin_(), end_() {}
29958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  template <typename ForwardIterator2>
30958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  iterator_range(ForwardIterator2 const& begin, ForwardIterator2 const& end)
31958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      : begin_(begin), end_(end) {}
32958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
33958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  iterator begin() { return begin_; }
34958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  iterator end() { return end_; }
35958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  const_iterator begin() const { return begin_; }
36958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  const_iterator end() const { return end_; }
37958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  const_iterator cbegin() const { return begin_; }
38958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  const_iterator cend() const { return end_; }
39958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
40958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool empty() const { return cbegin() == cend(); }
41958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
42958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Random Access iterators only.
43958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  reference operator[](difference_type n) { return begin()[n]; }
44958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  difference_type size() const { return cend() - cbegin(); }
45958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
46958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
47958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  const_iterator const begin_;
48958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  const_iterator const end_;
49958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
50958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
51958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}  // namespace base
52958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}  // namespace v8
53958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
54958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif  // V8_BASE_ITERATOR_H_
55