[libsigc++2] sigc::trackable: Don't move the callback list



commit 1995cf176535c3dcf11a187ca6e4f284776b7f88
Author: Kjell Ahlstedt <kjell ahlstedt bredband net>
Date:   Sat Sep 26 12:16:53 2015 +0200

    sigc::trackable: Don't move the callback list
    
    * sigc++/trackable.[h|cc]: Don't move the callback list.
    * tests/test_trackable_move.cc: Remove a comment. Bug #755393.

 sigc++/trackable.cc          |   35 ++++++++---------------------------
 sigc++/trackable.h           |    8 ++------
 tests/test_trackable_move.cc |    1 -
 3 files changed, 10 insertions(+), 34 deletions(-)
---
diff --git a/sigc++/trackable.cc b/sigc++/trackable.cc
index 8d634d0..5702b99 100644
--- a/sigc++/trackable.cc
+++ b/sigc++/trackable.cc
@@ -1,4 +1,3 @@
-// -*- c++ -*-
 /*
  * Copyright 2002, The libsigc++ Development Team
  *
@@ -38,10 +37,13 @@ trackable::trackable(const trackable& /*src*/)
 : callback_list_(nullptr)
 {}
 
+// Don't copy the notification list.
+// The objects watching src don't need to be notified when the new object dies.
+// They need to be notified now, because src probably becomes useless.
 trackable::trackable(trackable&& src) noexcept
-: callback_list_(std::move(src.callback_list_))
+: callback_list_(nullptr)
 {
-  src.callback_list_ = nullptr;
+  src.notify_callbacks();
 }
 
 trackable& trackable::operator=(const trackable& src)
@@ -55,12 +57,10 @@ trackable& trackable::operator=(const trackable& src)
 trackable& trackable::operator=(trackable&& src) noexcept
 {
   if(this != &src)
+  {
     notify_callbacks(); //Make sure that we have finished with existing stuff before replacing it.
-
-  callback_list_ = std::move(src.callback_list_);
-
-  src.callback_list_ = nullptr;
-
+    src.notify_callbacks(); // src probably becomes useless.
+  }
   return *this;
 }
 
@@ -99,25 +99,6 @@ internal::trackable_callback_list* trackable::callback_list() const
 namespace internal
 {
 
-trackable_callback_list::trackable_callback_list(trackable_callback_list&& src) noexcept
-: callbacks_(std::move(src.callbacks_)),
-  clearing_(std::move(src.clearing_))
-{
-  src.callbacks_.clear();
-  src.clearing_ = false;
-}
-
-trackable_callback_list& trackable_callback_list::operator=(trackable_callback_list&& src) noexcept
-{
-  callbacks_ = std::move(src.callbacks_);
-  clearing_ = std::move(src.clearing_);
-
-  src.callbacks_.clear();
-  src.clearing_ = false;
-
-  return *this;
-}
-
 trackable_callback_list::~trackable_callback_list()
 {
   clearing_ = true;
diff --git a/sigc++/trackable.h b/sigc++/trackable.h
index 606adfd..af8042a 100644
--- a/sigc++/trackable.h
+++ b/sigc++/trackable.h
@@ -70,16 +70,13 @@ struct SIGC_API trackable_callback_list
 
   trackable_callback_list(const trackable_callback_list& src) = delete;
   trackable_callback_list& operator=(const trackable_callback_list& src) = delete;
-
-  trackable_callback_list(trackable_callback_list&& src) noexcept;
-
-  trackable_callback_list& operator=(trackable_callback_list&& src) noexcept;
+  trackable_callback_list(trackable_callback_list&& src) = delete;
+  trackable_callback_list& operator=(trackable_callback_list&& src) = delete;
 
   /** This invokes all of the callback functions.
    */
   ~trackable_callback_list();
 
-
 private:
   typedef std::list<trackable_callback> callback_list;
   callback_list callbacks_;
@@ -127,7 +124,6 @@ struct SIGC_API trackable
                                    who insist on using "trackable*" as
                                    pointer type for their own derived objects */
 
-  
   typedef internal::func_destroy_notify func_destroy_notify;
   
   /** Add a callback that is executed (notified) when the trackable object is detroyed.
diff --git a/tests/test_trackable_move.cc b/tests/test_trackable_move.cc
index b959647..2d16273 100644
--- a/tests/test_trackable_move.cc
+++ b/tests/test_trackable_move.cc
@@ -70,7 +70,6 @@ int main(int argc, char* argv[])
     t2.i = 15;
     result_stream.clear();
 
-    //TODO: Should this work without this line?
     sl = sigc::mem_fun0(&t2, &my_class::foo);
 
     sl();


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]