Chris@16
|
1 // Copyright David Abrahams 2006. Distributed under the Boost
|
Chris@16
|
2 // Software License, Version 1.0. (See accompanying
|
Chris@16
|
3 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
4 //
|
Chris@16
|
5 // #include guards intentionally disabled.
|
Chris@16
|
6 // #ifndef BOOST_DETAIL_FUNCTION_N_DWA2006514_HPP
|
Chris@16
|
7 // # define BOOST_DETAIL_FUNCTION_N_DWA2006514_HPP
|
Chris@16
|
8
|
Chris@16
|
9 #include <boost/mpl/void.hpp>
|
Chris@16
|
10 #include <boost/mpl/apply.hpp>
|
Chris@16
|
11
|
Chris@16
|
12 #include <boost/preprocessor/control/if.hpp>
|
Chris@16
|
13 #include <boost/preprocessor/cat.hpp>
|
Chris@16
|
14 #include <boost/preprocessor/punctuation/comma_if.hpp>
|
Chris@16
|
15 #include <boost/preprocessor/repetition/enum_params.hpp>
|
Chris@16
|
16 #include <boost/preprocessor/repetition/enum_trailing_params.hpp>
|
Chris@16
|
17 #include <boost/preprocessor/repetition/repeat.hpp>
|
Chris@16
|
18 #include <boost/preprocessor/seq/fold_left.hpp>
|
Chris@16
|
19 #include <boost/preprocessor/seq/seq.hpp>
|
Chris@16
|
20 #include <boost/preprocessor/seq/for_each.hpp>
|
Chris@16
|
21 #include <boost/preprocessor/seq/for_each_i.hpp>
|
Chris@16
|
22 #include <boost/preprocessor/seq/for_each_product.hpp>
|
Chris@16
|
23 #include <boost/preprocessor/seq/size.hpp>
|
Chris@16
|
24 #include <boost/type_traits/add_const.hpp>
|
Chris@16
|
25 #include <boost/type_traits/remove_reference.hpp>
|
Chris@16
|
26
|
Chris@16
|
27 namespace boost { namespace detail {
|
Chris@16
|
28
|
Chris@16
|
29 # define BOOST_DETAIL_default_arg(z, n, _) \
|
Chris@16
|
30 typedef mpl::void_ BOOST_PP_CAT(arg, n);
|
Chris@16
|
31
|
Chris@16
|
32 # define BOOST_DETAIL_function_arg(z, n, _) \
|
Chris@16
|
33 typedef typename remove_reference< \
|
Chris@16
|
34 typename add_const< BOOST_PP_CAT(A, n) >::type \
|
Chris@16
|
35 >::type BOOST_PP_CAT(arg, n);
|
Chris@16
|
36
|
Chris@16
|
37 #define BOOST_DETAIL_cat_arg_counts(s, state, n) \
|
Chris@16
|
38 BOOST_PP_IF( \
|
Chris@16
|
39 n \
|
Chris@16
|
40 , BOOST_PP_CAT(state, BOOST_PP_CAT(_, n)) \
|
Chris@16
|
41 , state \
|
Chris@16
|
42 ) \
|
Chris@16
|
43 /**/
|
Chris@16
|
44
|
Chris@16
|
45 #define function_name \
|
Chris@16
|
46 BOOST_PP_SEQ_FOLD_LEFT( \
|
Chris@16
|
47 BOOST_DETAIL_cat_arg_counts \
|
Chris@16
|
48 , BOOST_PP_CAT(function, BOOST_PP_SEQ_HEAD(args)) \
|
Chris@16
|
49 , BOOST_PP_SEQ_TAIL(args)(0) \
|
Chris@16
|
50 ) \
|
Chris@16
|
51 /**/
|
Chris@16
|
52
|
Chris@16
|
53 template<typename F>
|
Chris@16
|
54 struct function_name
|
Chris@16
|
55 {
|
Chris@16
|
56 BOOST_PP_REPEAT(
|
Chris@16
|
57 BOOST_MPL_LIMIT_METAFUNCTION_ARITY
|
Chris@16
|
58 , BOOST_DETAIL_default_arg
|
Chris@16
|
59 , ~
|
Chris@16
|
60 )
|
Chris@16
|
61
|
Chris@16
|
62 template<typename Signature>
|
Chris@16
|
63 struct result {};
|
Chris@16
|
64
|
Chris@16
|
65 #define BOOST_DETAIL_function_result(r, _, n) \
|
Chris@16
|
66 template<typename This BOOST_PP_ENUM_TRAILING_PARAMS(n, typename A)> \
|
Chris@16
|
67 struct result<This(BOOST_PP_ENUM_PARAMS(n, A))> \
|
Chris@16
|
68 { \
|
Chris@16
|
69 BOOST_PP_REPEAT(n, BOOST_DETAIL_function_arg, ~) \
|
Chris@16
|
70 typedef \
|
Chris@16
|
71 typename BOOST_PP_CAT(mpl::apply, BOOST_MPL_LIMIT_METAFUNCTION_ARITY)<\
|
Chris@16
|
72 F \
|
Chris@16
|
73 BOOST_PP_ENUM_TRAILING_PARAMS( \
|
Chris@16
|
74 BOOST_MPL_LIMIT_METAFUNCTION_ARITY \
|
Chris@16
|
75 , arg \
|
Chris@16
|
76 ) \
|
Chris@16
|
77 >::type \
|
Chris@16
|
78 impl; \
|
Chris@16
|
79 typedef typename impl::result_type type; \
|
Chris@16
|
80 }; \
|
Chris@16
|
81 /**/
|
Chris@16
|
82
|
Chris@16
|
83 BOOST_PP_SEQ_FOR_EACH(BOOST_DETAIL_function_result, _, args)
|
Chris@16
|
84
|
Chris@16
|
85 # define arg_type(r, _, i, is_const) \
|
Chris@16
|
86 BOOST_PP_COMMA_IF(i) BOOST_PP_CAT(A, i) BOOST_PP_CAT(const_if, is_const) &
|
Chris@16
|
87
|
Chris@16
|
88 # define result_(r, n, constness) \
|
Chris@16
|
89 typename result< \
|
Chris@16
|
90 function_name( \
|
Chris@16
|
91 BOOST_PP_SEQ_FOR_EACH_I_R(r, arg_type, ~, constness) \
|
Chris@16
|
92 ) \
|
Chris@16
|
93 > \
|
Chris@16
|
94 /**/
|
Chris@16
|
95
|
Chris@16
|
96 # define param(r, _, i, is_const) BOOST_PP_COMMA_IF(i) \
|
Chris@16
|
97 BOOST_PP_CAT(A, i) BOOST_PP_CAT(const_if, is_const) & BOOST_PP_CAT(x, i)
|
Chris@16
|
98
|
Chris@16
|
99 # define param_list(r, n, constness) \
|
Chris@16
|
100 BOOST_PP_SEQ_FOR_EACH_I_R(r, param, ~, constness)
|
Chris@16
|
101
|
Chris@16
|
102 # define call_operator(r, constness) \
|
Chris@16
|
103 template<BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(constness), typename A)> \
|
Chris@16
|
104 result_(r, BOOST_PP_SEQ_SIZE(constness), constness)::type \
|
Chris@16
|
105 operator ()( param_list(r, BOOST_PP_SEQ_SIZE(constness), constness) ) const \
|
Chris@16
|
106 { \
|
Chris@16
|
107 typedef result_(r, BOOST_PP_SEQ_SIZE(constness), constness)::impl impl; \
|
Chris@16
|
108 return impl()(BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(constness), x)); \
|
Chris@16
|
109 } \
|
Chris@16
|
110 /**/
|
Chris@16
|
111
|
Chris@16
|
112 # define const_if0
|
Chris@16
|
113 # define const_if1 const
|
Chris@16
|
114
|
Chris@16
|
115 # define bits(z, n, _) ((0)(1))
|
Chris@16
|
116
|
Chris@16
|
117 # define gen_operator(r, _, n) \
|
Chris@16
|
118 BOOST_PP_SEQ_FOR_EACH_PRODUCT_R( \
|
Chris@16
|
119 r \
|
Chris@16
|
120 , call_operator \
|
Chris@16
|
121 , BOOST_PP_REPEAT(n, bits, ~) \
|
Chris@16
|
122 ) \
|
Chris@16
|
123 /**/
|
Chris@16
|
124
|
Chris@16
|
125 BOOST_PP_SEQ_FOR_EACH(
|
Chris@16
|
126 gen_operator
|
Chris@16
|
127 , ~
|
Chris@16
|
128 , args
|
Chris@16
|
129 )
|
Chris@16
|
130
|
Chris@16
|
131 # undef bits
|
Chris@16
|
132 # undef const_if1
|
Chris@16
|
133 # undef const_if0
|
Chris@16
|
134 # undef call_operator
|
Chris@16
|
135 # undef param_list
|
Chris@16
|
136 # undef param
|
Chris@16
|
137 # undef result_
|
Chris@16
|
138 # undef default_
|
Chris@16
|
139 # undef arg_type
|
Chris@16
|
140 # undef gen_operator
|
Chris@16
|
141 # undef function_name
|
Chris@16
|
142
|
Chris@16
|
143 # undef args
|
Chris@16
|
144 };
|
Chris@16
|
145
|
Chris@16
|
146 }} // namespace boost::detail
|
Chris@16
|
147
|
Chris@16
|
148 //#endif // BOOST_DETAIL_FUNCTION_N_DWA2006514_HPP
|