Chris@16: /* Chris@16: Author: Frank Mori Hess Chris@16: Begin: 2007-01-23 Chris@16: */ Chris@16: // Copyright Frank Mori Hess 2007-2008 Chris@16: // Use, modification and Chris@16: // distribution is subject to the Boost Software License, Version Chris@16: // 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_SIGNALS2_SIGNALS_COMMON_MACROS_HPP Chris@16: #define BOOST_SIGNALS2_SIGNALS_COMMON_MACROS_HPP Chris@16: Chris@16: #include Chris@16: Chris@16: #ifdef BOOST_NO_CXX11_VARIADIC_TEMPLATES Chris@16: Chris@16: #ifndef BOOST_SIGNALS2_MAX_ARGS Chris@16: #define BOOST_SIGNALS2_MAX_ARGS 9 Chris@16: #endif Chris@16: Chris@16: // signaln Chris@16: #define BOOST_SIGNALS2_SIGNAL_CLASS_NAME(arity) BOOST_PP_CAT(signal, arity) Chris@16: // weak_signaln Chris@16: #define BOOST_SIGNALS2_WEAK_SIGNAL_CLASS_NAME(arity) BOOST_PP_CAT(weak_, BOOST_SIGNALS2_SIGNAL_CLASS_NAME(arity)) Chris@16: // signaln_impl Chris@16: #define BOOST_SIGNALS2_SIGNAL_IMPL_CLASS_NAME(arity) BOOST_PP_CAT(BOOST_SIGNALS2_SIGNAL_CLASS_NAME(arity), _impl) Chris@16: // argn Chris@16: #define BOOST_SIGNALS2_SIGNATURE_ARG_NAME(z, n, data) BOOST_PP_CAT(arg, BOOST_PP_INC(n)) Chris@16: // Tn argn Chris@16: #define BOOST_SIGNALS2_SIGNATURE_FULL_ARG(z, n, data) \ Chris@16: BOOST_PP_CAT(T, BOOST_PP_INC(n)) BOOST_SIGNALS2_SIGNATURE_ARG_NAME(~, n, ~) Chris@16: // T1 arg1, T2 arg2, ..., Tn argn Chris@16: #define BOOST_SIGNALS2_SIGNATURE_FULL_ARGS(arity) \ Chris@16: BOOST_PP_ENUM(arity, BOOST_SIGNALS2_SIGNATURE_FULL_ARG, ~) Chris@16: // arg1, arg2, ..., argn Chris@16: #define BOOST_SIGNALS2_SIGNATURE_ARG_NAMES(arity) BOOST_PP_ENUM(arity, BOOST_SIGNALS2_SIGNATURE_ARG_NAME, ~) Chris@16: // T1, T2, ..., TN Chris@16: #define BOOST_SIGNALS2_ARGS_TEMPLATE_INSTANTIATION(arity) \ Chris@16: BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(arity), T) Chris@16: // R (T1, T2, ..., TN) Chris@16: #define BOOST_SIGNALS2_SIGNATURE_FUNCTION_TYPE(arity) \ Chris@16: R ( BOOST_SIGNALS2_ARGS_TEMPLATE_INSTANTIATION(arity) ) Chris@16: // typename prefixR, typename prefixT1, typename prefixT2, ..., typename prefixTN Chris@16: #define BOOST_SIGNALS2_PREFIXED_SIGNATURE_TEMPLATE_DECL(arity, prefix) \ Chris@16: typename BOOST_PP_CAT(prefix, R) BOOST_PP_COMMA_IF(arity) \ Chris@16: BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(arity), typename BOOST_PP_CAT(prefix, T)) Chris@16: // typename R, typename T1, typename T2, ..., typename TN Chris@16: #define BOOST_SIGNALS2_SIGNATURE_TEMPLATE_DECL(arity) \ Chris@16: typename R BOOST_PP_COMMA_IF(arity) \ Chris@16: BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(arity), typename T) Chris@16: // typename prefixT1, typename prefixT2, ..., typename prefixTN Chris@16: #define BOOST_SIGNALS2_PREFIXED_ARGS_TEMPLATE_DECL(arity, prefix) \ Chris@16: BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(arity), typename BOOST_PP_CAT(prefix, T)) Chris@16: // typename T1, typename T2, ..., typename TN Chris@16: #define BOOST_SIGNALS2_ARGS_TEMPLATE_DECL(arity) \ Chris@16: BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(arity), typename T) Chris@16: // prefixR, prefixT1, prefixT2, ..., prefixTN Chris@16: #define BOOST_SIGNALS2_PREFIXED_SIGNATURE_TEMPLATE_INSTANTIATION(arity, prefix) \ Chris@16: BOOST_PP_CAT(prefix, R) BOOST_PP_COMMA_IF(arity) BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(arity), BOOST_PP_CAT(prefix, T)) Chris@16: // R, T1, T2, ..., TN Chris@16: #define BOOST_SIGNALS2_SIGNATURE_TEMPLATE_INSTANTIATION(arity) \ Chris@16: R BOOST_PP_COMMA_IF(arity) BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(arity), T) Chris@16: // boost::functionN Chris@16: #define BOOST_SIGNALS2_FUNCTION_N_DECL(arity) BOOST_PP_CAT(boost::function, arity)<\ Chris@16: BOOST_SIGNALS2_SIGNATURE_TEMPLATE_INSTANTIATION(arity) > Chris@16: // R, const boost::signals2::connection&, T1, T2, ..., TN Chris@16: #define BOOST_SIGNALS2_EXT_SLOT_TEMPLATE_INSTANTIATION(arity) \ Chris@16: R, const boost::signals2::connection& BOOST_PP_COMMA_IF(arity) \ Chris@16: BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(arity), T) Chris@16: // boost::functionN Chris@16: #define BOOST_SIGNALS2_EXT_FUNCTION_N_DECL(arity) BOOST_PP_CAT(boost::function, BOOST_PP_INC(arity))<\ Chris@16: BOOST_SIGNALS2_EXT_SLOT_TEMPLATE_INSTANTIATION(arity) > Chris@16: // slotN Chris@16: #define BOOST_SIGNALS2_SLOT_CLASS_NAME(arity) BOOST_PP_CAT(slot, arity) Chris@16: // slotN+1 Chris@16: #define BOOST_SIGNALS2_EXTENDED_SLOT_TYPE(arity) \ Chris@16: BOOST_SIGNALS2_SLOT_CLASS_NAME(BOOST_PP_INC(arity))< \ Chris@16: BOOST_SIGNALS2_EXT_SLOT_TEMPLATE_INSTANTIATION(arity), \ Chris@16: extended_slot_function_type> Chris@16: // bound_extended_slot_functionN Chris@16: #define BOOST_SIGNALS2_BOUND_EXTENDED_SLOT_FUNCTION_N(arity) BOOST_PP_CAT(bound_extended_slot_function, arity) Chris@16: // bound_extended_slot_function_helperN Chris@16: #define BOOST_SIGNALS2_BOUND_EXTENDED_SLOT_FUNCTION_INVOKER_N(arity) BOOST_PP_CAT(bound_extended_slot_function_invoker, arity) Chris@16: // typename function_traits::argn_type Chris@16: #define BOOST_SIGNALS2_SIGNATURE_TO_ARGN_TYPE(z, n, Signature) \ Chris@16: BOOST_PP_CAT(BOOST_PP_CAT(typename function_traits::arg, BOOST_PP_INC(n)), _type) Chris@16: // typename function_traits::result_type, Chris@16: // typename function_traits::arg1_type, Chris@16: // typename function_traits::arg2_type, Chris@16: // ..., Chris@16: // typename function_traits::argn_type Chris@16: #define BOOST_SIGNALS2_PORTABLE_SIGNATURE(arity, Signature) \ Chris@16: typename function_traits::result_type \ Chris@16: BOOST_PP_COMMA_IF(arity) BOOST_PP_ENUM(arity, BOOST_SIGNALS2_SIGNATURE_TO_ARGN_TYPE, Signature) Chris@16: // prefixTn & argn Chris@16: #define BOOST_SIGNALS2_PREFIXED_FULL_REF_ARG(z, n, prefix) \ Chris@16: BOOST_PP_CAT(BOOST_PP_CAT(prefix, T), BOOST_PP_INC(n)) & BOOST_SIGNALS2_SIGNATURE_ARG_NAME(~, n, ~) Chris@16: // prefixT1 & arg1, prefixT2 & arg2, ..., prefixTn & argn Chris@16: #define BOOST_SIGNALS2_PREFIXED_FULL_REF_ARGS(arity, prefix) \ Chris@16: BOOST_PP_ENUM(arity, BOOST_SIGNALS2_PREFIXED_FULL_REF_ARG, prefix) Chris@16: // Tn & argn Chris@101: #define BOOST_SIGNALS2_FULL_CREF_ARG(z, n, data) \ Chris@101: const BOOST_PP_CAT(T, BOOST_PP_INC(n)) & BOOST_SIGNALS2_SIGNATURE_ARG_NAME(~, n, ~) Chris@101: // const T1 & arg1, const T2 & arg2, ..., const Tn & argn Chris@101: #define BOOST_SIGNALS2_FULL_FORWARD_ARGS(arity) \ Chris@101: BOOST_PP_ENUM(arity, BOOST_SIGNALS2_FULL_CREF_ARG, ~) Chris@101: #define BOOST_SIGNALS2_FORWARDED_ARGS(arity) \ Chris@101: BOOST_SIGNALS2_SIGNATURE_ARG_NAMES(arity) Chris@16: // preprocessed_arg_typeN Chris@16: #define BOOST_SIGNALS2_PREPROCESSED_ARG_N_TYPE_CLASS_NAME(arity) BOOST_PP_CAT(preprocessed_arg_type, arity) Chris@16: Chris@16: // typename R, typename T1, typename T2, ..., typename TN, typename SlotFunction Chris@16: #define BOOST_SIGNALS2_SLOT_TEMPLATE_SPECIALIZATION_DECL(arity) \ Chris@16: BOOST_SIGNALS2_SIGNATURE_TEMPLATE_DECL(arity), \ Chris@16: typename SlotFunction Chris@16: #define BOOST_SIGNALS2_SLOT_TEMPLATE_SPECIALIZATION Chris@16: Chris@16: // typename R, typename T1, typename T2, ..., typename TN, typename Combiner, ... Chris@16: #define BOOST_SIGNALS2_SIGNAL_TEMPLATE_DECL(arity) \ Chris@16: BOOST_SIGNALS2_SIGNATURE_TEMPLATE_DECL(arity), \ Chris@16: typename Combiner, \ Chris@16: typename Group, \ Chris@16: typename GroupCompare, \ Chris@16: typename SlotFunction, \ Chris@16: typename ExtendedSlotFunction, \ Chris@16: typename Mutex Chris@16: // typename R, typename T1, typename T2, ..., typename TN, typename Combiner = optional_last_value, ... Chris@16: #define BOOST_SIGNALS2_SIGNAL_TEMPLATE_DEFAULTED_DECL(arity) \ Chris@16: BOOST_SIGNALS2_SIGNATURE_TEMPLATE_DECL(arity), \ Chris@16: typename Combiner = optional_last_value, \ Chris@16: typename Group = int, \ Chris@16: typename GroupCompare = std::less, \ Chris@16: typename SlotFunction = BOOST_SIGNALS2_FUNCTION_N_DECL(arity), \ Chris@16: typename ExtendedSlotFunction = BOOST_SIGNALS2_EXT_FUNCTION_N_DECL(arity), \ Chris@16: typename Mutex = signals2::mutex Chris@16: #define BOOST_SIGNALS2_SIGNAL_TEMPLATE_SPECIALIZATION_DECL(arity) BOOST_SIGNALS2_SIGNAL_TEMPLATE_DECL(arity) Chris@16: #define BOOST_SIGNALS2_SIGNAL_TEMPLATE_SPECIALIZATION Chris@16: Chris@16: #define BOOST_SIGNALS2_STD_FUNCTIONAL_BASE(result_type) std_functional_base Chris@16: Chris@16: #define BOOST_SIGNALS2_PP_COMMA_IF(arity) BOOST_PP_COMMA_IF(arity) Chris@16: Chris@16: #else // BOOST_NO_CXX11_VARIADIC_TEMPLATES Chris@16: Chris@16: #define BOOST_SIGNALS2_SIGNAL_CLASS_NAME(arity) signal Chris@16: #define BOOST_SIGNALS2_WEAK_SIGNAL_CLASS_NAME(arity) weak_signal Chris@16: #define BOOST_SIGNALS2_SIGNAL_IMPL_CLASS_NAME(arity) signal_impl Chris@16: #define BOOST_SIGNALS2_SIGNATURE_TEMPLATE_DECL(arity) typename Signature Chris@16: #define BOOST_SIGNALS2_ARGS_TEMPLATE_INSTANTIATION(arity) Args... Chris@16: #define BOOST_SIGNALS2_SIGNATURE_TEMPLATE_INSTANTIATION(arity) R (Args...) Chris@16: #define BOOST_SIGNALS2_SIGNATURE_FUNCTION_TYPE(arity) R (Args...) Chris@16: #define BOOST_SIGNALS2_ARGS_TEMPLATE_DECL(arity) typename ... Args Chris@101: #define BOOST_SIGNALS2_FULL_FORWARD_ARGS(arity) Args && ... args Chris@101: #define BOOST_SIGNALS2_FORWARDED_ARGS(arity) std::forward(args)... Chris@16: #define BOOST_SIGNALS2_SLOT_CLASS_NAME(arity) slot Chris@16: #define BOOST_SIGNALS2_EXTENDED_SLOT_TYPE(arity) slot Chris@16: #define BOOST_SIGNALS2_BOUND_EXTENDED_SLOT_FUNCTION_N(arity) bound_extended_slot_function Chris@16: #define BOOST_SIGNALS2_BOUND_EXTENDED_SLOT_FUNCTION_INVOKER_N(arity) bound_extended_slot_function_invoker Chris@16: #define BOOST_SIGNALS2_FUNCTION_N_DECL(arity) boost::function Chris@16: #define BOOST_SIGNALS2_PREFIXED_SIGNATURE_TEMPLATE_DECL(arity, prefix) typename prefixSignature Chris@16: #define BOOST_SIGNALS2_PREFIXED_SIGNATURE_TEMPLATE_INSTANTIATION(arity, prefix) prefixSignature Chris@16: #define BOOST_SIGNALS2_SIGNATURE_FULL_ARGS(arity) Args ... args Chris@16: #define BOOST_SIGNALS2_SIGNATURE_ARG_NAMES(arity) args... Chris@16: #define BOOST_SIGNALS2_PORTABLE_SIGNATURE(arity, Signature) Signature Chris@16: Chris@16: #define BOOST_SIGNALS2_SLOT_TEMPLATE_SPECIALIZATION_DECL(arity) \ Chris@16: typename SlotFunction, \ Chris@16: typename R, \ Chris@16: typename ... Args Chris@16: #define BOOST_SIGNALS2_SLOT_TEMPLATE_SPECIALIZATION \ Chris@16: Chris@16: Chris@16: #define BOOST_SIGNALS2_SIGNAL_TEMPLATE_DECL(arity) \ Chris@16: typename Signature, \ Chris@16: typename Combiner, \ Chris@16: typename Group, \ Chris@16: typename GroupCompare, \ Chris@16: typename SlotFunction, \ Chris@16: typename ExtendedSlotFunction, \ Chris@16: typename Mutex Chris@16: #define BOOST_SIGNALS2_SIGNAL_TEMPLATE_DEFAULTED_DECL(arity) \ Chris@16: typename Signature, \ Chris@16: typename Combiner = optional_last_value::result_type>, \ Chris@16: typename Group = int, \ Chris@16: typename GroupCompare = std::less, \ Chris@16: typename SlotFunction = boost::function, \ Chris@16: typename ExtendedSlotFunction = typename detail::variadic_extended_signature::function_type, \ Chris@16: typename Mutex = signals2::mutex Chris@16: #define BOOST_SIGNALS2_SIGNAL_TEMPLATE_SPECIALIZATION_DECL(arity) \ Chris@16: typename Combiner, \ Chris@16: typename Group, \ Chris@16: typename GroupCompare, \ Chris@16: typename SlotFunction, \ Chris@16: typename ExtendedSlotFunction, \ Chris@16: typename Mutex, \ Chris@16: typename R, \ Chris@16: typename ... Args Chris@16: #define BOOST_SIGNALS2_SIGNAL_TEMPLATE_SPECIALIZATION <\ Chris@16: R (Args...), \ Chris@16: Combiner, \ Chris@16: Group, \ Chris@16: GroupCompare, \ Chris@16: SlotFunction, \ Chris@16: ExtendedSlotFunction, \ Chris@16: Mutex> Chris@16: Chris@16: #define BOOST_SIGNALS2_STD_FUNCTIONAL_BASE(result_type) \ Chris@16: std_functional_base Chris@16: Chris@16: #define BOOST_SIGNALS2_PP_COMMA_IF(arity) , Chris@16: Chris@16: #endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES Chris@16: Chris@16: #endif // BOOST_SIGNALS2_SIGNALS_COMMON_MACROS_HPP