summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sigc++/trackable.cc35
-rw-r--r--sigc++/trackable.h8
-rw-r--r--tests/test_trackable_move.cc1
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();