Chris@16
|
1 /*==============================================================================
|
Chris@16
|
2 Copyright (c) 2005-2010 Joel de Guzman
|
Chris@16
|
3 Copyright (c) 2010 Thomas Heller
|
Chris@16
|
4
|
Chris@16
|
5 Distributed under the Boost Software License, Version 1.0. (See accompanying
|
Chris@16
|
6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
7 ==============================================================================*/
|
Chris@16
|
8 #ifndef BOOST_PHOENIX_FUNCTION_ADAPT_FUNCTION_HPP
|
Chris@16
|
9 #define BOOST_PHOENIX_FUNCTION_ADAPT_FUNCTION_HPP
|
Chris@16
|
10
|
Chris@16
|
11 #include <boost/phoenix/core/limits.hpp>
|
Chris@16
|
12 #include <boost/phoenix/core/detail/function_eval.hpp>
|
Chris@16
|
13 #include <boost/preprocessor/repetition/repeat.hpp>
|
Chris@16
|
14
|
Chris@16
|
15 #define BOOST_PHOENIX_ADAPT_FUNCTION_NULLARY(RESULT, NAME, FUNC) \
|
Chris@101
|
16 namespace detail0 \
|
Chris@16
|
17 { \
|
Chris@16
|
18 struct BOOST_PP_CAT(NAME, _impl_nullary) \
|
Chris@16
|
19 { \
|
Chris@16
|
20 typedef RESULT result_type; \
|
Chris@16
|
21 \
|
Chris@16
|
22 result_type \
|
Chris@16
|
23 operator()() const \
|
Chris@16
|
24 { \
|
Chris@16
|
25 return FUNC(); \
|
Chris@16
|
26 } \
|
Chris@16
|
27 }; \
|
Chris@16
|
28 } \
|
Chris@16
|
29 \
|
Chris@101
|
30 inline \
|
Chris@16
|
31 boost::phoenix::detail::expression::function_eval< \
|
Chris@101
|
32 detail0:: BOOST_PP_CAT(NAME, _impl_nullary) \
|
Chris@16
|
33 >::type const \
|
Chris@101
|
34 NAME() \
|
Chris@16
|
35 { \
|
Chris@16
|
36 return boost::phoenix::detail::expression:: \
|
Chris@101
|
37 function_eval<detail0:: BOOST_PP_CAT(NAME, _impl_nullary)> \
|
Chris@101
|
38 ::make(detail0:: BOOST_PP_CAT(NAME, _impl_nullary)()); \
|
Chris@16
|
39 } \
|
Chris@16
|
40 /**/
|
Chris@16
|
41
|
Chris@16
|
42 #define BOOST_PHOENIX_ADAPT_FUNCTION(RESULT, NAME, FUNC, N) \
|
Chris@101
|
43 namespace detail1 \
|
Chris@16
|
44 { \
|
Chris@16
|
45 struct BOOST_PP_CAT(BOOST_PP_CAT(NAME, _impl_), N) \
|
Chris@16
|
46 { \
|
Chris@16
|
47 template <typename Sig> \
|
Chris@16
|
48 struct result; \
|
Chris@16
|
49 \
|
Chris@16
|
50 template <typename This, BOOST_PHOENIX_typename_A(N)> \
|
Chris@16
|
51 struct result<This(BOOST_PHOENIX_A(N))> \
|
Chris@101
|
52 {typedef RESULT type;}; \
|
Chris@16
|
53 \
|
Chris@16
|
54 template <BOOST_PHOENIX_typename_A(N)> \
|
Chris@16
|
55 RESULT \
|
Chris@16
|
56 operator()(BOOST_PHOENIX_A_ref_a(N)) const \
|
Chris@16
|
57 { \
|
Chris@16
|
58 return FUNC(BOOST_PHOENIX_a(N)); \
|
Chris@16
|
59 } \
|
Chris@16
|
60 }; \
|
Chris@16
|
61 } \
|
Chris@16
|
62 \
|
Chris@16
|
63 template <BOOST_PHOENIX_typename_A(N)> \
|
Chris@101
|
64 inline \
|
Chris@16
|
65 typename \
|
Chris@16
|
66 boost::phoenix::detail::expression::function_eval< \
|
Chris@101
|
67 detail1:: BOOST_PP_CAT(BOOST_PP_CAT(NAME, _impl_), N) \
|
Chris@16
|
68 , BOOST_PHOENIX_A(N)>::type const \
|
Chris@101
|
69 NAME(BOOST_PHOENIX_A_const_ref_a(N)) \
|
Chris@16
|
70 { \
|
Chris@16
|
71 return boost::phoenix::detail::expression:: \
|
Chris@16
|
72 function_eval< \
|
Chris@101
|
73 detail1:: BOOST_PP_CAT(BOOST_PP_CAT(NAME, _impl_), N) \
|
Chris@16
|
74 , BOOST_PHOENIX_A(N) \
|
Chris@16
|
75 >::make( \
|
Chris@101
|
76 detail1:: BOOST_PP_CAT(BOOST_PP_CAT(NAME, _impl_), N)() \
|
Chris@16
|
77 , BOOST_PHOENIX_a(N) \
|
Chris@16
|
78 ); \
|
Chris@16
|
79 } \
|
Chris@16
|
80 /**/
|
Chris@16
|
81
|
Chris@16
|
82 #define BOOST_PHOENIX_ADAPT_FUNCTION_VARARG(RESULT, NAME, FUNC) \
|
Chris@16
|
83 BOOST_PHOENIX_ADAPT_FUNCTION_NULLARY(NAME, FUNC) \
|
Chris@16
|
84 BOOST_PP_REPEAT_FROM_TO( \
|
Chris@16
|
85 1 \
|
Chris@16
|
86 , BOOST_PHOENIX_LIMIT \
|
Chris@16
|
87 , BOOST_PHOENIX_ADAPT_FUNCTION_VARARG_R \
|
Chris@16
|
88 , (RESULT, NAME, FUNC) \
|
Chris@16
|
89 ) \
|
Chris@16
|
90 /**/
|
Chris@16
|
91
|
Chris@16
|
92 #define BOOST_PHOENIX_ADAPT_FUNCTION_VARARG_R(Z, N, D) \
|
Chris@16
|
93 BOOST_PHOENIX_ADAPT_FUNCTION( \
|
Chris@16
|
94 BOOST_PP_TUPLE_ELEM(3, 0, D) \
|
Chris@16
|
95 , BOOST_PP_TUPLE_ELEM(3, 1, D) \
|
Chris@16
|
96 , BOOST_PP_TUPLE_ELEM(3, 2, D) \
|
Chris@16
|
97 , N \
|
Chris@16
|
98 ) \
|
Chris@16
|
99 /**/
|
Chris@16
|
100
|
Chris@16
|
101 #endif
|