// Copyright Daniel Wallin 2006. // 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_PARAMETER_AUX_PREPROCESSOR_IMPL_FUNCTION_NAME_HPP #define BOOST_PARAMETER_AUX_PREPROCESSOR_IMPL_FUNCTION_NAME_HPP #define BOOST_PARAMETER_MEMBER_FUNCTION_CHECK_STATIC_static () /**/ #include #include #define BOOST_PARAMETER_MEMBER_FUNCTION_IS_STATIC(name) \ BOOST_PARAMETER_IS_NULLARY( \ BOOST_PP_CAT(BOOST_PARAMETER_MEMBER_FUNCTION_CHECK_STATIC_, name) \ ) /**/ #include #include #if defined(BOOST_MSVC) // Workaround for MSVC preprocessor. // // When stripping static from "static f", msvc will produce " f". The leading // whitespace doesn't go away when pasting the token with something else, so // this thing is a hack to strip the whitespace. #define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_static ( /**/ #define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_AUX(name) \ BOOST_PP_CAT(BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_, name)) /**/ #define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC(name) \ BOOST_PP_SEQ_HEAD( \ BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_AUX(name) \ ) /**/ #else #define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_static /**/ #define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC(name) \ BOOST_PP_CAT(BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_, name) /**/ #endif // MSVC workarounds needed #include #define BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(name) \ BOOST_PP_EXPR_IF( \ BOOST_PARAMETER_MEMBER_FUNCTION_IS_STATIC(name), static \ ) /**/ #include #include #define BOOST_PARAMETER_MEMBER_FUNCTION_NAME(name) \ BOOST_PP_IF( \ BOOST_PARAMETER_MEMBER_FUNCTION_IS_STATIC(name) \ , BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC \ , name BOOST_PP_TUPLE_EAT(1) \ )(name) /**/ // Produces a name for a parameter specification for the function named base. #define BOOST_PARAMETER_FUNCTION_SPECIFICATION_NAME(base, is_const) \ BOOST_PP_CAT( \ BOOST_PP_CAT( \ BOOST_PP_IF( \ is_const \ , boost_param_parameters_const_ \ , boost_param_parameters_ \ ) \ , __LINE__ \ ) \ , BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base) \ ) /**/ // Produces a name for a result type metafunction for the no-spec function // named base. #define BOOST_PARAMETER_NO_SPEC_FUNCTION_RESULT_NAME(base, is_const) \ BOOST_PP_CAT( \ BOOST_PP_CAT( \ BOOST_PP_IF( \ is_const \ , boost_param_no_spec_result_const_ \ , boost_param_no_spec_result_ \ ) \ , __LINE__ \ ) \ , BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base) \ ) /**/ // Produces a name for a result type metafunction for the function named base. #define BOOST_PARAMETER_FUNCTION_RESULT_NAME(base, is_const) \ BOOST_PP_CAT( \ BOOST_PP_CAT( \ BOOST_PP_IF( \ is_const \ , boost_param_result_const_ \ , boost_param_result_ \ ) \ , __LINE__ \ ) \ , BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base) \ ) /**/ // Produces a name for the implementation function to which the no-spec // function named base forwards its result type and argument pack. #define BOOST_PARAMETER_NO_SPEC_FUNCTION_IMPL_NAME(base, is_const) \ BOOST_PP_CAT( \ BOOST_PP_CAT( \ BOOST_PP_IF( \ is_const \ , boost_param_no_spec_impl_const \ , boost_param_no_spec_impl \ ) \ , __LINE__ \ ) \ , BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base) \ ) /**/ // Can't do boost_param_impl_ ## basee // because base might start with an underscore. // daniel: what? how is that relevant? the reason for using CAT() // is to make sure base is expanded. i'm not sure we need to here, // but it's more stable to do it. #define BOOST_PARAMETER_FUNCTION_IMPL_NAME(base, is_const) \ BOOST_PP_CAT( \ BOOST_PP_CAT( \ BOOST_PP_IF(is_const, boost_param_impl_const, boost_param_impl) \ , __LINE__ \ ) \ , BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base) \ ) /**/ #endif // include guard