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 #if !defined(SPIRIT_KARMA_INDIRECT_ITERATOR_JAN_19_2011_0814PM)
7 #define SPIRIT_KARMA_INDIRECT_ITERATOR_JAN_19_2011_0814PM
13 #include <boost/spirit/home/support/unused.hpp>
14 #include <boost/iterator/iterator_facade.hpp>
16 ///////////////////////////////////////////////////////////////////////////////
17 namespace boost { namespace spirit { namespace karma { namespace detail
19 ///////////////////////////////////////////////////////////////////////
20 // This is a wrapper for any iterator allowing to pass a reference of it
21 // to the components of the sequence
22 template <typename Iterator>
23 class indirect_iterator
24 : public boost::iterator_facade<
25 indirect_iterator<Iterator>
26 , typename boost::detail::iterator_traits<Iterator>::value_type
27 , boost::forward_traversal_tag
28 , typename boost::detail::iterator_traits<Iterator>::reference>
30 typedef typename boost::detail::iterator_traits<Iterator>::value_type
32 typedef typename boost::detail::iterator_traits<Iterator>::reference
35 typedef boost::iterator_facade<
36 indirect_iterator<Iterator>, base_value_type
37 , boost::forward_traversal_tag, base_reference_type
41 indirect_iterator(Iterator& iter)
44 indirect_iterator(indirect_iterator const& iter)
49 friend class boost::iterator_core_access;
56 bool equal(indirect_iterator const& other) const
58 return *iter_ == *other.iter_;
61 base_reference_type dereference() const
71 ///////////////////////////////////////////////////////////////////////////////
72 namespace boost { namespace spirit { namespace traits
74 template <typename Iterator>
75 struct make_indirect_iterator
77 typedef karma::detail::indirect_iterator<Iterator> type;
80 template <typename Iterator>
81 struct make_indirect_iterator<karma::detail::indirect_iterator<Iterator> >
83 typedef karma::detail::indirect_iterator<Iterator> type;
87 struct make_indirect_iterator<unused_type const*>
89 typedef unused_type const* type;
92 template <typename Iterator>
93 struct make_indirect_iterator<Iterator const&>
94 : make_indirect_iterator<Iterator const>