default.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 435 行 · 第 1/2 页

HPP
435
字号
            };            // Handle post-decrement specially.            template<typename Expr, typename Context>            struct default_eval<Expr, Context, proto::tag::post_dec, 1>            {            private:                typedef typename proto::result_of::child_c<Expr, 0>::type e0;                typedef typename proto::result_of::eval<UNREF(e0), Context>::type r0;            public:                BOOST_PROTO_DECLTYPE_(proto::detail::make_mutable<r0>() --, result_type)                result_type operator ()(Expr &expr, Context &ctx) const                {                    return proto::eval(proto::child_c<0>(expr), ctx) --;                }            };            // Handle subscript specially.            template<typename Expr, typename Context>            struct default_eval<Expr, Context, proto::tag::subscript, 2>            {            private:                typedef typename proto::result_of::child_c<Expr, 0>::type e0;                typedef typename proto::result_of::child_c<Expr, 1>::type e1;                typedef typename proto::result_of::eval<UNREF(e0), Context>::type r0;                typedef typename proto::result_of::eval<UNREF(e1), Context>::type r1;            public:                BOOST_PROTO_DECLTYPE_(proto::detail::make_subscriptable<r0>()[proto::detail::make<r1>()], result_type)                result_type operator ()(Expr &expr, Context &ctx) const                {                    return proto::eval(proto::child_c<0>(expr), ctx)[proto::eval(proto::child_c<1>(expr), ctx)];                }            };            // Handle if_else_ specially.            template<typename Expr, typename Context>            struct default_eval<Expr, Context, proto::tag::if_else_, 3>            {            private:                typedef typename proto::result_of::child_c<Expr, 0>::type e0;                typedef typename proto::result_of::child_c<Expr, 1>::type e1;                typedef typename proto::result_of::child_c<Expr, 2>::type e2;                typedef typename proto::result_of::eval<UNREF(e0), Context>::type r0;                typedef typename proto::result_of::eval<UNREF(e1), Context>::type r1;                typedef typename proto::result_of::eval<UNREF(e2), Context>::type r2;            public:                BOOST_PROTO_DECLTYPE_(                    proto::detail::make<r0>()                  ? proto::detail::make<r1>()                  : proto::detail::make<r2>()                  , result_type                )                result_type operator ()(Expr &expr, Context &ctx) const                {                    return proto::eval(proto::child_c<0>(expr), ctx)                         ? proto::eval(proto::child_c<1>(expr), ctx)                         : proto::eval(proto::child_c<2>(expr), ctx);                }            };            // Handle comma specially.            template<typename Expr, typename Context>            struct default_eval<Expr, Context, proto::tag::comma, 2>            {            private:                typedef typename proto::result_of::child_c<Expr, 0>::type e0;                typedef typename proto::result_of::child_c<Expr, 1>::type e1;                typedef typename proto::result_of::eval<UNREF(e0), Context>::type r0;                typedef typename proto::result_of::eval<UNREF(e1), Context>::type r1;            public:                typedef typename proto::detail::comma_result<r0, r1>::type result_type;                result_type operator ()(Expr &expr, Context &ctx) const                {                    return proto::eval(proto::child_c<0>(expr), ctx), proto::eval(proto::child_c<1>(expr), ctx);                }            };            // Handle function specially            #define EVAL_TYPE(Z, N, DATA)                                                           \                typename proto::result_of::eval<                                                    \                    typename remove_reference<                                                      \                        typename proto::result_of::child_c<DATA, N>::type                           \                    >::type                                                                         \                  , Context                                                                         \                >::type                                                                             \                /**/            #define EVAL(Z, N, DATA)                                                                \                proto::eval(proto::child_c<N>(DATA), context)                                       \                /**/            template<typename Expr, typename Context>            struct default_eval<Expr, Context, proto::tag::function, 1>            {                typedef                    typename proto::detail::result_of_fixup<EVAL_TYPE(~, 0, Expr)>::type                function_type;                typedef                    typename boost::result_of<function_type()>::type                result_type;                result_type operator ()(Expr &expr, Context &context) const                {                    return EVAL(~, 0, expr)();                }            };            template<typename Expr, typename Context>            struct default_eval<Expr, Context, proto::tag::function, 2>            {                typedef                    typename proto::detail::result_of_fixup<EVAL_TYPE(~, 0, Expr)>::type                function_type;                typedef                    typename detail::result_of_<function_type(EVAL_TYPE(~, 1, Expr))>::type                result_type;                result_type operator ()(Expr &expr, Context &context) const                {                    return this->invoke(                        expr                      , context                      , is_member_function_pointer<function_type>()                      , is_member_object_pointer<function_type>()                    );                }            private:                result_type invoke(Expr &expr, Context &context, mpl::false_, mpl::false_) const                {                    return EVAL(~, 0, expr)(EVAL(~, 1, expr));                }                result_type invoke(Expr &expr, Context &context, mpl::true_, mpl::false_) const                {                    using namespace detail::get_pointer_;                    return (get_pointer(EVAL(~, 1, expr)) ->* EVAL(~, 0, expr))();                }                result_type invoke(Expr &expr, Context &context, mpl::false_, mpl::true_) const                {                    using namespace detail::get_pointer_;                    return (get_pointer(EVAL(~, 1, expr)) ->* EVAL(~, 0, expr));                }            };            #define BOOST_PP_ITERATION_PARAMS_1 (3, (3, BOOST_PROTO_MAX_ARITY, <boost/proto/context/default.hpp>))            #include BOOST_PP_ITERATE()            #undef EVAL_TYPE            #undef EVAL            /// default_context            ///            struct default_context            {                /// default_context::eval                ///                template<typename Expr, typename ThisContext = default_context const>                struct eval                  : default_eval<Expr, ThisContext>                {};            };        } // namespace context    }} // namespace boost::proto    #undef UNREF    #endif#else    #define N BOOST_PP_ITERATION()        template<typename Expr, typename Context>        struct default_eval<Expr, Context, proto::tag::function, N>        {            typedef                typename proto::detail::result_of_fixup<EVAL_TYPE(~, 0, Expr)>::type            function_type;            typedef                typename boost::result_of<                    function_type(BOOST_PP_ENUM_SHIFTED(N, EVAL_TYPE, Expr))                >::type            result_type;            result_type operator ()(Expr &expr, Context &context) const            {                return this->invoke(expr, context, is_member_function_pointer<function_type>());            }        private:            result_type invoke(Expr &expr, Context &context, mpl::false_) const            {                return EVAL(~, 0, expr)(BOOST_PP_ENUM_SHIFTED(N, EVAL, expr));            }            result_type invoke(Expr &expr, Context &context, mpl::true_) const            {                #define M0(Z, M, expr) BOOST_PP_COMMA_IF(BOOST_PP_SUB(M, 2)) EVAL(Z, M, expr)                using namespace detail::get_pointer_;                return (get_pointer(EVAL(~, 1, expr)) ->* EVAL(~, 0, expr))(                    BOOST_PP_REPEAT_FROM_TO(2, N, M0, expr)                );                #undef M0            }        };    #undef N#endif

⌨️ 快捷键说明

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