make_expr.hpp
来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 1,099 行 · 第 1/4 页
HPP
1,099 行
#ifndef BOOST_PP_IS_ITERATING /////////////////////////////////////////////////////////////////////////////// /// \file make_expr.hpp /// Definition of the \c make_expr() and \c unpack_expr() utilities for /// building Proto expression nodes from children nodes or from a Fusion /// sequence of children nodes, respectively. // // Copyright 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_MAKE_EXPR_HPP_EAN_04_01_2005 #define BOOST_PROTO_MAKE_EXPR_HPP_EAN_04_01_2005 #include <boost/xpressive/proto/detail/prefix.hpp> #include <boost/version.hpp> #include <boost/preprocessor/cat.hpp> #include <boost/preprocessor/control/if.hpp> #include <boost/preprocessor/control/expr_if.hpp> #include <boost/preprocessor/arithmetic/inc.hpp> #include <boost/preprocessor/arithmetic/dec.hpp> #include <boost/preprocessor/arithmetic/sub.hpp> #include <boost/preprocessor/punctuation/comma_if.hpp> #include <boost/preprocessor/iteration/iterate.hpp> #include <boost/preprocessor/facilities/intercept.hpp> #include <boost/preprocessor/comparison/greater.hpp> #include <boost/preprocessor/tuple/elem.hpp> #include <boost/preprocessor/tuple/to_list.hpp> #include <boost/preprocessor/logical/and.hpp> #include <boost/preprocessor/repetition/enum.hpp> #include <boost/preprocessor/repetition/enum_trailing.hpp> #include <boost/preprocessor/repetition/enum_params.hpp> #include <boost/preprocessor/repetition/enum_trailing_params.hpp> #include <boost/preprocessor/repetition/enum_binary_params.hpp> #include <boost/preprocessor/repetition/enum_trailing_binary_params.hpp> #include <boost/preprocessor/repetition/enum_shifted_params.hpp> #include <boost/preprocessor/repetition/enum_shifted_binary_params.hpp> #include <boost/preprocessor/repetition/repeat.hpp> #include <boost/preprocessor/repetition/repeat_from_to.hpp> #include <boost/preprocessor/seq/size.hpp> #include <boost/preprocessor/seq/enum.hpp> #include <boost/preprocessor/seq/seq.hpp> #include <boost/preprocessor/seq/to_tuple.hpp> #include <boost/preprocessor/seq/for_each_i.hpp> #include <boost/preprocessor/seq/pop_back.hpp> #include <boost/preprocessor/seq/push_back.hpp> #include <boost/preprocessor/seq/push_front.hpp> #include <boost/preprocessor/list/for_each_i.hpp> #include <boost/ref.hpp> #include <boost/mpl/if.hpp> #include <boost/mpl/eval_if.hpp> #include <boost/mpl/apply_wrap.hpp> #include <boost/utility/enable_if.hpp> #include <boost/type_traits/is_same.hpp> #include <boost/type_traits/add_const.hpp> #include <boost/type_traits/add_reference.hpp> #include <boost/type_traits/remove_reference.hpp> #include <boost/xpressive/proto/proto_fwd.hpp> #include <boost/xpressive/proto/traits.hpp> #include <boost/xpressive/proto/domain.hpp> #include <boost/xpressive/proto/generate.hpp> #if BOOST_VERSION >= 103500 # include <boost/fusion/include/at.hpp> # include <boost/fusion/include/value_at.hpp> # include <boost/fusion/include/size.hpp> #else # include <boost/spirit/fusion/sequence/at.hpp> # include <boost/spirit/fusion/sequence/value_at.hpp> # include <boost/spirit/fusion/sequence/size.hpp> #endif #include <boost/xpressive/proto/detail/suffix.hpp> namespace boost { /// INTERNAL ONLY /// namespace fusion { /// INTERNAL ONLY /// template<typename Function> class unfused_generic; } } namespace boost { namespace proto { /// INTERNAL ONLY /// #define BOOST_PROTO_AS_ARG_TYPE(Z, N, DATA) \ typename boost::proto::detail::protoify_< \ BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(3, 0, DATA), N) \ , BOOST_PP_TUPLE_ELEM(3, 2, DATA) \ >::type \ /**/ /// INTERNAL ONLY /// #define BOOST_PROTO_AS_ARG(Z, N, DATA) \ boost::proto::detail::protoify_< \ BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(3, 0, DATA), N) \ , BOOST_PP_TUPLE_ELEM(3, 2, DATA) \ >::call(BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(3, 1, DATA), N)) \ /**/ /// INTERNAL ONLY /// # define BOOST_PROTO_AT_TYPE(Z, N, DATA) \ typename add_const< \ typename fusion::BOOST_PROTO_FUSION_RESULT_OF::value_at_c< \ BOOST_PP_TUPLE_ELEM(3, 0, DATA) \ , N \ >::type \ >::type \ /**/ /// INTERNAL ONLY /// # define BOOST_PROTO_AT(Z, N, DATA) \ fusion::BOOST_PROTO_FUSION_AT_C(N, BOOST_PP_TUPLE_ELEM(3, 1, DATA)) \ /**/ /// INTERNAL ONLY /// #define BOOST_PROTO_AS_ARG_AT_TYPE(Z, N, DATA) \ typename boost::proto::detail::protoify_< \ BOOST_PROTO_AT_TYPE(Z, N, DATA) \ , BOOST_PP_TUPLE_ELEM(3, 2, DATA) \ >::type \ /**/ /// INTERNAL ONLY /// #define BOOST_PROTO_AS_ARG_AT(Z, N, DATA) \ boost::proto::detail::protoify_< \ BOOST_PROTO_AT_TYPE(Z, N, DATA) \ , BOOST_PP_TUPLE_ELEM(3, 2, DATA) \ >::call(BOOST_PROTO_AT(Z, N, DATA)) \ /**/ /// INTERNAL ONLY /// #define BOOST_PROTO_VARARG_TEMPLATE_AUX_(R, DATA, I, ELEM) \ (ELEM BOOST_PP_CAT(BOOST_PP_CAT(X, DATA), BOOST_PP_CAT(_, I))) \ /**/ /// INTERNAL ONLY /// #define BOOST_PROTO_VARARG_TEMPLATE_YES_(R, DATA, I, ELEM) \ BOOST_PP_LIST_FOR_EACH_I_R( \ R \ , BOOST_PROTO_VARARG_TEMPLATE_AUX_ \ , I \ , BOOST_PP_TUPLE_TO_LIST( \ BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ELEM)) \ , BOOST_PP_SEQ_TO_TUPLE(BOOST_PP_SEQ_TAIL(ELEM)) \ ) \ ) \ /**/ /// INTERNAL ONLY /// #define BOOST_PROTO_VARARG_TEMPLATE_NO_(R, DATA, I, ELEM) \ /**/ /// INTERNAL ONLY /// #define BOOST_PROTO_VARARG_TEMPLATE_(R, DATA, I, ELEM) \ BOOST_PP_IF( \ BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ELEM)) \ , BOOST_PROTO_VARARG_TEMPLATE_YES_ \ , BOOST_PROTO_VARARG_TEMPLATE_NO_ \ )(R, DATA, I, ELEM) \ /**/ /// INTERNAL ONLY /// #define BOOST_PROTO_VARARG_TYPE_AUX_(R, DATA, I, ELEM) \ (BOOST_PP_CAT(BOOST_PP_CAT(X, DATA), BOOST_PP_CAT(_, I))) \ /**/ /// INTERNAL ONLY /// #define BOOST_PROTO_TEMPLATE_PARAMS_YES_(R, DATA, I, ELEM) \ < \ BOOST_PP_SEQ_ENUM( \ BOOST_PP_LIST_FOR_EACH_I_R( \ R \ , BOOST_PROTO_VARARG_TYPE_AUX_ \ , I \ , BOOST_PP_TUPLE_TO_LIST( \ BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ELEM)) \ , BOOST_PP_SEQ_TO_TUPLE(BOOST_PP_SEQ_TAIL(ELEM)) \ ) \ ) \ ) \ > \ /**/ /// INTERNAL ONLY /// #define BOOST_PROTO_TEMPLATE_PARAMS_NO_(R, DATA, I, ELEM) \ /**/ /// INTERNAL ONLY /// #define BOOST_PROTO_VARARG_TYPE_(R, DATA, I, ELEM) \ BOOST_PP_COMMA_IF(I) \ BOOST_PP_SEQ_HEAD(ELEM) \ BOOST_PP_IF( \ BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ELEM)) \ , BOOST_PROTO_TEMPLATE_PARAMS_YES_ \ , BOOST_PROTO_TEMPLATE_PARAMS_NO_ \ )(R, DATA, I, ELEM) BOOST_PP_EXPR_IF(BOOST_PP_GREATER(I, 1), const) \ /**/ /// INTERNAL ONLY /// #define BOOST_PROTO_VARARG_AS_EXPR_(R, DATA, I, ELEM) \ BOOST_PP_EXPR_IF( \ BOOST_PP_GREATER(I, 1) \ , (( \ BOOST_PP_SEQ_HEAD(ELEM) \ BOOST_PP_IF( \ BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ELEM)) \ , BOOST_PROTO_TEMPLATE_PARAMS_YES_ \ , BOOST_PROTO_TEMPLATE_PARAMS_NO_ \ )(R, DATA, I, ELEM)() \ )) \ ) \ /**/ /// INTERNAL ONLY /// #define BOOST_PROTO_VARARG_AS_ARG_(Z, N, DATA) \ (BOOST_PP_CAT(DATA, N)) \ /**/ /// INTERNAL ONLY /// #define BOOST_PROTO_SEQ_PUSH_FRONT(SEQ, ELEM) \ BOOST_PP_SEQ_POP_BACK(BOOST_PP_SEQ_PUSH_FRONT(BOOST_PP_SEQ_PUSH_BACK(SEQ, _dummy_), ELEM)) \ /**/ /// INTERNAL ONLY /// #define BOOST_PROTO_VARARG_AS_PARAM_(Z, N, DATA) \ (BOOST_PP_CAT(DATA, N)) \ /**/ /// INTERNAL ONLY /// #define BOOST_PROTO_VARARG_FUN_(Z, N, DATA) \ template< \ BOOST_PP_SEQ_ENUM( \ BOOST_PP_SEQ_FOR_EACH_I( \ BOOST_PROTO_VARARG_TEMPLATE_, ~ \ , BOOST_PP_SEQ_PUSH_FRONT( \ BOOST_PROTO_SEQ_PUSH_FRONT( \ BOOST_PP_TUPLE_ELEM(4, 2, DATA) \ , (BOOST_PP_TUPLE_ELEM(4, 3, DATA)) \ ) \ , BOOST_PP_TUPLE_ELEM(4, 1, DATA) \ ) \ ) \ BOOST_PP_REPEAT_ ## Z(N, BOOST_PROTO_VARARG_AS_PARAM_, typename A) \ ) \ > \ typename boost::proto::result_of::make_expr< \ BOOST_PP_SEQ_FOR_EACH_I( \ BOOST_PROTO_VARARG_TYPE_, ~ \ , BOOST_PP_SEQ_PUSH_FRONT( \ BOOST_PROTO_SEQ_PUSH_FRONT( \ BOOST_PP_TUPLE_ELEM(4, 2, DATA) \ , (BOOST_PP_TUPLE_ELEM(4, 3, DATA)) \
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?