blob: 5897664d2d2806b91b54c4de115b6ad0d9fbd1d7 [file] [log] [blame]
/*=============================================================================
Copyright (c) 2010 Daniel James
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
#if !defined(BOOST_SPIRIT_QUICKBOOK_ITERATOR_HPP)
#define BOOST_SPIRIT_QUICKBOOK_ITERATOR_HPP
#include <boost/operators.hpp>
#include <boost/iterator/iterator_traits.hpp>
#include <boost/range/iterator_range.hpp>
#include <iterator>
namespace quickbook
{
template <typename Iterator>
struct lookback_iterator
: boost::forward_iterator_helper<
lookback_iterator<Iterator>,
typename boost::iterator_value<Iterator>::type,
typename boost::iterator_difference<Iterator>::type,
typename boost::iterator_pointer<Iterator>::type,
typename boost::iterator_reference<Iterator>::type
>
{
lookback_iterator() {}
explicit lookback_iterator(Iterator base)
: original_(base), base_(base) {}
friend bool operator==(
lookback_iterator const& x,
lookback_iterator const& y)
{
return x.base_ == y.base_;
}
lookback_iterator& operator++()
{
++base_;
return *this;
}
typename boost::iterator_reference<Iterator>::type operator*() const
{
return *base_;
}
Iterator base() const {
return base_;
}
typedef boost::iterator_range<std::reverse_iterator<Iterator> >
lookback_range;
lookback_range lookback() const
{
return lookback_range(base_, original_);
}
private:
Iterator original_;
Iterator base_;
};
}
#endif