![]() System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, Directory : /usr/include/boost/spirit/home/karma/detail/ |
Upload 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> #include <iterator> // for std::iterator_traits /////////////////////////////////////////////////////////////////////////////// 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 std::iterator_traits<Iterator>::value_type , boost::forward_traversal_tag , typename std::iterator_traits<Iterator>::reference> { typedef typename std::iterator_traits<Iterator>::value_type base_value_type; typedef typename std::iterator_traits<Iterator>::reference base_reference_type; typedef boost::iterator_facade< indirect_iterator<Iterator>, base_value_type , boost::forward_traversal_tag, base_reference_type > 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_; } base_reference_type 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