diff options
-rw-r--r-- | sigc++/trackable.cc | 35 | ||||
-rw-r--r-- | sigc++/trackable.h | 8 | ||||
-rw-r--r-- | 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(); |