1 /*=============================================================================
2 Copyright (c) 2010 Daniel James
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 =============================================================================*/
9 #if !defined(BOOST_SPIRIT_QUICKBOOK_ITERATOR_HPP)
10 #define BOOST_SPIRIT_QUICKBOOK_ITERATOR_HPP
12 #include <boost/operators.hpp>
13 #include <boost/iterator/iterator_traits.hpp>
14 #include <boost/range/iterator_range.hpp>
16 #include "string_view.hpp"
20 template <typename Iterator>
21 struct lookback_iterator
22 : boost::forward_iterator_helper<
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
30 lookback_iterator() {}
31 explicit lookback_iterator(Iterator i)
32 : original_(i), base_(i) {}
34 friend bool operator==(
35 lookback_iterator const& x,
36 lookback_iterator const& y)
38 return x.base_ == y.base_;
41 lookback_iterator& operator++()
47 typename boost::iterator_reference<Iterator>::type operator*() const
52 Iterator base() const {
56 typedef boost::iterator_range<std::reverse_iterator<Iterator> >
59 lookback_range lookback() const
61 return lookback_range(base_, original_);
69 typedef lookback_iterator<string_iterator> parse_iterator;