1// Copyright Daniel Wallin 2006.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at
4// http://www.boost.org/LICENSE_1_0.txt)
5
6#ifndef BOOST_PARAMETER_AUX_PREPROCESSOR_IMPL_FUNCTION_NAME_HPP
7#define BOOST_PARAMETER_AUX_PREPROCESSOR_IMPL_FUNCTION_NAME_HPP
8
9#define BOOST_PARAMETER_MEMBER_FUNCTION_CHECK_STATIC_static ()
10/**/
11
12#include <boost/parameter/aux_/preprocessor/is_nullary.hpp>
13#include <boost/preprocessor/cat.hpp>
14
15#define BOOST_PARAMETER_MEMBER_FUNCTION_IS_STATIC(name) \
16 BOOST_PARAMETER_IS_NULLARY( \
17 BOOST_PP_CAT(BOOST_PARAMETER_MEMBER_FUNCTION_CHECK_STATIC_, name) \
18 )
19/**/
20
21#include <boost/preprocessor/seq/seq.hpp>
22#include <boost/config.hpp>
23
24#if defined(BOOST_MSVC)
25
26// Workaround for MSVC preprocessor.
27//
28// When stripping static from "static f", msvc will produce " f". The leading
29// whitespace doesn't go away when pasting the token with something else, so
30// this thing is a hack to strip the whitespace.
31#define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_static (
32/**/
33
34#define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_AUX(name) \
35 BOOST_PP_CAT(BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_, name))
36/**/
37
38#define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC(name) \
39 BOOST_PP_SEQ_HEAD( \
40 BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_AUX(name) \
41 )
42/**/
43
44#else
45
46#define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_static
47/**/
48
49#define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC(name) \
50 BOOST_PP_CAT(BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_, name)
51/**/
52
53#endif // MSVC workarounds needed
54
55#include <boost/preprocessor/control/expr_if.hpp>
56
57#define BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(name) \
58 BOOST_PP_EXPR_IF( \
59 BOOST_PARAMETER_MEMBER_FUNCTION_IS_STATIC(name), static \
60 )
61/**/
62
63#include <boost/preprocessor/control/if.hpp>
64#include <boost/preprocessor/tuple/eat.hpp>
65
66#define BOOST_PARAMETER_MEMBER_FUNCTION_NAME(name) \
67 BOOST_PP_IF( \
68 BOOST_PARAMETER_MEMBER_FUNCTION_IS_STATIC(name) \
69 , BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC \
70 , name BOOST_PP_TUPLE_EAT(1) \
71 )(name)
72/**/
73
74// Produces a name for a parameter specification for the function named base.
75#define BOOST_PARAMETER_FUNCTION_SPECIFICATION_NAME(base, is_const) \
76 BOOST_PP_CAT( \
77 BOOST_PP_CAT( \
78 BOOST_PP_IF( \
79 is_const \
80 , boost_param_parameters_const_ \
81 , boost_param_parameters_ \
82 ) \
83 , __LINE__ \
84 ) \
85 , BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base) \
86 )
87/**/
88
89// Produces a name for a result type metafunction for the no-spec function
90// named base.
91#define BOOST_PARAMETER_NO_SPEC_FUNCTION_RESULT_NAME(base, is_const) \
92 BOOST_PP_CAT( \
93 BOOST_PP_CAT( \
94 BOOST_PP_IF( \
95 is_const \
96 , boost_param_no_spec_result_const_ \
97 , boost_param_no_spec_result_ \
98 ) \
99 , __LINE__ \
100 ) \
101 , BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base) \
102 )
103/**/
104
105// Produces a name for a result type metafunction for the function named base.
106#define BOOST_PARAMETER_FUNCTION_RESULT_NAME(base, is_const) \
107 BOOST_PP_CAT( \
108 BOOST_PP_CAT( \
109 BOOST_PP_IF( \
110 is_const \
111 , boost_param_result_const_ \
112 , boost_param_result_ \
113 ) \
114 , __LINE__ \
115 ) \
116 , BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base) \
117 )
118/**/
119
120// Produces a name for the implementation function to which the no-spec
121// function named base forwards its result type and argument pack.
122#define BOOST_PARAMETER_NO_SPEC_FUNCTION_IMPL_NAME(base, is_const) \
123 BOOST_PP_CAT( \
124 BOOST_PP_CAT( \
125 BOOST_PP_IF( \
126 is_const \
127 , boost_param_no_spec_impl_const \
128 , boost_param_no_spec_impl \
129 ) \
130 , __LINE__ \
131 ) \
132 , BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base) \
133 )
134/**/
135
136// Can't do boost_param_impl_ ## basee
137// because base might start with an underscore.
138// daniel: what? how is that relevant? the reason for using CAT()
139// is to make sure base is expanded. i'm not sure we need to here,
140// but it's more stable to do it.
141#define BOOST_PARAMETER_FUNCTION_IMPL_NAME(base, is_const) \
142 BOOST_PP_CAT( \
143 BOOST_PP_CAT( \
144 BOOST_PP_IF(is_const, boost_param_impl_const, boost_param_impl) \
145 , __LINE__ \
146 ) \
147 , BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base) \
148 )
149/**/
150
151#endif // include guard
152
153

source code of boost/libs/parameter/include/boost/parameter/aux_/preprocessor/impl/function_name.hpp