$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r49035 - in sandbox/thread_safe_signals/trunk: boost/signals2 boost/signals2/detail libs/signals2/test
From: fmhess_at_[hidden]
Date: 2008-09-29 16:31:52
Author: fmhess
Date: 2008-09-29 16:31:51 EDT (Mon, 29 Sep 2008)
New Revision: 49035
URL: http://svn.boost.org/trac/boost/changeset/49035
Log:
Combiners don't have to catch expired_slot anymore.
Text files modified: 
   sandbox/thread_safe_signals/trunk/boost/signals2/detail/slot_call_iterator.hpp |    10 +---------                              
   sandbox/thread_safe_signals/trunk/boost/signals2/detail/slot_template.hpp      |     1 +                                       
   sandbox/thread_safe_signals/trunk/boost/signals2/last_value.hpp                |    15 ++-------------                         
   sandbox/thread_safe_signals/trunk/boost/signals2/slot.hpp                      |    20 ++++++++++++++++++++                    
   sandbox/thread_safe_signals/trunk/libs/signals2/test/track_test.cpp            |    17 ++++++-----------                       
   5 files changed, 30 insertions(+), 33 deletions(-)
Modified: sandbox/thread_safe_signals/trunk/boost/signals2/detail/slot_call_iterator.hpp
==============================================================================
--- sandbox/thread_safe_signals/trunk/boost/signals2/detail/slot_call_iterator.hpp	(original)
+++ sandbox/thread_safe_signals/trunk/boost/signals2/detail/slot_call_iterator.hpp	2008-09-29 16:31:51 EDT (Mon, 29 Sep 2008)
@@ -60,15 +60,7 @@
         dereference() const
         {
           if (!(*cache)) {
-            try
-            {
-              cache->reset(f(*iter));
-            }
-            catch(const expired_slot &)
-            {
-              (*iter)->disconnect();
-              throw;
-            }
+            cache->reset(f(*iter));
           }
           return cache->get();
         }
Modified: sandbox/thread_safe_signals/trunk/boost/signals2/detail/slot_template.hpp
==============================================================================
--- sandbox/thread_safe_signals/trunk/boost/signals2/detail/slot_template.hpp	(original)
+++ sandbox/thread_safe_signals/trunk/boost/signals2/detail/slot_template.hpp	2008-09-29 16:31:51 EDT (Mon, 29 Sep 2008)
@@ -49,6 +49,7 @@
       template<typename F>
       BOOST_SLOT_CLASS_NAME(BOOST_SIGNALS_NUM_ARGS)(const F& f): _slot_function(detail::get_invocable_slot(f, detail::tag_type(f)))
       {
+        detail::auto_tracker<typename detail::get_slot_tag<F>::type> at(this, f);
       }
       // copy constructors
       template<BOOST_SIGNAL_PREFIXED_SIGNATURE_TEMPLATE_DECL(BOOST_SIGNALS_NUM_ARGS, Other), typename OtherSlotFunction>
Modified: sandbox/thread_safe_signals/trunk/boost/signals2/last_value.hpp
==============================================================================
--- sandbox/thread_safe_signals/trunk/boost/signals2/last_value.hpp	(original)
+++ sandbox/thread_safe_signals/trunk/boost/signals2/last_value.hpp	2008-09-29 16:31:51 EDT (Mon, 29 Sep 2008)
@@ -17,7 +17,6 @@
 
 namespace boost {
   namespace signals2 {
-    class expired_slot;
     // no_slots_error is thrown when we are unable to generate a return value
     // due to no slots being connected to the signal.
     class no_slots_error: public std::exception
@@ -52,12 +51,7 @@
         optional<T> value;
         while (first != last)
         {
-          try
-          {
-            value = *first;
-          }
-          catch(const expired_slot &)
-          {}
+          value = *first;
           ++first;
         }
         if(value) return value.get();
@@ -81,12 +75,7 @@
       {
         while (first != last)
         {
-          try
-          {
-            *first;
-          }
-          catch(const expired_slot &)
-          {}
+          *first;
           ++first;
         }
         return result_type();
Modified: sandbox/thread_safe_signals/trunk/boost/signals2/slot.hpp
==============================================================================
--- sandbox/thread_safe_signals/trunk/boost/signals2/slot.hpp	(original)
+++ sandbox/thread_safe_signals/trunk/boost/signals2/slot.hpp	2008-09-29 16:31:51 EDT (Mon, 29 Sep 2008)
@@ -57,6 +57,26 @@
         the_tag_type tag = the_tag_type();
         return tag;
       }
+
+      // used to automatically track signal objects that are passed directly to slots
+      template<typename SlotTag>
+      class auto_tracker
+      {
+      public:
+        template<typename Slot, typename F>
+          auto_tracker(Slot *slot, const F &f)
+        {}
+      };
+      template<>
+      class auto_tracker<signal_tag>
+      {
+      public:
+        template<typename Slot, typename F>
+          auto_tracker(Slot *slot, const F &f)
+        {
+          slot->track(f);
+        }
+      };
     }
   }
 } // end namespace boost
Modified: sandbox/thread_safe_signals/trunk/libs/signals2/test/track_test.cpp
==============================================================================
--- sandbox/thread_safe_signals/trunk/libs/signals2/test/track_test.cpp	(original)
+++ sandbox/thread_safe_signals/trunk/libs/signals2/test/track_test.cpp	2008-09-29 16:31:51 EDT (Mon, 29 Sep 2008)
@@ -31,19 +31,14 @@
     boost::optional<T> max;
     for(; first != last; ++first)
     {
-      try
+      T value = *first;
+      if(max == false)
       {
-        T value = *first;
-        if(max == false)
-        {
-          max = value;
-        }else if(value > *max)
-        {
-          max = value;
-        }
+        max = value;
+      }else if(value > *max)
+      {
+        max = value;
       }
-      catch(const boost::signals2::expired_slot &)
-      {}
     }
     if(max) return *max;
     else return T();