|
From: Frank M. H. <fm...@us...> - 2007-02-28 15:54:27
|
Update of /cvsroot/boost-sandbox/boost-sandbox/boost/thread_safe_signals/detail In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv14350/boost/thread_safe_signals/detail Modified Files: signal_template.hpp signals_common_macros.hpp slot_template.hpp Log Message: Added some templated copy constructors to slot class, to prevent loss of tracking on copy construction. Index: signals_common_macros.hpp =================================================================== RCS file: /cvsroot/boost-sandbox/boost-sandbox/boost/thread_safe_signals/detail/signals_common_macros.hpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- signals_common_macros.hpp 27 Feb 2007 21:19:25 -0000 1.1 +++ signals_common_macros.hpp 28 Feb 2007 15:54:22 -0000 1.2 @@ -33,12 +33,18 @@ BOOST_PP_ENUM(arity, BOOST_SIGNAL_SIGNATURE_FULL_ARG, ~) // arg1, arg2, ..., argn #define BOOST_SIGNAL_SIGNATURE_ARG_NAMES(arity) BOOST_PP_ENUM(arity, BOOST_SIGNAL_SIGNATURE_ARG_NAME, ~) +// typename prefixR, typename prefixT1, typename prefixT2, ..., typename prefixTN +#define BOOST_SIGNAL_PREFIXED_SIGNATURE_TEMPLATE_DECL(arity, prefix) \ + typename BOOST_PP_CAT(prefix, R) BOOST_PP_COMMA_IF(arity) \ + BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(arity), typename BOOST_PP_CAT(prefix, T)) // typename R, typename T1, typename T2, ..., typename TN -#define BOOST_SIGNAL_SIGNATURE_TEMPLATE_DECL(arity) \ - typename R BOOST_PP_COMMA_IF(arity) BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(arity), typename T) +#define BOOST_SIGNAL_SIGNATURE_TEMPLATE_DECL(arity) BOOST_SIGNAL_PREFIXED_SIGNATURE_TEMPLATE_DECL(arity,) +// prefixR, prefixT1, prefixT2, ..., prefixTN +#define BOOST_SIGNAL_PREFIXED_SIGNATURE_TEMPLATE_INSTANTIATION(arity, prefix) \ + BOOST_PP_CAT(prefix, R) BOOST_PP_COMMA_IF(arity) BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(arity), BOOST_PP_CAT(prefix, T)) // R, T1, T2, ..., TN #define BOOST_SIGNAL_SIGNATURE_TEMPLATE_INSTANTIATION(arity) \ - R BOOST_PP_COMMA_IF(arity) BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(arity), T) + BOOST_SIGNAL_PREFIXED_SIGNATURE_TEMPLATE_INSTANTIATION(arity,) // functionN<R, T1, T2, ..., TN> #define BOOST_FUNCTION_N_DECL(arity) BOOST_PP_CAT(function, arity)<\ BOOST_SIGNAL_SIGNATURE_TEMPLATE_INSTANTIATION(arity) > Index: signal_template.hpp =================================================================== RCS file: /cvsroot/boost-sandbox/boost-sandbox/boost/thread_safe_signals/detail/signal_template.hpp,v retrieving revision 1.35 retrieving revision 1.36 diff -u -d -r1.35 -r1.36 --- signal_template.hpp 27 Feb 2007 21:19:25 -0000 1.35 +++ signal_template.hpp 28 Feb 2007 15:54:22 -0000 1.36 @@ -59,16 +59,16 @@ class BOOST_SIGNAL_IMPL_CLASS_NAME { public: + typedef SlotFunction slot_function_type; + // typedef slotN<Signature, SlotFunction> slot_type; typedef BOOST_SLOT_CLASS_NAME(BOOST_SIGNALS_NUM_ARGS)<BOOST_SIGNAL_SIGNATURE_TEMPLATE_INSTANTIATION(BOOST_SIGNALS_NUM_ARGS), - SlotFunction> slot_type; + slot_function_type> slot_type; private: class slot_invoker; typedef typename signalslib::detail::group_key<Group>::type group_key_type; typedef shared_ptr<ConnectionBody<group_key_type, slot_type, ThreadingModel> > connection_body_type; typedef grouped_list<Group, GroupCompare, connection_body_type> connection_list_type; public: - typedef SlotFunction slot_function_type; - // typedef slotN<Signature, SlotFunction> slot_type; typedef typename slot_function_type::result_type slot_result_type; typedef Combiner combiner_type; typedef typename combiner_type::result_type result_type; Index: slot_template.hpp =================================================================== RCS file: /cvsroot/boost-sandbox/boost-sandbox/boost/thread_safe_signals/detail/slot_template.hpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- slot_template.hpp 27 Feb 2007 21:19:25 -0000 1.1 +++ slot_template.hpp 28 Feb 2007 15:54:22 -0000 1.2 @@ -18,18 +18,35 @@ namespace boost { + template<typename Signature, typename SlotFunction> class slot; + // slot class template. template<BOOST_SIGNAL_SIGNATURE_TEMPLATE_DECL(BOOST_SIGNALS_NUM_ARGS), typename SlotFunction = BOOST_FUNCTION_N_DECL(BOOST_SIGNALS_NUM_ARGS)> class BOOST_SLOT_CLASS_NAME(BOOST_SIGNALS_NUM_ARGS): public signalslib::detail::slot_base { public: + template<BOOST_SIGNAL_PREFIXED_SIGNATURE_TEMPLATE_DECL(BOOST_SIGNALS_NUM_ARGS, Other), typename OtherSlotFunction> + friend class BOOST_SLOT_CLASS_NAME(BOOST_SIGNALS_NUM_ARGS); + typedef R result_type; template<typename F> BOOST_SLOT_CLASS_NAME(BOOST_SIGNALS_NUM_ARGS)(const F& f): _slot_function(signalslib::detail::get_invocable_slot(f, signalslib::detail::tag_type(f))) { } + // copy constructors + template<BOOST_SIGNAL_PREFIXED_SIGNATURE_TEMPLATE_DECL(BOOST_SIGNALS_NUM_ARGS, Other), typename OtherSlotFunction> + BOOST_SLOT_CLASS_NAME(BOOST_SIGNALS_NUM_ARGS)(const BOOST_SLOT_CLASS_NAME(BOOST_SIGNALS_NUM_ARGS) + <BOOST_SIGNAL_PREFIXED_SIGNATURE_TEMPLATE_INSTANTIATION(BOOST_SIGNALS_NUM_ARGS, Other), OtherSlotFunction> &other_slot): + signalslib::detail::slot_base(other_slot), _slot_function(other_slot._slot_function) + { + } + template<typename Signature, typename OtherSlotFunction> + BOOST_SLOT_CLASS_NAME(BOOST_SIGNALS_NUM_ARGS)(const slot<Signature, OtherSlotFunction> &other_slot): + signalslib::detail::slot_base(other_slot), _slot_function(other_slot._slot_function) + { + } // bind syntactic sugar // const ArgTypeN argN #define BOOST_SLOT_BINDING_ARG_DECL(z, n, data) \ |