// Copyright (c) 2001-2011 Hartmut Kaiser // // Distributed under 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(SPIRIT_KARMA_INDIRECT_ITERATOR_JAN_19_2011_0814PM) #define SPIRIT_KARMA_INDIRECT_ITERATOR_JAN_19_2011_0814PM #if defined(_MSC_VER) #pragma once #endif #include #include /////////////////////////////////////////////////////////////////////////////// namespace boost { namespace spirit { namespace karma { namespace detail { /////////////////////////////////////////////////////////////////////// // This is a wrapper for any iterator allowing to pass a reference of it // to the components of the sequence template class indirect_iterator : public boost::iterator_facade< indirect_iterator , typename boost::detail::iterator_traits::value_type , boost::forward_traversal_tag , typename boost::detail::iterator_traits::value_type const&> { typedef typename boost::detail::iterator_traits::value_type base_value_type; typedef boost::iterator_facade< indirect_iterator, base_value_type , boost::forward_traversal_tag, base_value_type const& > base_type; public: indirect_iterator(Iterator& iter) : iter_(&iter) {} indirect_iterator(indirect_iterator const& iter) : iter_(iter.iter_) {} private: friend class boost::iterator_core_access; void increment() { ++*iter_; } bool equal(indirect_iterator const& other) const { return *iter_ == *other.iter_; } typename base_type::reference dereference() const { return **iter_; } private: Iterator* iter_; }; }}}} /////////////////////////////////////////////////////////////////////////////// namespace boost { namespace spirit { namespace traits { template struct make_indirect_iterator { typedef karma::detail::indirect_iterator type; }; template struct make_indirect_iterator > { typedef karma::detail::indirect_iterator type; }; template <> struct make_indirect_iterator { typedef unused_type const* type; }; template struct make_indirect_iterator : make_indirect_iterator {}; }}} #endif