Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 09:50:23

0001     ///////////////////////////////////////////////////////////////////////////////
0002     // funop.hpp
0003     // Contains definition of funop[n]\<\> class template.
0004     //
0005     //  Copyright 2008 Eric Niebler. Distributed under the Boost
0006     //  Software License, Version 1.0. (See accompanying file
0007     //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
0008     
0009     
0010     template<typename Expr, typename Domain >
0011     struct funop0
0012     {
0013         typedef typename proto::base_expr<
0014             Domain
0015           , tag::function
0016           , list1<
0017                 Expr &
0018                 
0019             >
0020         >::type type;
0021         BOOST_FORCEINLINE
0022         static type const call(
0023             Expr &e
0024             
0025         )
0026         {
0027             type that = {
0028                 e
0029                 
0030             };
0031             return that;
0032         }
0033     };
0034     
0035     
0036     template<typename Expr , typename This, typename Domain>
0037     struct funop<Expr(), This, Domain>
0038       : funop0<
0039             typename detail::same_cv<Expr, This>::type
0040           , Domain
0041             
0042         >
0043     {};
0044     
0045     
0046     template<typename Expr, typename Domain , typename A0>
0047     struct funop1
0048     {
0049         typedef typename proto::base_expr<
0050             Domain
0051           , tag::function
0052           , list2<
0053                 Expr &
0054                 , typename proto::result_of::as_child<A0, Domain>::type
0055             >
0056         >::type type;
0057         BOOST_FORCEINLINE
0058         static type const call(
0059             Expr &e
0060             , A0 &a0
0061         )
0062         {
0063             type that = {
0064                 e
0065                 , proto::as_child<Domain>(a0)
0066             };
0067             return that;
0068         }
0069     };
0070     
0071     
0072     template<typename Expr , typename A0, typename This, typename Domain>
0073     struct funop<Expr(A0), This, Domain>
0074       : funop1<
0075             typename detail::same_cv<Expr, This>::type
0076           , Domain
0077             , typename remove_reference<A0 >::type
0078         >
0079     {};
0080     
0081     
0082     template<typename Expr, typename Domain , typename A0 , typename A1>
0083     struct funop2
0084     {
0085         typedef typename proto::base_expr<
0086             Domain
0087           , tag::function
0088           , list3<
0089                 Expr &
0090                 , typename proto::result_of::as_child<A0, Domain>::type , typename proto::result_of::as_child<A1, Domain>::type
0091             >
0092         >::type type;
0093         BOOST_FORCEINLINE
0094         static type const call(
0095             Expr &e
0096             , A0 &a0 , A1 &a1
0097         )
0098         {
0099             type that = {
0100                 e
0101                 , proto::as_child<Domain>(a0) , proto::as_child<Domain>(a1)
0102             };
0103             return that;
0104         }
0105     };
0106     
0107     
0108     template<typename Expr , typename A0 , typename A1, typename This, typename Domain>
0109     struct funop<Expr(A0 , A1), This, Domain>
0110       : funop2<
0111             typename detail::same_cv<Expr, This>::type
0112           , Domain
0113             , typename remove_reference<A0 >::type , typename remove_reference<A1 >::type
0114         >
0115     {};
0116     
0117     
0118     template<typename Expr, typename Domain , typename A0 , typename A1 , typename A2>
0119     struct funop3
0120     {
0121         typedef typename proto::base_expr<
0122             Domain
0123           , tag::function
0124           , list4<
0125                 Expr &
0126                 , typename proto::result_of::as_child<A0, Domain>::type , typename proto::result_of::as_child<A1, Domain>::type , typename proto::result_of::as_child<A2, Domain>::type
0127             >
0128         >::type type;
0129         BOOST_FORCEINLINE
0130         static type const call(
0131             Expr &e
0132             , A0 &a0 , A1 &a1 , A2 &a2
0133         )
0134         {
0135             type that = {
0136                 e
0137                 , proto::as_child<Domain>(a0) , proto::as_child<Domain>(a1) , proto::as_child<Domain>(a2)
0138             };
0139             return that;
0140         }
0141     };
0142     
0143     
0144     template<typename Expr , typename A0 , typename A1 , typename A2, typename This, typename Domain>
0145     struct funop<Expr(A0 , A1 , A2), This, Domain>
0146       : funop3<
0147             typename detail::same_cv<Expr, This>::type
0148           , Domain
0149             , typename remove_reference<A0 >::type , typename remove_reference<A1 >::type , typename remove_reference<A2 >::type
0150         >
0151     {};
0152     
0153     
0154     template<typename Expr, typename Domain , typename A0 , typename A1 , typename A2 , typename A3>
0155     struct funop4
0156     {
0157         typedef typename proto::base_expr<
0158             Domain
0159           , tag::function
0160           , list5<
0161                 Expr &
0162                 , typename proto::result_of::as_child<A0, Domain>::type , typename proto::result_of::as_child<A1, Domain>::type , typename proto::result_of::as_child<A2, Domain>::type , typename proto::result_of::as_child<A3, Domain>::type
0163             >
0164         >::type type;
0165         BOOST_FORCEINLINE
0166         static type const call(
0167             Expr &e
0168             , A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3
0169         )
0170         {
0171             type that = {
0172                 e
0173                 , proto::as_child<Domain>(a0) , proto::as_child<Domain>(a1) , proto::as_child<Domain>(a2) , proto::as_child<Domain>(a3)
0174             };
0175             return that;
0176         }
0177     };
0178     
0179     
0180     template<typename Expr , typename A0 , typename A1 , typename A2 , typename A3, typename This, typename Domain>
0181     struct funop<Expr(A0 , A1 , A2 , A3), This, Domain>
0182       : funop4<
0183             typename detail::same_cv<Expr, This>::type
0184           , Domain
0185             , typename remove_reference<A0 >::type , typename remove_reference<A1 >::type , typename remove_reference<A2 >::type , typename remove_reference<A3 >::type
0186         >
0187     {};
0188     
0189     
0190     template<typename Expr, typename Domain , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
0191     struct funop5
0192     {
0193         typedef typename proto::base_expr<
0194             Domain
0195           , tag::function
0196           , list6<
0197                 Expr &
0198                 , typename proto::result_of::as_child<A0, Domain>::type , typename proto::result_of::as_child<A1, Domain>::type , typename proto::result_of::as_child<A2, Domain>::type , typename proto::result_of::as_child<A3, Domain>::type , typename proto::result_of::as_child<A4, Domain>::type
0199             >
0200         >::type type;
0201         BOOST_FORCEINLINE
0202         static type const call(
0203             Expr &e
0204             , A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4
0205         )
0206         {
0207             type that = {
0208                 e
0209                 , proto::as_child<Domain>(a0) , proto::as_child<Domain>(a1) , proto::as_child<Domain>(a2) , proto::as_child<Domain>(a3) , proto::as_child<Domain>(a4)
0210             };
0211             return that;
0212         }
0213     };
0214     
0215     
0216     template<typename Expr , typename A0 , typename A1 , typename A2 , typename A3 , typename A4, typename This, typename Domain>
0217     struct funop<Expr(A0 , A1 , A2 , A3 , A4), This, Domain>
0218       : funop5<
0219             typename detail::same_cv<Expr, This>::type
0220           , Domain
0221             , typename remove_reference<A0 >::type , typename remove_reference<A1 >::type , typename remove_reference<A2 >::type , typename remove_reference<A3 >::type , typename remove_reference<A4 >::type
0222         >
0223     {};
0224     
0225     
0226     template<typename Expr, typename Domain , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
0227     struct funop6
0228     {
0229         typedef typename proto::base_expr<
0230             Domain
0231           , tag::function
0232           , list7<
0233                 Expr &
0234                 , typename proto::result_of::as_child<A0, Domain>::type , typename proto::result_of::as_child<A1, Domain>::type , typename proto::result_of::as_child<A2, Domain>::type , typename proto::result_of::as_child<A3, Domain>::type , typename proto::result_of::as_child<A4, Domain>::type , typename proto::result_of::as_child<A5, Domain>::type
0235             >
0236         >::type type;
0237         BOOST_FORCEINLINE
0238         static type const call(
0239             Expr &e
0240             , A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5
0241         )
0242         {
0243             type that = {
0244                 e
0245                 , proto::as_child<Domain>(a0) , proto::as_child<Domain>(a1) , proto::as_child<Domain>(a2) , proto::as_child<Domain>(a3) , proto::as_child<Domain>(a4) , proto::as_child<Domain>(a5)
0246             };
0247             return that;
0248         }
0249     };
0250     
0251     
0252     template<typename Expr , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5, typename This, typename Domain>
0253     struct funop<Expr(A0 , A1 , A2 , A3 , A4 , A5), This, Domain>
0254       : funop6<
0255             typename detail::same_cv<Expr, This>::type
0256           , Domain
0257             , typename remove_reference<A0 >::type , typename remove_reference<A1 >::type , typename remove_reference<A2 >::type , typename remove_reference<A3 >::type , typename remove_reference<A4 >::type , typename remove_reference<A5 >::type
0258         >
0259     {};
0260     
0261     
0262     template<typename Expr, typename Domain , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
0263     struct funop7
0264     {
0265         typedef typename proto::base_expr<
0266             Domain
0267           , tag::function
0268           , list8<
0269                 Expr &
0270                 , typename proto::result_of::as_child<A0, Domain>::type , typename proto::result_of::as_child<A1, Domain>::type , typename proto::result_of::as_child<A2, Domain>::type , typename proto::result_of::as_child<A3, Domain>::type , typename proto::result_of::as_child<A4, Domain>::type , typename proto::result_of::as_child<A5, Domain>::type , typename proto::result_of::as_child<A6, Domain>::type
0271             >
0272         >::type type;
0273         BOOST_FORCEINLINE
0274         static type const call(
0275             Expr &e
0276             , A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5 , A6 &a6
0277         )
0278         {
0279             type that = {
0280                 e
0281                 , proto::as_child<Domain>(a0) , proto::as_child<Domain>(a1) , proto::as_child<Domain>(a2) , proto::as_child<Domain>(a3) , proto::as_child<Domain>(a4) , proto::as_child<Domain>(a5) , proto::as_child<Domain>(a6)
0282             };
0283             return that;
0284         }
0285     };
0286     
0287     
0288     template<typename Expr , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6, typename This, typename Domain>
0289     struct funop<Expr(A0 , A1 , A2 , A3 , A4 , A5 , A6), This, Domain>
0290       : funop7<
0291             typename detail::same_cv<Expr, This>::type
0292           , Domain
0293             , typename remove_reference<A0 >::type , typename remove_reference<A1 >::type , typename remove_reference<A2 >::type , typename remove_reference<A3 >::type , typename remove_reference<A4 >::type , typename remove_reference<A5 >::type , typename remove_reference<A6 >::type
0294         >
0295     {};
0296     
0297     
0298     template<typename Expr, typename Domain , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
0299     struct funop8
0300     {
0301         typedef typename proto::base_expr<
0302             Domain
0303           , tag::function
0304           , list9<
0305                 Expr &
0306                 , typename proto::result_of::as_child<A0, Domain>::type , typename proto::result_of::as_child<A1, Domain>::type , typename proto::result_of::as_child<A2, Domain>::type , typename proto::result_of::as_child<A3, Domain>::type , typename proto::result_of::as_child<A4, Domain>::type , typename proto::result_of::as_child<A5, Domain>::type , typename proto::result_of::as_child<A6, Domain>::type , typename proto::result_of::as_child<A7, Domain>::type
0307             >
0308         >::type type;
0309         BOOST_FORCEINLINE
0310         static type const call(
0311             Expr &e
0312             , A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5 , A6 &a6 , A7 &a7
0313         )
0314         {
0315             type that = {
0316                 e
0317                 , proto::as_child<Domain>(a0) , proto::as_child<Domain>(a1) , proto::as_child<Domain>(a2) , proto::as_child<Domain>(a3) , proto::as_child<Domain>(a4) , proto::as_child<Domain>(a5) , proto::as_child<Domain>(a6) , proto::as_child<Domain>(a7)
0318             };
0319             return that;
0320         }
0321     };
0322     
0323     
0324     template<typename Expr , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7, typename This, typename Domain>
0325     struct funop<Expr(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7), This, Domain>
0326       : funop8<
0327             typename detail::same_cv<Expr, This>::type
0328           , Domain
0329             , typename remove_reference<A0 >::type , typename remove_reference<A1 >::type , typename remove_reference<A2 >::type , typename remove_reference<A3 >::type , typename remove_reference<A4 >::type , typename remove_reference<A5 >::type , typename remove_reference<A6 >::type , typename remove_reference<A7 >::type
0330         >
0331     {};
0332     
0333     
0334     template<typename Expr, typename Domain , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
0335     struct funop9
0336     {
0337         typedef typename proto::base_expr<
0338             Domain
0339           , tag::function
0340           , list10<
0341                 Expr &
0342                 , typename proto::result_of::as_child<A0, Domain>::type , typename proto::result_of::as_child<A1, Domain>::type , typename proto::result_of::as_child<A2, Domain>::type , typename proto::result_of::as_child<A3, Domain>::type , typename proto::result_of::as_child<A4, Domain>::type , typename proto::result_of::as_child<A5, Domain>::type , typename proto::result_of::as_child<A6, Domain>::type , typename proto::result_of::as_child<A7, Domain>::type , typename proto::result_of::as_child<A8, Domain>::type
0343             >
0344         >::type type;
0345         BOOST_FORCEINLINE
0346         static type const call(
0347             Expr &e
0348             , A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5 , A6 &a6 , A7 &a7 , A8 &a8
0349         )
0350         {
0351             type that = {
0352                 e
0353                 , proto::as_child<Domain>(a0) , proto::as_child<Domain>(a1) , proto::as_child<Domain>(a2) , proto::as_child<Domain>(a3) , proto::as_child<Domain>(a4) , proto::as_child<Domain>(a5) , proto::as_child<Domain>(a6) , proto::as_child<Domain>(a7) , proto::as_child<Domain>(a8)
0354             };
0355             return that;
0356         }
0357     };
0358     
0359     
0360     template<typename Expr , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8, typename This, typename Domain>
0361     struct funop<Expr(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8), This, Domain>
0362       : funop9<
0363             typename detail::same_cv<Expr, This>::type
0364           , Domain
0365             , typename remove_reference<A0 >::type , typename remove_reference<A1 >::type , typename remove_reference<A2 >::type , typename remove_reference<A3 >::type , typename remove_reference<A4 >::type , typename remove_reference<A5 >::type , typename remove_reference<A6 >::type , typename remove_reference<A7 >::type , typename remove_reference<A8 >::type
0366         >
0367     {};