123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- /*==============================================================================
- Copyright (c) 2005-2010 Joel de Guzman
- Copyright (c) 2010 Thomas Heller
- Copyright (c) 2015 John Fletcher
- Distributed under the Boost Software License, Version 1.0. (See accompanying
- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- ==============================================================================*/
- #ifndef BOOST_PHOENIX_FUNCTION_ADAPT_FUNCTION_HPP
- #define BOOST_PHOENIX_FUNCTION_ADAPT_FUNCTION_HPP
- #include <boost/phoenix/core/limits.hpp>
- #include <boost/phoenix/core/detail/function_eval.hpp>
- #include <boost/preprocessor/repetition/repeat.hpp>
- #define BOOST_PHOENIX_ADAPT_FUNCTION_NULLARY(RESULT, NAME, FUNC) \
- namespace detail0 \
- { \
- struct BOOST_PP_CAT(NAME, _impl_nullary) \
- { \
- typedef RESULT result_type; \
- \
- result_type \
- operator()() const \
- { \
- return FUNC(); \
- } \
- }; \
- } \
- \
- inline \
- boost::phoenix::detail::expression::function_eval< \
- detail0:: BOOST_PP_CAT(NAME, _impl_nullary) \
- >::type const \
- NAME() \
- { \
- return boost::phoenix::detail::expression:: \
- function_eval<detail0:: BOOST_PP_CAT(NAME, _impl_nullary)> \
- ::make(detail0:: BOOST_PP_CAT(NAME, _impl_nullary)()); \
- } \
- /**/
- #define BOOST_PHOENIX_ADAPT_FUNCTION(RESULT, NAME, FUNC, N) \
- namespace detail1 \
- { \
- struct BOOST_PP_CAT(BOOST_PP_CAT(NAME, _impl_), N) \
- { \
- template <typename Sig> \
- struct result; \
- \
- template <typename This, BOOST_PHOENIX_typename_A(N)> \
- struct result<This(BOOST_PHOENIX_A(N))> \
- {typedef RESULT type;}; \
- \
- template <BOOST_PHOENIX_typename_A(N)> \
- RESULT \
- operator()(BOOST_PHOENIX_A_ref_a(N)) const \
- { \
- return FUNC(BOOST_PHOENIX_a(N)); \
- } \
- }; \
- } \
- \
- template <BOOST_PHOENIX_typename_A(N)> \
- inline \
- typename \
- boost::phoenix::detail::expression::function_eval< \
- detail1:: BOOST_PP_CAT(BOOST_PP_CAT(NAME, _impl_), N) \
- , BOOST_PHOENIX_A(N)>::type const \
- NAME(BOOST_PHOENIX_A_const_ref_a(N)) \
- { \
- return boost::phoenix::detail::expression:: \
- function_eval< \
- detail1:: BOOST_PP_CAT(BOOST_PP_CAT(NAME, _impl_), N) \
- , BOOST_PHOENIX_A(N) \
- >::make( \
- detail1:: BOOST_PP_CAT(BOOST_PP_CAT(NAME, _impl_), N)() \
- , BOOST_PHOENIX_a(N) \
- ); \
- } \
- /**/
- #define BOOST_PHOENIX_ADAPT_FUNCTION_VARARG(RESULT, NAME, FUNC) \
- BOOST_PHOENIX_ADAPT_FUNCTION_NULLARY(NAME, FUNC) \
- BOOST_PP_REPEAT_FROM_TO( \
- 1 \
- , BOOST_PHOENIX_LIMIT \
- , BOOST_PHOENIX_ADAPT_FUNCTION_VARARG_R \
- , (RESULT, NAME, FUNC) \
- ) \
- /**/
- #define BOOST_PHOENIX_ADAPT_FUNCTION_VARARG_R(Z, N, D) \
- BOOST_PHOENIX_ADAPT_FUNCTION( \
- BOOST_PP_TUPLE_ELEM(3, 0, D) \
- , BOOST_PP_TUPLE_ELEM(3, 1, D) \
- , BOOST_PP_TUPLE_ELEM(3, 2, D) \
- , N \
- ) \
- /**/
- #endif
|