1 // Copyright (c) 2001-2011 Hartmut Kaiser
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 #ifndef BOOST_SPIRIT_KARMA_DETAIL_INDIRECT_ITERATOR_HPP
7 #define BOOST_SPIRIT_KARMA_DETAIL_INDIRECT_ITERATOR_HPP
13 #include <boost/spirit/home/support/unused.hpp>
14 #include <boost/iterator/iterator_facade.hpp>
15 #include <iterator> // for std::iterator_traits
17 ///////////////////////////////////////////////////////////////////////////////
18 namespace boost { namespace spirit { namespace karma { namespace detail
20 ///////////////////////////////////////////////////////////////////////
21 // This is a wrapper for any iterator allowing to pass a reference of it
22 // to the components of the sequence
23 template <typename Iterator>
24 class indirect_iterator
25 : public boost::iterator_facade<
26 indirect_iterator<Iterator>
27 , typename std::iterator_traits<Iterator>::value_type
28 , boost::forward_traversal_tag
29 , typename std::iterator_traits<Iterator>::reference>
31 typedef typename std::iterator_traits<Iterator>::value_type
33 typedef typename std::iterator_traits<Iterator>::reference
36 typedef boost::iterator_facade<
37 indirect_iterator<Iterator>, base_value_type
38 , boost::forward_traversal_tag, base_reference_type
42 indirect_iterator(Iterator& iter)
45 indirect_iterator(indirect_iterator const& iter)
50 friend class boost::iterator_core_access;
57 bool equal(indirect_iterator const& other) const
59 return *iter_ == *other.iter_;
62 base_reference_type dereference() const
72 ///////////////////////////////////////////////////////////////////////////////
73 namespace boost { namespace spirit { namespace traits
75 template <typename Iterator>
76 struct make_indirect_iterator
78 typedef karma::detail::indirect_iterator<Iterator> type;
81 template <typename Iterator>
82 struct make_indirect_iterator<karma::detail::indirect_iterator<Iterator> >
84 typedef karma::detail::indirect_iterator<Iterator> type;
88 struct make_indirect_iterator<unused_type const*>
90 typedef unused_type const* type;
93 template <typename Iterator>
94 struct make_indirect_iterator<Iterator const&>
95 : make_indirect_iterator<Iterator const>