⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reverse_fold_impl_body.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
字号:
// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION!#if !defined(BOOST_PP_IS_ITERATING)// Copyright Aleksey Gurtovoy 2000-2004//// 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)//// See http://www.boost.org/libs/mpl for documentation.// $Id: reverse_fold_impl_body.hpp 49267 2008-10-11 06:19:02Z agurtovoy $// $Date: 2008-10-11 02:19:02 -0400 (Sat, 11 Oct 2008) $// $Revision: 49267 $#   include <boost/mpl/limits/unrolling.hpp>#   include <boost/mpl/aux_/preprocessor/repeat.hpp>#   include <boost/mpl/aux_/config/ctps.hpp>#   include <boost/mpl/aux_/nttp_decl.hpp>#   include <boost/preprocessor/arithmetic/sub.hpp>#   include <boost/preprocessor/iterate.hpp>#   include <boost/preprocessor/dec.hpp>#   include <boost/preprocessor/inc.hpp>#   include <boost/preprocessor/cat.hpp>// local macros, #undef-ined at the end of the header#   define AUX778076_ITER_FOLD_FORWARD_STEP(unused, n_, unused2) \    typedef typename apply2< \          ForwardOp \        , BOOST_PP_CAT(fwd_state,n_) \        , AUX778076_FOLD_IMPL_OP(BOOST_PP_CAT(iter,n_)) \        >::type BOOST_PP_CAT(fwd_state,BOOST_PP_INC(n_)); \    typedef typename mpl::next<BOOST_PP_CAT(iter,n_)>::type \        BOOST_PP_CAT(iter,BOOST_PP_INC(n_)); \    /**/#   define AUX778076_ITER_FOLD_BACKWARD_STEP_FUNC(n_) \    typedef typename apply2< \          BackwardOp \        , BOOST_PP_CAT(bkwd_state,n_) \        , AUX778076_FOLD_IMPL_OP(BOOST_PP_CAT(iter,BOOST_PP_DEC(n_))) \        >::type BOOST_PP_CAT(bkwd_state,BOOST_PP_DEC(n_)); \    /**/#   define AUX778076_ITER_FOLD_BACKWARD_STEP(unused, n_, j) \    AUX778076_ITER_FOLD_BACKWARD_STEP_FUNC( \          BOOST_PP_SUB_D(1,j,n_) \        ) \    /**/#   define AUX778076_FIRST_BACKWARD_STATE_TYPEDEF(n_) \    typedef typename nested_chunk::state BOOST_PP_CAT(bkwd_state,n_);    /**/#   define AUX778076_FOLD_IMPL_NAME \    BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_impl) \    /**/#   define AUX778076_FOLD_CHUNK_NAME \    BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_chunk) \    /**/namespace boost { namespace mpl { namespace aux {/// forward declarationtemplate<      BOOST_MPL_AUX_NTTP_DECL(long, N)    , typename First    , typename Last    , typename State    , typename BackwardOp    , typename ForwardOp    > struct AUX778076_FOLD_IMPL_NAME;#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \    && !defined(BOOST_MPL_CFG_NO_NONTYPE_TEMPLATE_PARTIAL_SPEC)#   define BOOST_PP_ITERATION_PARAMS_1 \    (3,(0, BOOST_MPL_LIMIT_UNROLLING, <boost/mpl/aux_/reverse_fold_impl_body.hpp>))#   include BOOST_PP_ITERATE()// implementation for N that exceeds BOOST_MPL_LIMIT_UNROLLINGtemplate<      BOOST_MPL_AUX_NTTP_DECL(long, N)    , typename First    , typename Last    , typename State    , typename BackwardOp    , typename ForwardOp    > struct AUX778076_FOLD_IMPL_NAME{    typedef First iter0;    typedef State fwd_state0;    BOOST_MPL_PP_REPEAT(          BOOST_MPL_LIMIT_UNROLLING        , AUX778076_ITER_FOLD_FORWARD_STEP        , unused        )    typedef AUX778076_FOLD_IMPL_NAME<          ( (N - BOOST_MPL_LIMIT_UNROLLING) < 0 ? 0 : N - BOOST_MPL_LIMIT_UNROLLING )        , BOOST_PP_CAT(iter,BOOST_MPL_LIMIT_UNROLLING)        , Last        , BOOST_PP_CAT(fwd_state,BOOST_MPL_LIMIT_UNROLLING)        , BackwardOp        , ForwardOp        > nested_chunk;            AUX778076_FIRST_BACKWARD_STATE_TYPEDEF(BOOST_MPL_LIMIT_UNROLLING)    BOOST_MPL_PP_REPEAT(          BOOST_MPL_LIMIT_UNROLLING        , AUX778076_ITER_FOLD_BACKWARD_STEP        , BOOST_MPL_LIMIT_UNROLLING        )    typedef bkwd_state0 state;    typedef typename nested_chunk::iterator iterator;};// fallback implementation for sequences of unknown sizetemplate<      typename First    , typename Last    , typename State    , typename BackwardOp    , typename ForwardOp    > struct AUX778076_FOLD_IMPL_NAME<-1,First,Last,State,BackwardOp,ForwardOp>{    typedef AUX778076_FOLD_IMPL_NAME<          -1        , typename mpl::next<First>::type        , Last        , typename apply2<ForwardOp,State,AUX778076_FOLD_IMPL_OP(First)>::type        , BackwardOp        , ForwardOp        > nested_step;    typedef typename apply2<          BackwardOp        , typename nested_step::state        , AUX778076_FOLD_IMPL_OP(First)        >::type state;    typedef typename nested_step::iterator iterator;};template<      typename Last    , typename State    , typename BackwardOp    , typename ForwardOp    > struct AUX778076_FOLD_IMPL_NAME<-1,Last,Last,State,BackwardOp,ForwardOp>{    typedef State state;    typedef Last iterator;};#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATIONtemplate< BOOST_MPL_AUX_NTTP_DECL(long, N) >struct AUX778076_FOLD_CHUNK_NAME;#   define BOOST_PP_ITERATION_PARAMS_1 \    (3,(0, BOOST_MPL_LIMIT_UNROLLING, <boost/mpl/aux_/reverse_fold_impl_body.hpp>))#   include BOOST_PP_ITERATE()// implementation for N that exceeds BOOST_MPL_LIMIT_UNROLLINGtemplate< BOOST_MPL_AUX_NTTP_DECL(long, N) > struct AUX778076_FOLD_CHUNK_NAME{    template<          typename First        , typename Last        , typename State        , typename BackwardOp        , typename ForwardOp        >     struct result_    {        typedef First iter0;        typedef State fwd_state0;        BOOST_MPL_PP_REPEAT(              BOOST_MPL_LIMIT_UNROLLING            , AUX778076_ITER_FOLD_FORWARD_STEP            , unused            )        typedef AUX778076_FOLD_IMPL_NAME<              ( (N - BOOST_MPL_LIMIT_UNROLLING) < 0 ? 0 : N - BOOST_MPL_LIMIT_UNROLLING )            , BOOST_PP_CAT(iter,BOOST_MPL_LIMIT_UNROLLING)            , Last            , BOOST_PP_CAT(fwd_state,BOOST_MPL_LIMIT_UNROLLING)            , BackwardOp            , ForwardOp            > nested_chunk;                    AUX778076_FIRST_BACKWARD_STATE_TYPEDEF(BOOST_MPL_LIMIT_UNROLLING)        BOOST_MPL_PP_REPEAT(              BOOST_MPL_LIMIT_UNROLLING            , AUX778076_ITER_FOLD_BACKWARD_STEP            , BOOST_MPL_LIMIT_UNROLLING            )        typedef bkwd_state0 state;        typedef typename nested_chunk::iterator iterator;    };};// fallback implementation for sequences of unknown sizetemplate<      typename First    , typename Last    , typename State    , typename BackwardOp    , typename ForwardOp    > struct BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_step);template<      typename Last    , typename State    >struct BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_null_step){    typedef Last iterator;    typedef State state;};template<> struct AUX778076_FOLD_CHUNK_NAME<-1>{    template<          typename First        , typename Last        , typename State        , typename BackwardOp        , typename ForwardOp        >     struct result_    {        typedef typename if_<              typename is_same<First,Last>::type            , BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_null_step)<Last,State>            , BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_step)<First,Last,State,BackwardOp,ForwardOp>            >::type res_;        typedef typename res_::state state;        typedef typename res_::iterator iterator;    };#if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)    /// ETI workaround    template<> struct result_<int,int,int,int,int>    {        typedef int state;        typedef int iterator;    };#endif};template<      typename First    , typename Last    , typename State    , typename BackwardOp    , typename ForwardOp    > struct BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_step){    typedef AUX778076_FOLD_CHUNK_NAME<-1>::template result_<          typename mpl::next<First>::type        , Last        , typename apply2<ForwardOp,State,AUX778076_FOLD_IMPL_OP(First)>::type        , BackwardOp        , ForwardOp        > nested_step;    typedef typename apply2<          BackwardOp        , typename nested_step::state        , AUX778076_FOLD_IMPL_OP(First)        >::type state;    typedef typename nested_step::iterator iterator;};template<      BOOST_MPL_AUX_NTTP_DECL(long, N)    , typename First    , typename Last    , typename State    , typename BackwardOp    , typename ForwardOp    > struct AUX778076_FOLD_IMPL_NAME    : AUX778076_FOLD_CHUNK_NAME<N>        ::template result_<First,Last,State,BackwardOp,ForwardOp>{};#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION}}}#   undef AUX778076_FIRST_BACKWARD_STATE_TYPEDEF#   undef AUX778076_ITER_FOLD_BACKWARD_STEP#   undef AUX778076_ITER_FOLD_BACKWARD_STEP_FUNC#   undef AUX778076_ITER_FOLD_FORWARD_STEP#undef AUX778076_FOLD_IMPL_OP#undef AUX778076_FOLD_IMPL_NAME_PREFIX///// iteration#else#   define n_ BOOST_PP_FRAME_ITERATION(1)#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \    && !defined(BOOST_MPL_CFG_NO_NONTYPE_TEMPLATE_PARTIAL_SPEC)template<      typename First    , typename Last    , typename State    , typename BackwardOp    , typename ForwardOp    >struct AUX778076_FOLD_IMPL_NAME<n_,First,Last,State,BackwardOp,ForwardOp>{    typedef First iter0;    typedef State fwd_state0;    BOOST_MPL_PP_REPEAT(          n_        , AUX778076_ITER_FOLD_FORWARD_STEP        , unused        )    typedef BOOST_PP_CAT(fwd_state,n_) BOOST_PP_CAT(bkwd_state,n_);    BOOST_MPL_PP_REPEAT(          n_        , AUX778076_ITER_FOLD_BACKWARD_STEP        , n_        )    typedef bkwd_state0 state;    typedef BOOST_PP_CAT(iter,n_) iterator;};#elsetemplate<> struct AUX778076_FOLD_CHUNK_NAME<n_>{    template<          typename First        , typename Last        , typename State        , typename BackwardOp        , typename ForwardOp        >    struct result_    {        typedef First iter0;        typedef State fwd_state0;        BOOST_MPL_PP_REPEAT(              n_            , AUX778076_ITER_FOLD_FORWARD_STEP            , unused            )        typedef BOOST_PP_CAT(fwd_state,n_) BOOST_PP_CAT(bkwd_state,n_);        BOOST_MPL_PP_REPEAT(              n_            , AUX778076_ITER_FOLD_BACKWARD_STEP            , n_            )        typedef bkwd_state0 state;        typedef BOOST_PP_CAT(iter,n_) iterator;    };#if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)    /// ETI workaround    template<> struct result_<int,int,int,int,int>    {        typedef int state;        typedef int iterator;    };#endif};#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION#   undef n_#endif // BOOST_PP_IS_ITERATING

⌨️ 快捷键说明

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