fold.ipp

来自「CGAL is a collaborative effort of severa」· IPP 代码 · 共 88 行

IPP
88
字号
/*=============================================================================    Copyright (c) 2003 Joel de Guzman    Use, modification and distribution is subject to 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(FUSION_ALGORITHM_DETAIL_FOLD_IPP)#define FUSION_ALGORITHM_DETAIL_FOLD_IPP#include <boost/mpl/bool.hpp>#include <boost/type_traits/is_same.hpp>#include <boost/spirit/fusion/sequence/begin.hpp>#include <boost/spirit/fusion/sequence/end.hpp>#include <boost/spirit/fusion/iterator/value_of.hpp>#include <boost/spirit/fusion/iterator/next.hpp>namespace boost { namespace fusion { namespace detail{    template <typename Iterator, typename State, typename F>    struct fold_apply    {        typedef typename F::template apply<            typename meta::value_of<Iterator>::type, State        >::type type;    };    template <typename First, typename Last, typename State, typename F>    struct static_fold;    template <typename First, typename Last, typename State, typename F>    struct next_result_of_fold    {        typedef typename            static_fold<                typename meta::next<First>::type              , Last              , typename fold_apply<First, State, F>::type              , F            >::type        type;    };    template <typename First, typename Last, typename State, typename F>    struct static_fold    {        typedef typename            mpl::if_<                is_same<First, Last>              , mpl::identity<State>              , next_result_of_fold<First, Last, State, F>            >::type        result;        typedef typename result::type type;    };    // terminal case    template <typename First, typename Last, typename State, typename F>    inline State const&    fold(First const&, Last const&, State const& state, F const&, mpl::true_)    {        return state;    }    // non-terminal case    template <typename First, typename Last, typename State, typename F>    inline typename static_fold<First, Last, State, F>::type    fold(        First const& first      , Last const& last      , State const& state      , F const& f      , mpl::false_)    {        return detail::fold(            fusion::next(first)          , last          , f(*first, state)          , f          , is_same<typename meta::next<First>::type, Last>()        );    }}}}#endif

⌨️ 快捷键说明

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