Line data Source code
1 : // Copyright 2014 the V8 project 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 :
5 : #ifndef V8_BASE_ITERATOR_H_
6 : #define V8_BASE_ITERATOR_H_
7 :
8 : #include <iterator>
9 :
10 : namespace v8 {
11 : namespace base {
12 :
13 : template <class Category, class Type, class Diff = std::ptrdiff_t,
14 : class Pointer = Type*, class Reference = Type&>
15 : struct iterator {
16 : using iterator_category = Category;
17 : using value_type = Type;
18 : using difference_type = Diff;
19 : using pointer = Pointer;
20 : using reference = Reference;
21 : };
22 :
23 : // The intention of the base::iterator_range class is to encapsulate two
24 : // iterators so that the range defined by the iterators can be used like
25 : // a regular STL container (actually only a subset of the full container
26 : // functionality is available usually).
27 : template <typename ForwardIterator>
28 : class iterator_range {
29 : public:
30 : using iterator = ForwardIterator;
31 : using const_iterator = ForwardIterator;
32 : using pointer = typename std::iterator_traits<iterator>::pointer;
33 : using reference = typename std::iterator_traits<iterator>::reference;
34 : using value_type = typename std::iterator_traits<iterator>::value_type;
35 : using difference_type =
36 : typename std::iterator_traits<iterator>::difference_type;
37 :
38 : iterator_range() : begin_(), end_() {}
39 : template <typename ForwardIterator1, typename ForwardIterator2>
40 : iterator_range(ForwardIterator1&& begin, ForwardIterator2&& end)
41 : : begin_(std::forward<ForwardIterator1>(begin)),
42 : end_(std::forward<ForwardIterator2>(end)) {}
43 :
44 : iterator begin() { return begin_; }
45 : iterator end() { return end_; }
46 : const_iterator begin() const { return begin_; }
47 : const_iterator end() const { return end_; }
48 : const_iterator cbegin() const { return begin_; }
49 : const_iterator cend() const { return end_; }
50 :
51 : bool empty() const { return cbegin() == cend(); }
52 :
53 : // Random Access iterators only.
54 10 : reference operator[](difference_type n) { return begin()[n]; }
55 : difference_type size() const { return cend() - cbegin(); }
56 :
57 : private:
58 : const_iterator const begin_;
59 : const_iterator const end_;
60 : };
61 :
62 : } // namespace base
63 : } // namespace v8
64 :
65 : #endif // V8_BASE_ITERATOR_H_
|