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