reverse.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 190 行

HPP
190
字号
/*=============================================================================    Copyright (c) 2001-2006 Joel de Guzman    Copyright (c) 2008 Eric Niebler    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)==============================================================================*/#ifndef BOOST_PROTO_DETAIL_FUSION_REVERSE_EAH_01_22_2008#define BOOST_PROTO_DETAIL_FUSION_REVERSE_EAH_01_22_2008#include <boost/spirit/fusion/detail/access.hpp>#include <boost/spirit/fusion/iterator/as_fusion_iterator.hpp>#include <boost/spirit/fusion/iterator/detail/iterator_base.hpp>#include <boost/spirit/fusion/sequence/detail/sequence_base.hpp>#include <boost/spirit/fusion/iterator/next.hpp>#include <boost/spirit/fusion/iterator/prior.hpp>#include <boost/spirit/fusion/iterator/deref.hpp>#include <boost/spirit/fusion/iterator/value_of.hpp>#include <boost/spirit/fusion/sequence/begin.hpp>#include <boost/spirit/fusion/sequence/end.hpp>namespace boost { namespace fusion{    struct reverse_view_tag;    struct reverse_view_iterator_tag;    template <typename First>    struct reverse_view_iterator        : iterator_base<reverse_view_iterator<First> >    {        typedef as_fusion_iterator<First> converter;        typedef typename converter::type first_type;        typedef reverse_view_iterator_tag tag;        reverse_view_iterator(First const& first)            : first(converter::convert(first)) {}        first_type first;    };    template <typename Sequence>    struct reverse_view : sequence_base<reverse_view<Sequence> >    {        typedef as_fusion_sequence<Sequence> seq_converter;        typedef typename seq_converter::type seq;        typedef reverse_view_tag tag;        typedef typename meta::begin<seq>::type first_type;        typedef typename meta::end<seq>::type last_type;        reverse_view(Sequence& seq)            : first(fusion::begin(seq))            , last(fusion::end(seq))        {}        first_type first;        last_type last;    };    namespace meta    {        template <>        struct deref_impl<reverse_view_iterator_tag>        {            template <typename Iterator>            struct apply            {                typedef typename                    meta::deref<                        typename meta::prior<                            typename Iterator::first_type                        >::type                    >::type                type;                static type                call(Iterator const& i)                {                    return *fusion::prior(i.first);                }            };        };        template <>        struct prior_impl<reverse_view_iterator_tag>        {            template <typename Iterator>            struct apply            {                typedef typename Iterator::first_type first_type;                typedef typename next_impl<typename first_type::tag>::                    template apply<first_type>                wrapped;                typedef reverse_view_iterator<typename wrapped::type> type;                static type                call(Iterator const& i)                {                    return type(wrapped::call(i.first));                }            };        };        template <>        struct next_impl<reverse_view_iterator_tag>        {            template <typename Iterator>            struct apply            {                typedef typename Iterator::first_type first_type;                typedef typename prior_impl<typename first_type::tag>::                    template apply<first_type>                wrapped;                typedef reverse_view_iterator<typename wrapped::type> type;                static type                call(Iterator const& i)                {                    return type(wrapped::call(i.first));                }            };        };        template <>        struct value_impl<reverse_view_iterator_tag>        {            template <typename Iterator>            struct apply            {                typedef typename                    meta::value_of<                        typename meta::prior<                            typename Iterator::first_type                        >::type                    >::type                type;            };        };        template <>        struct begin_impl<reverse_view_tag>        {            template <typename Sequence>            struct apply            {                typedef reverse_view_iterator<typename Sequence::last_type> type;                static type                call(Sequence const& s)                {                    return type(s.last);                }            };        };        template <>        struct end_impl<reverse_view_tag>        {            template <typename Sequence>            struct apply            {                typedef reverse_view_iterator<typename Sequence::first_type> type;                static type                call(Sequence const& s)                {                    return type(s.first);                }            };        };        template <typename Sequence>        struct reverse        {            typedef reverse_view<Sequence> type;        };    }    template <typename Sequence>    inline reverse_view<Sequence const>    reverse(Sequence const& view)    {        return reverse_view<Sequence const>(view);    }}}#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?