diff -rc BOOST_ROOT/boost_1_32_0/boost/signals/connection.hpp boost_1_32_0/boost/signals/connection.hpp *** BOOST_ROOT/boost_1_32_0/boost/signals/connection.hpp Thu Sep 30 22:07:33 2004 --- boost_1_32_0/boost/signals/connection.hpp Wed Nov 24 22:59:57 2004 *************** *** 114,119 **** --- 114,155 ---- bool controlling_connection; }; + namespace detail { + extern void replace_slot(detail::basic_connection *, any const &); + } // end detail namespace + + template + struct typed_connection + : public connection + { + public: + typedef SIGNAL signal_type; + typedef typename signal_type::slot_type slot_type; + typedef typed_connection connection_type; + + typed_connection() + : boost::signals::connection() + { + } + + explicit typed_connection( + boost::signals::connection const & rhs) + : boost::signals::connection(rhs) + { + } + + void replace_slot( + slot_type const & slot) const + { + if (connected()) + { + detail::replace_slot( + get_connection().get(), + slot.get_slot_function()); + } + } + }; + // Similar to connection, but will disconnect the connection when it is // destroyed unless release() has been called. class BOOST_SIGNALS_DECL scoped_connection : public connection { diff -rc BOOST_ROOT/boost_1_32_0/boost/signals/detail/signal_base.hpp boost_1_32_0/boost/signals/detail/signal_base.hpp *** BOOST_ROOT/boost_1_32_0/boost/signals/detail/signal_base.hpp Thu Sep 30 22:07:33 2004 --- boost_1_32_0/boost/signals/detail/signal_base.hpp Wed Nov 24 22:54:44 2004 *************** *** 117,122 **** --- 117,128 ---- typedef named_slot_map::iterator iterator; }; + // Replace the slot that is associated with the connection. + // NOTE: slot is an "any" but it must be a well formed slot<>. + void replace_slot( + detail::basic_connection * bconn, + any const & slot); + class BOOST_SIGNALS_DECL signal_base : public noncopyable { public: typedef signal_base_impl::compare_type compare_type; diff -rc BOOST_ROOT/boost_1_32_0/boost/signals/signal_template.hpp boost_1_32_0/boost/signals/signal_template.hpp *** BOOST_ROOT/boost_1_32_0/boost/signals/signal_template.hpp Fri Oct 29 08:44:12 2004 --- boost_1_32_0/boost/signals/signal_template.hpp Wed Nov 24 22:17:46 2004 *************** *** 198,211 **** { } // Connect a slot to this signal ! BOOST_SIGNALS_NAMESPACE::connection connect(const slot_type&, BOOST_SIGNALS_NAMESPACE::connect_position at = BOOST_SIGNALS_NAMESPACE::at_back); ! BOOST_SIGNALS_NAMESPACE::connection connect(const group_type&, const slot_type&, BOOST_SIGNALS_NAMESPACE::connect_position at = BOOST_SIGNALS_NAMESPACE::at_back); --- 198,222 ---- { } + typedef BOOST_SIGNALS_SIGNAL< + R, + BOOST_SIGNALS_TEMPLATE_ARGS BOOST_SIGNALS_COMMA_IF_NONZERO_ARGS + Combiner, + Group, + GroupCompare, + SlotFunction > signal_type; + + typedef BOOST_SIGNALS_NAMESPACE::typed_connection + connection_type; + // Connect a slot to this signal ! connection_type connect(const slot_type&, BOOST_SIGNALS_NAMESPACE::connect_position at = BOOST_SIGNALS_NAMESPACE::at_back); ! connection_type connect(const group_type&, const slot_type&, BOOST_SIGNALS_NAMESPACE::connect_position at = BOOST_SIGNALS_NAMESPACE::at_back); *************** *** 266,272 **** typename GroupCompare, typename SlotFunction > ! BOOST_SIGNALS_NAMESPACE::connection BOOST_SIGNALS_SIGNAL< R, BOOST_SIGNALS_TEMPLATE_ARGS BOOST_SIGNALS_COMMA_IF_NONZERO_ARGS --- 277,289 ---- typename GroupCompare, typename SlotFunction > ! typename BOOST_SIGNALS_SIGNAL< ! R, ! BOOST_SIGNALS_TEMPLATE_ARGS BOOST_SIGNALS_COMMA_IF_NONZERO_ARGS ! Combiner, ! Group, ! GroupCompare, ! SlotFunction >::connection_type BOOST_SIGNALS_SIGNAL< R, BOOST_SIGNALS_TEMPLATE_ARGS BOOST_SIGNALS_COMMA_IF_NONZERO_ARGS *************** *** 277,287 **** // If the slot has been disconnected, just return a disconnected // connection if (!in_slot.is_active()) { ! return BOOST_SIGNALS_NAMESPACE::connection(); } ! return impl->connect_slot(in_slot.get_slot_function(), any(), ! in_slot.get_data(), at); } template< --- 294,305 ---- // If the slot has been disconnected, just return a disconnected // connection if (!in_slot.is_active()) { ! return connection_type(); } ! return connection_type( ! impl->connect_slot(in_slot.get_slot_function(), any(), ! in_slot.get_data(), at)); } template< *************** *** 293,299 **** typename GroupCompare, typename SlotFunction > ! BOOST_SIGNALS_NAMESPACE::connection BOOST_SIGNALS_SIGNAL< R, BOOST_SIGNALS_TEMPLATE_ARGS BOOST_SIGNALS_COMMA_IF_NONZERO_ARGS --- 311,323 ---- typename GroupCompare, typename SlotFunction > ! typename BOOST_SIGNALS_SIGNAL< ! R, ! BOOST_SIGNALS_TEMPLATE_ARGS BOOST_SIGNALS_COMMA_IF_NONZERO_ARGS ! Combiner, ! Group, ! GroupCompare, ! SlotFunction >::connection_type BOOST_SIGNALS_SIGNAL< R, BOOST_SIGNALS_TEMPLATE_ARGS BOOST_SIGNALS_COMMA_IF_NONZERO_ARGS *************** *** 305,315 **** // If the slot has been disconnected, just return a disconnected // connection if (!in_slot.is_active()) { ! return BOOST_SIGNALS_NAMESPACE::connection(); } ! return impl->connect_slot(in_slot.get_slot_function(), group, ! in_slot.get_data(), at); } template< --- 329,340 ---- // If the slot has been disconnected, just return a disconnected // connection if (!in_slot.is_active()) { ! return connection_type(); } ! return connection_type( ! impl->connect_slot(in_slot.get_slot_function(), group, ! in_slot.get_data(), at)); } template< diff -rc BOOST_ROOT/boost_1_32_0/libs/signals/src/signal_base.cpp boost_1_32_0/libs/signals/src/signal_base.cpp *** BOOST_ROOT/boost_1_32_0/libs/signals/src/signal_base.cpp Fri Oct 29 08:44:13 2004 --- boost_1_32_0/libs/signals/src/signal_base.cpp Wed Nov 24 22:58:08 2004 *************** *** 99,104 **** --- 99,115 ---- return safe_connection.release(); } + void + replace_slot(detail::basic_connection * bconn, + any const & slot) + { + if (bconn && bconn->signal_data) + { + reinterpret_cast( + bconn->signal_data)->dereference().second = slot; + } + } + bool signal_base_impl::empty() const { // Disconnected slots may still be in the list of slots if