]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | /*============================================================================= |
2 | Copyright (c) 2010 Daniel James | |
3 | ||
4 | Use, modification and distribution is subject to the Boost Software | |
5 | License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at | |
6 | http://www.boost.org/LICENSE_1_0.txt) | |
7 | =============================================================================*/ | |
8 | ||
9 | #if !defined(BOOST_SPIRIT_QUICKBOOK_ITERATOR_HPP) | |
10 | #define BOOST_SPIRIT_QUICKBOOK_ITERATOR_HPP | |
11 | ||
11fdf7f2 | 12 | #include <iterator> |
7c673cae | 13 | #include <boost/iterator/iterator_traits.hpp> |
11fdf7f2 | 14 | #include <boost/operators.hpp> |
7c673cae | 15 | #include <boost/range/iterator_range.hpp> |
b32b8144 | 16 | #include "string_view.hpp" |
7c673cae FG |
17 | |
18 | namespace quickbook | |
19 | { | |
20 | template <typename Iterator> | |
21 | struct lookback_iterator | |
22 | : boost::forward_iterator_helper< | |
11fdf7f2 TL |
23 | lookback_iterator<Iterator>, |
24 | typename boost::iterator_value<Iterator>::type, | |
25 | typename boost::iterator_difference<Iterator>::type, | |
26 | typename boost::iterator_pointer<Iterator>::type, | |
27 | typename boost::iterator_reference<Iterator>::type> | |
7c673cae FG |
28 | { |
29 | lookback_iterator() {} | |
11fdf7f2 TL |
30 | explicit lookback_iterator(Iterator i) : original_(i), base_(i) {} |
31 | ||
7c673cae | 32 | friend bool operator==( |
11fdf7f2 | 33 | lookback_iterator const& x, lookback_iterator const& y) |
7c673cae FG |
34 | { |
35 | return x.base_ == y.base_; | |
36 | } | |
11fdf7f2 | 37 | |
7c673cae FG |
38 | lookback_iterator& operator++() |
39 | { | |
40 | ++base_; | |
41 | return *this; | |
42 | } | |
11fdf7f2 | 43 | |
7c673cae FG |
44 | typename boost::iterator_reference<Iterator>::type operator*() const |
45 | { | |
46 | return *base_; | |
47 | } | |
11fdf7f2 TL |
48 | |
49 | Iterator base() const { return base_; } | |
7c673cae FG |
50 | |
51 | typedef boost::iterator_range<std::reverse_iterator<Iterator> > | |
52 | lookback_range; | |
53 | ||
54 | lookback_range lookback() const | |
55 | { | |
56 | return lookback_range(base_, original_); | |
57 | } | |
11fdf7f2 TL |
58 | |
59 | private: | |
7c673cae FG |
60 | Iterator original_; |
61 | Iterator base_; | |
62 | }; | |
b32b8144 FG |
63 | |
64 | typedef lookback_iterator<string_iterator> parse_iterator; | |
7c673cae FG |
65 | } |
66 | ||
67 | #endif |