Back to home page

EIC code displayed by LXR

 
 

    


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

0001     ///////////////////////////////////////////////////////////////////////////////
0002     // poly_function_traits.hpp
0003     // Contains specializations of poly_function_traits and as_mono_function
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     template<typename PolyFun , typename A0>
0010     struct poly_function_traits<PolyFun, PolyFun(A0), mpl::size_t<sizeof(poly_function_t)> >
0011     {
0012         typedef typename PolyFun::template impl<const A0> function_type;
0013         typedef typename function_type::result_type result_type;
0014     };
0015     
0016     template<typename PolyFun , typename A0>
0017     struct as_mono_function_impl<PolyFun(A0), true>
0018     {
0019         typedef typename PolyFun::template impl<const A0> type;
0020     };
0021     
0022     template<typename PolyFun , typename A0>
0023     struct as_mono_function_impl<PolyFun(A0), false>
0024     {
0025         typedef PolyFun type;
0026     };
0027     
0028     template<typename PolyFun , typename A0>
0029     struct as_mono_function<PolyFun(A0)>
0030       : as_mono_function_impl<PolyFun(A0), is_poly_function<PolyFun>::value>
0031     {};
0032     
0033     template<typename PolyFun , typename A0 , typename A1>
0034     struct poly_function_traits<PolyFun, PolyFun(A0 , A1), mpl::size_t<sizeof(poly_function_t)> >
0035     {
0036         typedef typename PolyFun::template impl<const A0 , const A1> function_type;
0037         typedef typename function_type::result_type result_type;
0038     };
0039     
0040     template<typename PolyFun , typename A0 , typename A1>
0041     struct as_mono_function_impl<PolyFun(A0 , A1), true>
0042     {
0043         typedef typename PolyFun::template impl<const A0 , const A1> type;
0044     };
0045     
0046     template<typename PolyFun , typename A0 , typename A1>
0047     struct as_mono_function_impl<PolyFun(A0 , A1), false>
0048     {
0049         typedef PolyFun type;
0050     };
0051     
0052     template<typename PolyFun , typename A0 , typename A1>
0053     struct as_mono_function<PolyFun(A0 , A1)>
0054       : as_mono_function_impl<PolyFun(A0 , A1), is_poly_function<PolyFun>::value>
0055     {};
0056     
0057     template<typename PolyFun , typename A0 , typename A1 , typename A2>
0058     struct poly_function_traits<PolyFun, PolyFun(A0 , A1 , A2), mpl::size_t<sizeof(poly_function_t)> >
0059     {
0060         typedef typename PolyFun::template impl<const A0 , const A1 , const A2> function_type;
0061         typedef typename function_type::result_type result_type;
0062     };
0063     
0064     template<typename PolyFun , typename A0 , typename A1 , typename A2>
0065     struct as_mono_function_impl<PolyFun(A0 , A1 , A2), true>
0066     {
0067         typedef typename PolyFun::template impl<const A0 , const A1 , const A2> type;
0068     };
0069     
0070     template<typename PolyFun , typename A0 , typename A1 , typename A2>
0071     struct as_mono_function_impl<PolyFun(A0 , A1 , A2), false>
0072     {
0073         typedef PolyFun type;
0074     };
0075     
0076     template<typename PolyFun , typename A0 , typename A1 , typename A2>
0077     struct as_mono_function<PolyFun(A0 , A1 , A2)>
0078       : as_mono_function_impl<PolyFun(A0 , A1 , A2), is_poly_function<PolyFun>::value>
0079     {};
0080     
0081     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3>
0082     struct poly_function_traits<PolyFun, PolyFun(A0 , A1 , A2 , A3), mpl::size_t<sizeof(poly_function_t)> >
0083     {
0084         typedef typename PolyFun::template impl<const A0 , const A1 , const A2 , const A3> function_type;
0085         typedef typename function_type::result_type result_type;
0086     };
0087     
0088     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3>
0089     struct as_mono_function_impl<PolyFun(A0 , A1 , A2 , A3), true>
0090     {
0091         typedef typename PolyFun::template impl<const A0 , const A1 , const A2 , const A3> type;
0092     };
0093     
0094     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3>
0095     struct as_mono_function_impl<PolyFun(A0 , A1 , A2 , A3), false>
0096     {
0097         typedef PolyFun type;
0098     };
0099     
0100     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3>
0101     struct as_mono_function<PolyFun(A0 , A1 , A2 , A3)>
0102       : as_mono_function_impl<PolyFun(A0 , A1 , A2 , A3), is_poly_function<PolyFun>::value>
0103     {};
0104     
0105     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
0106     struct poly_function_traits<PolyFun, PolyFun(A0 , A1 , A2 , A3 , A4), mpl::size_t<sizeof(poly_function_t)> >
0107     {
0108         typedef typename PolyFun::template impl<const A0 , const A1 , const A2 , const A3 , const A4> function_type;
0109         typedef typename function_type::result_type result_type;
0110     };
0111     
0112     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
0113     struct as_mono_function_impl<PolyFun(A0 , A1 , A2 , A3 , A4), true>
0114     {
0115         typedef typename PolyFun::template impl<const A0 , const A1 , const A2 , const A3 , const A4> type;
0116     };
0117     
0118     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
0119     struct as_mono_function_impl<PolyFun(A0 , A1 , A2 , A3 , A4), false>
0120     {
0121         typedef PolyFun type;
0122     };
0123     
0124     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
0125     struct as_mono_function<PolyFun(A0 , A1 , A2 , A3 , A4)>
0126       : as_mono_function_impl<PolyFun(A0 , A1 , A2 , A3 , A4), is_poly_function<PolyFun>::value>
0127     {};
0128     
0129     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
0130     struct poly_function_traits<PolyFun, PolyFun(A0 , A1 , A2 , A3 , A4 , A5), mpl::size_t<sizeof(poly_function_t)> >
0131     {
0132         typedef typename PolyFun::template impl<const A0 , const A1 , const A2 , const A3 , const A4 , const A5> function_type;
0133         typedef typename function_type::result_type result_type;
0134     };
0135     
0136     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
0137     struct as_mono_function_impl<PolyFun(A0 , A1 , A2 , A3 , A4 , A5), true>
0138     {
0139         typedef typename PolyFun::template impl<const A0 , const A1 , const A2 , const A3 , const A4 , const A5> type;
0140     };
0141     
0142     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
0143     struct as_mono_function_impl<PolyFun(A0 , A1 , A2 , A3 , A4 , A5), false>
0144     {
0145         typedef PolyFun type;
0146     };
0147     
0148     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
0149     struct as_mono_function<PolyFun(A0 , A1 , A2 , A3 , A4 , A5)>
0150       : as_mono_function_impl<PolyFun(A0 , A1 , A2 , A3 , A4 , A5), is_poly_function<PolyFun>::value>
0151     {};
0152     
0153     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
0154     struct poly_function_traits<PolyFun, PolyFun(A0 , A1 , A2 , A3 , A4 , A5 , A6), mpl::size_t<sizeof(poly_function_t)> >
0155     {
0156         typedef typename PolyFun::template impl<const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6> function_type;
0157         typedef typename function_type::result_type result_type;
0158     };
0159     
0160     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
0161     struct as_mono_function_impl<PolyFun(A0 , A1 , A2 , A3 , A4 , A5 , A6), true>
0162     {
0163         typedef typename PolyFun::template impl<const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6> type;
0164     };
0165     
0166     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
0167     struct as_mono_function_impl<PolyFun(A0 , A1 , A2 , A3 , A4 , A5 , A6), false>
0168     {
0169         typedef PolyFun type;
0170     };
0171     
0172     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
0173     struct as_mono_function<PolyFun(A0 , A1 , A2 , A3 , A4 , A5 , A6)>
0174       : as_mono_function_impl<PolyFun(A0 , A1 , A2 , A3 , A4 , A5 , A6), is_poly_function<PolyFun>::value>
0175     {};
0176     
0177     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
0178     struct poly_function_traits<PolyFun, PolyFun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7), mpl::size_t<sizeof(poly_function_t)> >
0179     {
0180         typedef typename PolyFun::template impl<const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6 , const A7> function_type;
0181         typedef typename function_type::result_type result_type;
0182     };
0183     
0184     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
0185     struct as_mono_function_impl<PolyFun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7), true>
0186     {
0187         typedef typename PolyFun::template impl<const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6 , const A7> type;
0188     };
0189     
0190     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
0191     struct as_mono_function_impl<PolyFun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7), false>
0192     {
0193         typedef PolyFun type;
0194     };
0195     
0196     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
0197     struct as_mono_function<PolyFun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)>
0198       : as_mono_function_impl<PolyFun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7), is_poly_function<PolyFun>::value>
0199     {};
0200     
0201     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
0202     struct poly_function_traits<PolyFun, PolyFun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8), mpl::size_t<sizeof(poly_function_t)> >
0203     {
0204         typedef typename PolyFun::template impl<const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6 , const A7 , const A8> function_type;
0205         typedef typename function_type::result_type result_type;
0206     };
0207     
0208     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
0209     struct as_mono_function_impl<PolyFun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8), true>
0210     {
0211         typedef typename PolyFun::template impl<const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6 , const A7 , const A8> type;
0212     };
0213     
0214     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
0215     struct as_mono_function_impl<PolyFun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8), false>
0216     {
0217         typedef PolyFun type;
0218     };
0219     
0220     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
0221     struct as_mono_function<PolyFun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)>
0222       : as_mono_function_impl<PolyFun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8), is_poly_function<PolyFun>::value>
0223     {};
0224     
0225     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
0226     struct poly_function_traits<PolyFun, PolyFun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9), mpl::size_t<sizeof(poly_function_t)> >
0227     {
0228         typedef typename PolyFun::template impl<const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6 , const A7 , const A8 , const A9> function_type;
0229         typedef typename function_type::result_type result_type;
0230     };
0231     
0232     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
0233     struct as_mono_function_impl<PolyFun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9), true>
0234     {
0235         typedef typename PolyFun::template impl<const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6 , const A7 , const A8 , const A9> type;
0236     };
0237     
0238     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
0239     struct as_mono_function_impl<PolyFun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9), false>
0240     {
0241         typedef PolyFun type;
0242     };
0243     
0244     template<typename PolyFun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
0245     struct as_mono_function<PolyFun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)>
0246       : as_mono_function_impl<PolyFun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9), is_poly_function<PolyFun>::value>
0247     {};