summaryrefslogtreecommitdiffstats
path: root/src/boost/tools/quickbook/src/iterator.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/tools/quickbook/src/iterator.hpp')
-rw-r--r--src/boost/tools/quickbook/src/iterator.hpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/boost/tools/quickbook/src/iterator.hpp b/src/boost/tools/quickbook/src/iterator.hpp
new file mode 100644
index 00000000..9cdeeb7d
--- /dev/null
+++ b/src/boost/tools/quickbook/src/iterator.hpp
@@ -0,0 +1,67 @@
+/*=============================================================================
+ 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 <iterator>
+#include <boost/iterator/iterator_traits.hpp>
+#include <boost/operators.hpp>
+#include <boost/range/iterator_range.hpp>
+#include "string_view.hpp"
+
+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 i) : original_(i), base_(i) {}
+
+ 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_;
+ };
+
+ typedef lookback_iterator<string_iterator> parse_iterator;
+}
+
+#endif