1 /*
2   Author: Frank Mori Hess <fmhess@users.sourceforge.net>
3   Begin: 2007-01-23
4 */
5 // Copyright Frank Mori Hess 2007-2008
6 // Use, modification and
7 // distribution is subject to the Boost Software License, Version
8 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt)
10 
11 #ifndef BOOST_SIGNALS2_SIGNALS_COMMON_MACROS_HPP
12 #define BOOST_SIGNALS2_SIGNALS_COMMON_MACROS_HPP
13 
14 #include <boost/config.hpp>
15 
16 #ifdef BOOST_NO_CXX11_VARIADIC_TEMPLATES
17 
18 #ifndef BOOST_SIGNALS2_MAX_ARGS
19 #define BOOST_SIGNALS2_MAX_ARGS 9
20 #endif
21 
22 // signaln
23 #define BOOST_SIGNALS2_SIGNAL_CLASS_NAME(arity) BOOST_PP_CAT(signal, arity)
24 // weak_signaln
25 #define BOOST_SIGNALS2_WEAK_SIGNAL_CLASS_NAME(arity) BOOST_PP_CAT(weak_, BOOST_SIGNALS2_SIGNAL_CLASS_NAME(arity))
26 // signaln_impl
27 #define BOOST_SIGNALS2_SIGNAL_IMPL_CLASS_NAME(arity) BOOST_PP_CAT(BOOST_SIGNALS2_SIGNAL_CLASS_NAME(arity), _impl)
28 // argn
29 #define BOOST_SIGNALS2_SIGNATURE_ARG_NAME(z, n, data) BOOST_PP_CAT(arg, BOOST_PP_INC(n))
30 // Tn argn
31 #define BOOST_SIGNALS2_SIGNATURE_FULL_ARG(z, n, data) \
32   BOOST_PP_CAT(T, BOOST_PP_INC(n)) BOOST_SIGNALS2_SIGNATURE_ARG_NAME(~, n, ~)
33 // T1 arg1, T2 arg2, ..., Tn argn
34 #define BOOST_SIGNALS2_SIGNATURE_FULL_ARGS(arity) \
35   BOOST_PP_ENUM(arity, BOOST_SIGNALS2_SIGNATURE_FULL_ARG, ~)
36 // arg1, arg2, ..., argn
37 #define BOOST_SIGNALS2_SIGNATURE_ARG_NAMES(arity) BOOST_PP_ENUM(arity, BOOST_SIGNALS2_SIGNATURE_ARG_NAME, ~)
38 // T1, T2, ..., TN
39 #define BOOST_SIGNALS2_ARGS_TEMPLATE_INSTANTIATION(arity) \
40   BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(arity), T)
41 // R (T1, T2, ..., TN)
42 #define BOOST_SIGNALS2_SIGNATURE_FUNCTION_TYPE(arity) \
43   R ( BOOST_SIGNALS2_ARGS_TEMPLATE_INSTANTIATION(arity) )
44 // typename prefixR, typename prefixT1, typename prefixT2, ..., typename prefixTN
45 #define BOOST_SIGNALS2_PREFIXED_SIGNATURE_TEMPLATE_DECL(arity, prefix) \
46   typename BOOST_PP_CAT(prefix, R) BOOST_PP_COMMA_IF(arity) \
47   BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(arity), typename BOOST_PP_CAT(prefix, T))
48 // typename R, typename T1, typename T2, ..., typename TN
49 #define BOOST_SIGNALS2_SIGNATURE_TEMPLATE_DECL(arity) \
50   typename R BOOST_PP_COMMA_IF(arity) \
51   BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(arity), typename T)
52 // typename prefixT1, typename prefixT2, ..., typename prefixTN
53 #define BOOST_SIGNALS2_PREFIXED_ARGS_TEMPLATE_DECL(arity, prefix) \
54   BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(arity), typename BOOST_PP_CAT(prefix, T))
55 // typename T1, typename T2, ..., typename TN
56 #define BOOST_SIGNALS2_ARGS_TEMPLATE_DECL(arity) \
57   BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(arity), typename T)
58 // prefixR, prefixT1, prefixT2, ..., prefixTN
59 #define BOOST_SIGNALS2_PREFIXED_SIGNATURE_TEMPLATE_INSTANTIATION(arity, prefix) \
60   BOOST_PP_CAT(prefix, R) BOOST_PP_COMMA_IF(arity) BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(arity), BOOST_PP_CAT(prefix, T))
61 // R, T1, T2, ..., TN
62 #define BOOST_SIGNALS2_SIGNATURE_TEMPLATE_INSTANTIATION(arity) \
63   R BOOST_PP_COMMA_IF(arity) BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(arity), T)
64 // boost::functionN<R, T1, T2, ..., TN>
65 #define BOOST_SIGNALS2_FUNCTION_N_DECL(arity) BOOST_PP_CAT(boost::function, arity)<\
66   BOOST_SIGNALS2_SIGNATURE_TEMPLATE_INSTANTIATION(arity) >
67 // R, const boost::signals2::connection&, T1, T2, ..., TN
68 #define BOOST_SIGNALS2_EXT_SLOT_TEMPLATE_INSTANTIATION(arity) \
69   R, const boost::signals2::connection&  BOOST_PP_COMMA_IF(arity) \
70   BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(arity), T)
71 // boost::functionN<R, const boost::signals2::connection &, T1, T2, ..., TN>
72 #define BOOST_SIGNALS2_EXT_FUNCTION_N_DECL(arity) BOOST_PP_CAT(boost::function, BOOST_PP_INC(arity))<\
73   BOOST_SIGNALS2_EXT_SLOT_TEMPLATE_INSTANTIATION(arity) >
74 // slotN
75 #define BOOST_SIGNALS2_SLOT_CLASS_NAME(arity) BOOST_PP_CAT(slot, arity)
76 // slotN+1<R, const connection &, T1, T2, ..., TN, extended_slot_function_type>
77 #define BOOST_SIGNALS2_EXTENDED_SLOT_TYPE(arity) \
78   BOOST_SIGNALS2_SLOT_CLASS_NAME(BOOST_PP_INC(arity))< \
79   BOOST_SIGNALS2_EXT_SLOT_TEMPLATE_INSTANTIATION(arity), \
80   extended_slot_function_type>
81 // bound_extended_slot_functionN
82 #define BOOST_SIGNALS2_BOUND_EXTENDED_SLOT_FUNCTION_N(arity) BOOST_PP_CAT(bound_extended_slot_function, arity)
83 // bound_extended_slot_function_helperN
84 #define BOOST_SIGNALS2_BOUND_EXTENDED_SLOT_FUNCTION_INVOKER_N(arity) BOOST_PP_CAT(bound_extended_slot_function_invoker, arity)
85 // typename function_traits<Signature>::argn_type
86 #define BOOST_SIGNALS2_SIGNATURE_TO_ARGN_TYPE(z, n, Signature) \
87   BOOST_PP_CAT(BOOST_PP_CAT(typename function_traits<Signature>::arg, BOOST_PP_INC(n)), _type)
88 // typename function_traits<Signature>::result_type,
89 // typename function_traits<Signature>::arg1_type,
90 // typename function_traits<Signature>::arg2_type,
91 // ...,
92 // typename function_traits<Signature>::argn_type
93 #define BOOST_SIGNALS2_PORTABLE_SIGNATURE(arity, Signature) \
94   typename function_traits<Signature>::result_type \
95   BOOST_PP_COMMA_IF(arity) BOOST_PP_ENUM(arity, BOOST_SIGNALS2_SIGNATURE_TO_ARGN_TYPE, Signature)
96 // prefixTn & argn
97 #define BOOST_SIGNALS2_PREFIXED_FULL_REF_ARG(z, n, prefix) \
98   BOOST_PP_CAT(BOOST_PP_CAT(prefix, T), BOOST_PP_INC(n)) & BOOST_SIGNALS2_SIGNATURE_ARG_NAME(~, n, ~)
99 // prefixT1 & arg1, prefixT2 & arg2, ..., prefixTn & argn
100 #define BOOST_SIGNALS2_PREFIXED_FULL_REF_ARGS(arity, prefix) \
101   BOOST_PP_ENUM(arity, BOOST_SIGNALS2_PREFIXED_FULL_REF_ARG, prefix)
102 // Tn & argn
103 #define BOOST_SIGNALS2_FULL_CREF_ARG(z, n, data) \
104   const BOOST_PP_CAT(T, BOOST_PP_INC(n)) & BOOST_SIGNALS2_SIGNATURE_ARG_NAME(~, n, ~)
105 // const T1 & arg1, const T2 & arg2, ..., const Tn & argn
106 #define BOOST_SIGNALS2_FULL_FORWARD_ARGS(arity) \
107   BOOST_PP_ENUM(arity, BOOST_SIGNALS2_FULL_CREF_ARG, ~)
108 #define BOOST_SIGNALS2_FORWARDED_ARGS(arity) \
109   BOOST_SIGNALS2_SIGNATURE_ARG_NAMES(arity)
110 // preprocessed_arg_typeN
111 #define BOOST_SIGNALS2_PREPROCESSED_ARG_N_TYPE_CLASS_NAME(arity) BOOST_PP_CAT(preprocessed_arg_type, arity)
112 
113 // typename R, typename T1, typename T2, ..., typename TN, typename SlotFunction
114 #define BOOST_SIGNALS2_SLOT_TEMPLATE_SPECIALIZATION_DECL(arity) \
115   BOOST_SIGNALS2_SIGNATURE_TEMPLATE_DECL(arity), \
116   typename SlotFunction
117 #define BOOST_SIGNALS2_SLOT_TEMPLATE_SPECIALIZATION
118 
119 // typename R, typename T1, typename T2, ..., typename TN, typename Combiner, ...
120 #define BOOST_SIGNALS2_SIGNAL_TEMPLATE_DECL(arity) \
121   BOOST_SIGNALS2_SIGNATURE_TEMPLATE_DECL(arity), \
122   typename Combiner, \
123   typename Group, \
124   typename GroupCompare, \
125   typename SlotFunction, \
126   typename ExtendedSlotFunction, \
127   typename Mutex
128 // typename R, typename T1, typename T2, ..., typename TN, typename Combiner = optional_last_value<R>, ...
129 #define BOOST_SIGNALS2_SIGNAL_TEMPLATE_DEFAULTED_DECL(arity) \
130   BOOST_SIGNALS2_SIGNATURE_TEMPLATE_DECL(arity), \
131   typename Combiner = optional_last_value<R>, \
132   typename Group = int, \
133   typename GroupCompare = std::less<Group>, \
134   typename SlotFunction = BOOST_SIGNALS2_FUNCTION_N_DECL(arity), \
135   typename ExtendedSlotFunction = BOOST_SIGNALS2_EXT_FUNCTION_N_DECL(arity), \
136   typename Mutex = signals2::mutex
137 #define BOOST_SIGNALS2_SIGNAL_TEMPLATE_SPECIALIZATION_DECL(arity) BOOST_SIGNALS2_SIGNAL_TEMPLATE_DECL(arity)
138 #define BOOST_SIGNALS2_SIGNAL_TEMPLATE_SPECIALIZATION
139 
140 #define BOOST_SIGNALS2_STD_FUNCTIONAL_BASE std_functional_base
141 
142 #define BOOST_SIGNALS2_PP_COMMA_IF(arity) BOOST_PP_COMMA_IF(arity)
143 
144 #else // BOOST_NO_CXX11_VARIADIC_TEMPLATES
145 
146 #define BOOST_SIGNALS2_SIGNAL_CLASS_NAME(arity) signal
147 #define BOOST_SIGNALS2_WEAK_SIGNAL_CLASS_NAME(arity) weak_signal
148 #define BOOST_SIGNALS2_SIGNAL_IMPL_CLASS_NAME(arity) signal_impl
149 #define BOOST_SIGNALS2_SIGNATURE_TEMPLATE_DECL(arity) typename Signature
150 #define BOOST_SIGNALS2_ARGS_TEMPLATE_INSTANTIATION(arity) Args...
151 #define BOOST_SIGNALS2_SIGNATURE_TEMPLATE_INSTANTIATION(arity) R (Args...)
152 #define BOOST_SIGNALS2_SIGNATURE_FUNCTION_TYPE(arity) R (Args...)
153 #define BOOST_SIGNALS2_ARGS_TEMPLATE_DECL(arity) typename ... Args
154 #define BOOST_SIGNALS2_FULL_FORWARD_ARGS(arity) Args && ... args
155 #define BOOST_SIGNALS2_FORWARDED_ARGS(arity) std::forward<Args>(args)...
156 #define BOOST_SIGNALS2_SLOT_CLASS_NAME(arity) slot
157 #define BOOST_SIGNALS2_EXTENDED_SLOT_TYPE(arity) slot<R (const connection &, Args...), extended_slot_function_type>
158 #define BOOST_SIGNALS2_BOUND_EXTENDED_SLOT_FUNCTION_N(arity) bound_extended_slot_function
159 #define BOOST_SIGNALS2_BOUND_EXTENDED_SLOT_FUNCTION_INVOKER_N(arity) bound_extended_slot_function_invoker
160 #define BOOST_SIGNALS2_FUNCTION_N_DECL(arity) boost::function<Signature>
161 #define BOOST_SIGNALS2_PREFIXED_SIGNATURE_TEMPLATE_DECL(arity, prefix) typename prefixSignature
162 #define BOOST_SIGNALS2_PREFIXED_SIGNATURE_TEMPLATE_INSTANTIATION(arity, prefix) prefixSignature
163 #define BOOST_SIGNALS2_SIGNATURE_FULL_ARGS(arity) Args ... args
164 #define BOOST_SIGNALS2_SIGNATURE_ARG_NAMES(arity) args...
165 #define BOOST_SIGNALS2_PORTABLE_SIGNATURE(arity, Signature) Signature
166 
167 #define BOOST_SIGNALS2_SLOT_TEMPLATE_SPECIALIZATION_DECL(arity) \
168   typename SlotFunction, \
169   typename R, \
170   typename ... Args
171 #define BOOST_SIGNALS2_SLOT_TEMPLATE_SPECIALIZATION \
172   <R (Args...), SlotFunction>
173 
174 #define BOOST_SIGNALS2_SIGNAL_TEMPLATE_DECL(arity) \
175   typename Signature, \
176   typename Combiner, \
177   typename Group, \
178   typename GroupCompare, \
179   typename SlotFunction, \
180   typename ExtendedSlotFunction, \
181   typename Mutex
182 #define BOOST_SIGNALS2_SIGNAL_TEMPLATE_DEFAULTED_DECL(arity) \
183   typename Signature, \
184   typename Combiner = optional_last_value<typename boost::function_traits<Signature>::result_type>, \
185   typename Group = int, \
186   typename GroupCompare = std::less<Group>, \
187   typename SlotFunction = boost::function<Signature>, \
188   typename ExtendedSlotFunction = typename detail::variadic_extended_signature<Signature>::function_type, \
189   typename Mutex = signals2::mutex
190 #define BOOST_SIGNALS2_SIGNAL_TEMPLATE_SPECIALIZATION_DECL(arity) \
191   typename Combiner, \
192   typename Group, \
193   typename GroupCompare, \
194   typename SlotFunction, \
195   typename ExtendedSlotFunction, \
196   typename Mutex, \
197   typename R, \
198   typename ... Args
199 #define BOOST_SIGNALS2_SIGNAL_TEMPLATE_SPECIALIZATION <\
200   R (Args...), \
201   Combiner, \
202   Group, \
203   GroupCompare, \
204   SlotFunction, \
205   ExtendedSlotFunction, \
206   Mutex>
207 
208 #define BOOST_SIGNALS2_STD_FUNCTIONAL_BASE \
209   std_functional_base<Args...>
210 
211 #define BOOST_SIGNALS2_PP_COMMA_IF(arity) ,
212 
213 #endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES
214 
215 #endif // BOOST_SIGNALS2_SIGNALS_COMMON_MACROS_HPP
216