Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: /// \file make_expr_.hpp Chris@16: /// Contains definition of make_expr_\<\> class template. Chris@16: // Chris@16: // Copyright 2008 Eric Niebler. Distributed under the Boost Chris@16: // Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: template< Chris@16: typename Tag Chris@16: , typename Domain Chris@16: , typename A0 = void , typename A1 = void , typename A2 = void , typename A3 = void , typename A4 = void , typename A5 = void , typename A6 = void , typename A7 = void , typename A8 = void , typename A9 = void Chris@16: , typename _ = void Chris@16: > Chris@16: struct make_expr_ Chris@16: {}; Chris@16: template Chris@16: struct make_expr_ Chris@16: { Chris@16: typedef typename proto::detail::protoify::result_type result_type; Chris@16: BOOST_FORCEINLINE Chris@16: result_type operator()(typename add_reference::type a) const Chris@16: { Chris@16: return proto::detail::protoify()(a); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct make_expr_ Chris@16: : make_expr_ Chris@16: {}; Chris@16: template Chris@16: struct make_expr_ Chris@16: { Chris@16: typedef Chris@16: list1< Chris@16: typename boost::proto::detail::protoify< A0 , Domain >::result_type Chris@16: > Chris@16: proto_args; Chris@16: typedef typename base_expr::type expr_type; Chris@16: typedef typename Domain::proto_generator proto_generator; Chris@16: typedef typename proto_generator::template result::type result_type; Chris@16: BOOST_FORCEINLINE Chris@16: result_type operator()(typename add_reference::type a0) const Chris@16: { Chris@16: expr_type const that = { Chris@16: boost::proto::detail::protoify< A0 , Domain >()(a0) Chris@16: }; Chris@16: return proto_generator()(that); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct make_expr_ Chris@16: : make_expr_< Chris@16: Tag Chris@16: , typename deduce_domain1::type Chris@16: , A0 Chris@16: > Chris@16: {}; Chris@16: template Chris@16: struct make_expr_ Chris@16: { Chris@16: typedef Chris@16: list2< Chris@16: typename boost::proto::detail::protoify< A0 , Domain >::result_type , typename boost::proto::detail::protoify< A1 , Domain >::result_type Chris@16: > Chris@16: proto_args; Chris@16: typedef typename base_expr::type expr_type; Chris@16: typedef typename Domain::proto_generator proto_generator; Chris@16: typedef typename proto_generator::template result::type result_type; Chris@16: BOOST_FORCEINLINE Chris@16: result_type operator()(typename add_reference::type a0 , typename add_reference::type a1) const Chris@16: { Chris@16: expr_type const that = { Chris@16: boost::proto::detail::protoify< A0 , Domain >()(a0) , boost::proto::detail::protoify< A1 , Domain >()(a1) Chris@16: }; Chris@16: return proto_generator()(that); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct make_expr_ Chris@16: : make_expr_< Chris@16: Tag Chris@16: , typename deduce_domain2::type Chris@16: , A0 , A1 Chris@16: > Chris@16: {}; Chris@16: template Chris@16: struct make_expr_ Chris@16: { Chris@16: typedef Chris@16: list3< Chris@16: typename boost::proto::detail::protoify< A0 , Domain >::result_type , typename boost::proto::detail::protoify< A1 , Domain >::result_type , typename boost::proto::detail::protoify< A2 , Domain >::result_type Chris@16: > Chris@16: proto_args; Chris@16: typedef typename base_expr::type expr_type; Chris@16: typedef typename Domain::proto_generator proto_generator; Chris@16: typedef typename proto_generator::template result::type result_type; Chris@16: BOOST_FORCEINLINE Chris@16: result_type operator()(typename add_reference::type a0 , typename add_reference::type a1 , typename add_reference::type a2) const Chris@16: { Chris@16: expr_type const that = { Chris@16: boost::proto::detail::protoify< A0 , Domain >()(a0) , boost::proto::detail::protoify< A1 , Domain >()(a1) , boost::proto::detail::protoify< A2 , Domain >()(a2) Chris@16: }; Chris@16: return proto_generator()(that); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct make_expr_ Chris@16: : make_expr_< Chris@16: Tag Chris@16: , typename deduce_domain3::type Chris@16: , A0 , A1 , A2 Chris@16: > Chris@16: {}; Chris@16: template Chris@16: struct make_expr_ Chris@16: { Chris@16: typedef Chris@16: list4< Chris@16: typename boost::proto::detail::protoify< A0 , Domain >::result_type , typename boost::proto::detail::protoify< A1 , Domain >::result_type , typename boost::proto::detail::protoify< A2 , Domain >::result_type , typename boost::proto::detail::protoify< A3 , Domain >::result_type Chris@16: > Chris@16: proto_args; Chris@16: typedef typename base_expr::type expr_type; Chris@16: typedef typename Domain::proto_generator proto_generator; Chris@16: typedef typename proto_generator::template result::type result_type; Chris@16: BOOST_FORCEINLINE Chris@16: result_type operator()(typename add_reference::type a0 , typename add_reference::type a1 , typename add_reference::type a2 , typename add_reference::type a3) const Chris@16: { Chris@16: expr_type const that = { Chris@16: boost::proto::detail::protoify< A0 , Domain >()(a0) , boost::proto::detail::protoify< A1 , Domain >()(a1) , boost::proto::detail::protoify< A2 , Domain >()(a2) , boost::proto::detail::protoify< A3 , Domain >()(a3) Chris@16: }; Chris@16: return proto_generator()(that); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct make_expr_ Chris@16: : make_expr_< Chris@16: Tag Chris@16: , typename deduce_domain4::type Chris@16: , A0 , A1 , A2 , A3 Chris@16: > Chris@16: {}; Chris@16: template Chris@16: struct make_expr_ Chris@16: { Chris@16: typedef Chris@16: list5< Chris@16: typename boost::proto::detail::protoify< A0 , Domain >::result_type , typename boost::proto::detail::protoify< A1 , Domain >::result_type , typename boost::proto::detail::protoify< A2 , Domain >::result_type , typename boost::proto::detail::protoify< A3 , Domain >::result_type , typename boost::proto::detail::protoify< A4 , Domain >::result_type Chris@16: > Chris@16: proto_args; Chris@16: typedef typename base_expr::type expr_type; Chris@16: typedef typename Domain::proto_generator proto_generator; Chris@16: typedef typename proto_generator::template result::type result_type; Chris@16: BOOST_FORCEINLINE Chris@16: result_type operator()(typename add_reference::type a0 , typename add_reference::type a1 , typename add_reference::type a2 , typename add_reference::type a3 , typename add_reference::type a4) const Chris@16: { Chris@16: expr_type const that = { Chris@16: boost::proto::detail::protoify< A0 , Domain >()(a0) , boost::proto::detail::protoify< A1 , Domain >()(a1) , boost::proto::detail::protoify< A2 , Domain >()(a2) , boost::proto::detail::protoify< A3 , Domain >()(a3) , boost::proto::detail::protoify< A4 , Domain >()(a4) Chris@16: }; Chris@16: return proto_generator()(that); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct make_expr_ Chris@16: : make_expr_< Chris@16: Tag Chris@16: , typename deduce_domain5::type Chris@16: , A0 , A1 , A2 , A3 , A4 Chris@16: > Chris@16: {}; Chris@16: template Chris@16: struct make_expr_ Chris@16: { Chris@16: typedef Chris@16: list6< Chris@16: typename boost::proto::detail::protoify< A0 , Domain >::result_type , typename boost::proto::detail::protoify< A1 , Domain >::result_type , typename boost::proto::detail::protoify< A2 , Domain >::result_type , typename boost::proto::detail::protoify< A3 , Domain >::result_type , typename boost::proto::detail::protoify< A4 , Domain >::result_type , typename boost::proto::detail::protoify< A5 , Domain >::result_type Chris@16: > Chris@16: proto_args; Chris@16: typedef typename base_expr::type expr_type; Chris@16: typedef typename Domain::proto_generator proto_generator; Chris@16: typedef typename proto_generator::template result::type result_type; Chris@16: BOOST_FORCEINLINE Chris@16: result_type operator()(typename add_reference::type a0 , typename add_reference::type a1 , typename add_reference::type a2 , typename add_reference::type a3 , typename add_reference::type a4 , typename add_reference::type a5) const Chris@16: { Chris@16: expr_type const that = { Chris@16: boost::proto::detail::protoify< A0 , Domain >()(a0) , boost::proto::detail::protoify< A1 , Domain >()(a1) , boost::proto::detail::protoify< A2 , Domain >()(a2) , boost::proto::detail::protoify< A3 , Domain >()(a3) , boost::proto::detail::protoify< A4 , Domain >()(a4) , boost::proto::detail::protoify< A5 , Domain >()(a5) Chris@16: }; Chris@16: return proto_generator()(that); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct make_expr_ Chris@16: : make_expr_< Chris@16: Tag Chris@16: , typename deduce_domain6::type Chris@16: , A0 , A1 , A2 , A3 , A4 , A5 Chris@16: > Chris@16: {}; Chris@16: template Chris@16: struct make_expr_ Chris@16: { Chris@16: typedef Chris@16: list7< Chris@16: typename boost::proto::detail::protoify< A0 , Domain >::result_type , typename boost::proto::detail::protoify< A1 , Domain >::result_type , typename boost::proto::detail::protoify< A2 , Domain >::result_type , typename boost::proto::detail::protoify< A3 , Domain >::result_type , typename boost::proto::detail::protoify< A4 , Domain >::result_type , typename boost::proto::detail::protoify< A5 , Domain >::result_type , typename boost::proto::detail::protoify< A6 , Domain >::result_type Chris@16: > Chris@16: proto_args; Chris@16: typedef typename base_expr::type expr_type; Chris@16: typedef typename Domain::proto_generator proto_generator; Chris@16: typedef typename proto_generator::template result::type result_type; Chris@16: BOOST_FORCEINLINE Chris@16: result_type operator()(typename add_reference::type a0 , typename add_reference::type a1 , typename add_reference::type a2 , typename add_reference::type a3 , typename add_reference::type a4 , typename add_reference::type a5 , typename add_reference::type a6) const Chris@16: { Chris@16: expr_type const that = { Chris@16: boost::proto::detail::protoify< A0 , Domain >()(a0) , boost::proto::detail::protoify< A1 , Domain >()(a1) , boost::proto::detail::protoify< A2 , Domain >()(a2) , boost::proto::detail::protoify< A3 , Domain >()(a3) , boost::proto::detail::protoify< A4 , Domain >()(a4) , boost::proto::detail::protoify< A5 , Domain >()(a5) , boost::proto::detail::protoify< A6 , Domain >()(a6) Chris@16: }; Chris@16: return proto_generator()(that); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct make_expr_ Chris@16: : make_expr_< Chris@16: Tag Chris@16: , typename deduce_domain7::type Chris@16: , A0 , A1 , A2 , A3 , A4 , A5 , A6 Chris@16: > Chris@16: {}; Chris@16: template Chris@16: struct make_expr_ Chris@16: { Chris@16: typedef Chris@16: list8< Chris@16: typename boost::proto::detail::protoify< A0 , Domain >::result_type , typename boost::proto::detail::protoify< A1 , Domain >::result_type , typename boost::proto::detail::protoify< A2 , Domain >::result_type , typename boost::proto::detail::protoify< A3 , Domain >::result_type , typename boost::proto::detail::protoify< A4 , Domain >::result_type , typename boost::proto::detail::protoify< A5 , Domain >::result_type , typename boost::proto::detail::protoify< A6 , Domain >::result_type , typename boost::proto::detail::protoify< A7 , Domain >::result_type Chris@16: > Chris@16: proto_args; Chris@16: typedef typename base_expr::type expr_type; Chris@16: typedef typename Domain::proto_generator proto_generator; Chris@16: typedef typename proto_generator::template result::type result_type; Chris@16: BOOST_FORCEINLINE Chris@16: result_type operator()(typename add_reference::type a0 , typename add_reference::type a1 , typename add_reference::type a2 , typename add_reference::type a3 , typename add_reference::type a4 , typename add_reference::type a5 , typename add_reference::type a6 , typename add_reference::type a7) const Chris@16: { Chris@16: expr_type const that = { Chris@16: boost::proto::detail::protoify< A0 , Domain >()(a0) , boost::proto::detail::protoify< A1 , Domain >()(a1) , boost::proto::detail::protoify< A2 , Domain >()(a2) , boost::proto::detail::protoify< A3 , Domain >()(a3) , boost::proto::detail::protoify< A4 , Domain >()(a4) , boost::proto::detail::protoify< A5 , Domain >()(a5) , boost::proto::detail::protoify< A6 , Domain >()(a6) , boost::proto::detail::protoify< A7 , Domain >()(a7) Chris@16: }; Chris@16: return proto_generator()(that); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct make_expr_ Chris@16: : make_expr_< Chris@16: Tag Chris@16: , typename deduce_domain8::type Chris@16: , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 Chris@16: > Chris@16: {}; Chris@16: template Chris@16: struct make_expr_ Chris@16: { Chris@16: typedef Chris@16: list9< Chris@16: typename boost::proto::detail::protoify< A0 , Domain >::result_type , typename boost::proto::detail::protoify< A1 , Domain >::result_type , typename boost::proto::detail::protoify< A2 , Domain >::result_type , typename boost::proto::detail::protoify< A3 , Domain >::result_type , typename boost::proto::detail::protoify< A4 , Domain >::result_type , typename boost::proto::detail::protoify< A5 , Domain >::result_type , typename boost::proto::detail::protoify< A6 , Domain >::result_type , typename boost::proto::detail::protoify< A7 , Domain >::result_type , typename boost::proto::detail::protoify< A8 , Domain >::result_type Chris@16: > Chris@16: proto_args; Chris@16: typedef typename base_expr::type expr_type; Chris@16: typedef typename Domain::proto_generator proto_generator; Chris@16: typedef typename proto_generator::template result::type result_type; Chris@16: BOOST_FORCEINLINE Chris@16: result_type operator()(typename add_reference::type a0 , typename add_reference::type a1 , typename add_reference::type a2 , typename add_reference::type a3 , typename add_reference::type a4 , typename add_reference::type a5 , typename add_reference::type a6 , typename add_reference::type a7 , typename add_reference::type a8) const Chris@16: { Chris@16: expr_type const that = { Chris@16: boost::proto::detail::protoify< A0 , Domain >()(a0) , boost::proto::detail::protoify< A1 , Domain >()(a1) , boost::proto::detail::protoify< A2 , Domain >()(a2) , boost::proto::detail::protoify< A3 , Domain >()(a3) , boost::proto::detail::protoify< A4 , Domain >()(a4) , boost::proto::detail::protoify< A5 , Domain >()(a5) , boost::proto::detail::protoify< A6 , Domain >()(a6) , boost::proto::detail::protoify< A7 , Domain >()(a7) , boost::proto::detail::protoify< A8 , Domain >()(a8) Chris@16: }; Chris@16: return proto_generator()(that); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct make_expr_ Chris@16: : make_expr_< Chris@16: Tag Chris@16: , typename deduce_domain9::type Chris@16: , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 Chris@16: > Chris@16: {}; Chris@16: template Chris@16: struct make_expr_ Chris@16: { Chris@16: typedef Chris@16: list10< Chris@16: typename boost::proto::detail::protoify< A0 , Domain >::result_type , typename boost::proto::detail::protoify< A1 , Domain >::result_type , typename boost::proto::detail::protoify< A2 , Domain >::result_type , typename boost::proto::detail::protoify< A3 , Domain >::result_type , typename boost::proto::detail::protoify< A4 , Domain >::result_type , typename boost::proto::detail::protoify< A5 , Domain >::result_type , typename boost::proto::detail::protoify< A6 , Domain >::result_type , typename boost::proto::detail::protoify< A7 , Domain >::result_type , typename boost::proto::detail::protoify< A8 , Domain >::result_type , typename boost::proto::detail::protoify< A9 , Domain >::result_type Chris@16: > Chris@16: proto_args; Chris@16: typedef typename base_expr::type expr_type; Chris@16: typedef typename Domain::proto_generator proto_generator; Chris@16: typedef typename proto_generator::template result::type result_type; Chris@16: BOOST_FORCEINLINE Chris@16: result_type operator()(typename add_reference::type a0 , typename add_reference::type a1 , typename add_reference::type a2 , typename add_reference::type a3 , typename add_reference::type a4 , typename add_reference::type a5 , typename add_reference::type a6 , typename add_reference::type a7 , typename add_reference::type a8 , typename add_reference::type a9) const Chris@16: { Chris@16: expr_type const that = { Chris@16: boost::proto::detail::protoify< A0 , Domain >()(a0) , boost::proto::detail::protoify< A1 , Domain >()(a1) , boost::proto::detail::protoify< A2 , Domain >()(a2) , boost::proto::detail::protoify< A3 , Domain >()(a3) , boost::proto::detail::protoify< A4 , Domain >()(a4) , boost::proto::detail::protoify< A5 , Domain >()(a5) , boost::proto::detail::protoify< A6 , Domain >()(a6) , boost::proto::detail::protoify< A7 , Domain >()(a7) , boost::proto::detail::protoify< A8 , Domain >()(a8) , boost::proto::detail::protoify< A9 , Domain >()(a9) Chris@16: }; Chris@16: return proto_generator()(that); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct make_expr_ Chris@16: : make_expr_< Chris@16: Tag Chris@16: , typename deduce_domain10::type Chris@16: , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9 Chris@16: > Chris@16: {};