📄 make.hpp
字号:
struct make : proto::callable { template<typename Sig> struct result; template<typename This, typename Expr, typename State, typename Visitor> struct result<This(Expr, State, Visitor)> { typedef typename detail::make_if_<Object, Expr, State, Visitor>::type type; }; /// \param expr The current expression /// \param state The current state /// \param visitor An arbitrary visitor /// \return <tt>result\<void(Expr, State, Visitor)\>::::type()</tt> template<typename Expr, typename State, typename Visitor> typename result<void(Expr, State, Visitor)>::type operator ()(Expr const &, State const &, Visitor &) const { typedef typename result<void(Expr, State, Visitor)>::type result_type; return result_type(); } }; #define BOOST_PP_ITERATION_PARAMS_1 (3, (0, BOOST_PROTO_MAX_ARITY, <boost/xpressive/proto/transform/make.hpp>)) #include BOOST_PP_ITERATE() } /// INTERNAL ONLY /// template<typename Object> struct is_callable<transform::make<Object> > : mpl::true_ {}; }} #endif#else #define N BOOST_PP_ITERATION() namespace detail { #if N > 0 template<typename T BOOST_PP_ENUM_TRAILING_PARAMS(N, typename A)> struct nested_type_if< T , typelist<BOOST_PP_ENUM_PARAMS(N, A)> , typename typelist< BOOST_PP_ENUM_BINARY_PARAMS(N, typename A, ::not_applied_ BOOST_PP_INTERCEPT) >::type > { typedef T type; typedef void not_applied_; }; template< template<BOOST_PP_ENUM_PARAMS(N, typename BOOST_PP_INTERCEPT)> class R BOOST_PP_ENUM_TRAILING_PARAMS(N, typename A) , typename Expr, typename State, typename Visitor > struct make_<R<BOOST_PP_ENUM_PARAMS(N, A)>, Expr, State, Visitor BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(N) > : nested_type_if< #define TMP0(Z, M, DATA) make_if_<BOOST_PP_CAT(A, M), Expr, State, Visitor> #define TMP1(Z, M, DATA) typename TMP0(Z, M, DATA) ::type R<BOOST_PP_ENUM(N, TMP1, ~)> , typelist<BOOST_PP_ENUM(N, TMP0, ~) > #undef TMP0 #undef TMP1 > {}; #endif template< typename R BOOST_PP_ENUM_TRAILING_PARAMS(N, typename A) , typename Expr, typename State, typename Visitor > struct make_if_<R(BOOST_PP_ENUM_PARAMS(N, A)), Expr, State, Visitor, false> { typedef typename when<_, R(BOOST_PP_ENUM_PARAMS(N, A))>::template result<void(Expr, State, Visitor)>::type type; }; template< typename R BOOST_PP_ENUM_TRAILING_PARAMS(N, typename A) , typename Expr, typename State, typename Visitor > struct make_if_<R(*)(BOOST_PP_ENUM_PARAMS(N, A)), Expr, State, Visitor, false> { typedef typename when<_, R(BOOST_PP_ENUM_PARAMS(N, A))>::template result<void(Expr, State, Visitor)>::type type; }; template<typename T, typename A> struct construct_<proto::expr<T, A, N>, true> { typedef proto::expr<T, A, N> result_type; template<BOOST_PP_ENUM_PARAMS(BOOST_PP_MAX(N, 1), typename A)> result_type operator ()(BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_MAX(N, 1), A, &a)) const { return result_type::make(BOOST_PP_ENUM_PARAMS(BOOST_PP_MAX(N, 1), a)); } }; } /// \brief A PrimitiveTransform which computes a type by evaluating any /// nested transforms and then constructs an object of that type with the /// current expression, state and visitor, transformed according /// to \c A0 through \c AN. template<typename Object BOOST_PP_ENUM_TRAILING_PARAMS(N, typename A)> struct make<Object(BOOST_PP_ENUM_PARAMS(N, A))> : proto::callable { template<typename Sig> struct result; template<typename This, typename Expr, typename State, typename Visitor> struct result<This(Expr, State, Visitor)> { /// \brief <tt>make\<Object\>::::result\<void(Expr, State, Visitor)\>::::type</tt> typedef typename detail::make_if_<Object, Expr, State, Visitor>::type type; }; /// Let \c ax be <tt>when\<_, Ax\>()(expr, state, visitor)</tt> /// for each \c x in <tt>[0,N]</tt>. /// Let \c T be <tt>result\<void(Expr, State, Visitor)\>::::type</tt>. /// Return <tt>T(a0, a1,... aN)</tt>. /// /// \param expr The current expression /// \param state The current state /// \param visitor An arbitrary visitor template<typename Expr, typename State, typename Visitor> typename result<void(Expr, State, Visitor)>::type operator ()(Expr const &expr, State const &state, Visitor &visitor) const { typedef typename result<void(Expr, State, Visitor)>::type result_type; proto::detail::ignore_unused(expr); proto::detail::ignore_unused(state); proto::detail::ignore_unused(visitor); return detail::construct<result_type>( #define TMP(Z, M, DATA) detail::as_lvalue(when<_, BOOST_PP_CAT(A, M)>()(expr, state, visitor)) BOOST_PP_ENUM(N, TMP, DATA) #undef TMP ); } }; #if BOOST_WORKAROUND(__GNUC__, == 3) // work around GCC bug template<typename Tag, typename Args, long Arity BOOST_PP_ENUM_TRAILING_PARAMS(N, typename A)> struct make<proto::expr<Tag, Args, Arity>(BOOST_PP_ENUM_PARAMS(N, A))> : proto::callable { template<typename Sig> struct result; template<typename This, typename Expr, typename State, typename Visitor> struct result<This(Expr, State, Visitor)> { typedef proto::expr<Tag, Args, Arity> type; }; template<typename Expr, typename State, typename Visitor> proto::expr<Tag, Args, Arity> operator ()(Expr const &expr, State const &state, Visitor &visitor) const { return proto::expr<Tag, Args, Arity>::make( #define TMP(Z, M, DATA) detail::as_lvalue(when<_, BOOST_PP_CAT(A, M)>()(expr, state, visitor)) BOOST_PP_ENUM(N, TMP, DATA) #undef TMP ); } }; #endif #undef N#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -