summaryrefslogtreecommitdiff
path: root/tools/quickbook/src/iterator.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/quickbook/src/iterator.hpp')
-rw-r--r--tools/quickbook/src/iterator.hpp69
1 files changed, 69 insertions, 0 deletions
diff --git a/tools/quickbook/src/iterator.hpp b/tools/quickbook/src/iterator.hpp
new file mode 100644
index 0000000000..5897664d2d
--- /dev/null
+++ b/tools/quickbook/src/iterator.hpp
@@ -0,0 +1,69 @@
+/*=============================================================================
+ 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