/Src/Dependencies/Boost/boost/spirit/home/karma/detail/indirect_iterator.hpp
http://hadesmem.googlecode.com/ · C++ Header · 96 lines · 71 code · 16 blank · 9 comment · 1 complexity · c5432bf420c11e17248e3a822fa496e4 MD5 · raw file
- // 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 <boost/spirit/home/support/unused.hpp>
- #include <boost/iterator/iterator_facade.hpp>
- ///////////////////////////////////////////////////////////////////////////////
- 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 <typename Iterator>
- class indirect_iterator
- : public boost::iterator_facade<
- indirect_iterator<Iterator>
- , typename boost::detail::iterator_traits<Iterator>::value_type
- , boost::forward_traversal_tag
- , typename boost::detail::iterator_traits<Iterator>::value_type const&>
- {
- typedef typename boost::detail::iterator_traits<Iterator>::value_type
- base_value_type;
- typedef boost::iterator_facade<
- indirect_iterator<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 <typename Iterator>
- struct make_indirect_iterator
- {
- typedef karma::detail::indirect_iterator<Iterator> type;
- };
- template <typename Iterator>
- struct make_indirect_iterator<karma::detail::indirect_iterator<Iterator> >
- {
- typedef karma::detail::indirect_iterator<Iterator> type;
- };
- template <>
- struct make_indirect_iterator<unused_type const*>
- {
- typedef unused_type const* type;
- };
- template <typename Iterator>
- struct make_indirect_iterator<Iterator const&>
- : make_indirect_iterator<Iterator const>
- {};
- }}}
- #endif