diff options
author | Kjell Ahlstedt <kjell.ahlstedt@bredband.net> | 2015-10-31 09:24:14 +0100 |
---|---|---|
committer | Kjell Ahlstedt <kjell.ahlstedt@bredband.net> | 2015-10-31 09:24:14 +0100 |
commit | 2fbd9f23318abd07e446ea5251d1c2702ae27233 (patch) | |
tree | c7062c4da7c72013ab63dead3cd566cc4dd0ff58 /tests | |
parent | a305083346660ec154ea1364d5d8cb894622db3b (diff) | |
download | glibmm-2fbd9f23318abd07e446ea5251d1c2702ae27233.tar.gz |
ObjectBase, Object, Interface: Fix move constructors and move assignments
* glib/glibmm/interface.cc: Don't call ObjectBase's move assignment operator
from Interface's move assignment operator.
* glib/glibmm/object.cc: Perform of job of sigc::trackable's move constructor
in Object's move constructor.
* glib/glibmm/objectbase.cc: Move constructor: Set gobject_ = nullptr.
Fix the assignment of cpp_destruction_in_progress_.
Move assignment: Add self-assignment guard. Avoid the risk of accidentally
deleting *this. Let a call to initialize_move() do most of the job.
* tests/glibmm_interface_move/main.cc:
* tests/glibmm_object_move/main.cc:
* tests/glibmm_objectbase_move/main.cc: Really test move assignment.
Test that the wrapped C object has been moved, and not copied.
Bug #756962.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/glibmm_interface_move/main.cc | 18 | ||||
-rw-r--r-- | tests/glibmm_object_move/main.cc | 20 | ||||
-rw-r--r-- | tests/glibmm_objectbase_move/main.cc | 22 |
3 files changed, 37 insertions, 23 deletions
diff --git a/tests/glibmm_interface_move/main.cc b/tests/glibmm_interface_move/main.cc index 29662e99..28b8e8fb 100644 --- a/tests/glibmm_interface_move/main.cc +++ b/tests/glibmm_interface_move/main.cc @@ -106,7 +106,7 @@ protected: public: //A real application would never make the constructor public. - //It would instead have a protectd constructor and a public create() method. + //It would instead have a protected constructor and a public create() method. TestInterface(GObject* gobject, int i) : Glib::Interface(gobject), i_(i) @@ -220,7 +220,10 @@ private: DerivedObject::CppClassType DerivedObject::derived_object_class_; // initialize static member -/* TODO: Shouldn't this work too? +/* Shouldn't this work too? + * No, because Glib::Interface::Interface(Interface&& src) does not call + * Glib::ObjectBase::initialize_move(), and Glib::Interface::operator=(Interface&& src) + * does not call Glib::ObjectBase::operator=(std::move(src)). static void test_interface_move_constructor() { @@ -258,11 +261,13 @@ void test_object_with_interface_move_constructor() { DerivedObject derived(5); g_assert_cmpint(derived.i_, ==, 5); - GObject *gobject = derived.gobj(); + GObject* gobject = derived.gobj(); g_assert(derived.gobj() == gobject); + DerivedObject derived2(std::move(derived)); g_assert_cmpint(derived2.i_, ==, 5); g_assert(derived2.gobj() == gobject); + g_assert(derived.gobj() == nullptr); } static @@ -270,11 +275,14 @@ void test_object_with_interface_move_assignment_operator() { DerivedObject derived(5); g_assert_cmpint(derived.i_, ==, 5); - GObject *gobject = derived.gobj(); + GObject* gobject = derived.gobj(); g_assert(derived.gobj() == gobject); - DerivedObject derived2 = std::move(derived); + + DerivedObject derived2(6); + derived2 = std::move(derived); g_assert_cmpint(derived2.i_, ==, 5); g_assert(derived2.gobj() == gobject); + g_assert(derived.gobj() == nullptr); } diff --git a/tests/glibmm_object_move/main.cc b/tests/glibmm_object_move/main.cc index a62bcf9e..7868b176 100644 --- a/tests/glibmm_object_move/main.cc +++ b/tests/glibmm_object_move/main.cc @@ -2,7 +2,7 @@ #include <iostream> #include <stdlib.h> -//A basic derived GObject, just to test Glib::ObjectBase. +//A basic derived GObject, just to test Glib::Object. typedef struct { GObject parent; } TestDerived; @@ -27,7 +27,7 @@ class DerivedObject : public Glib::Object { public: //A real application would never make the constructor public. - //It would instead have a protectd constructor and a public create() method. + //It would instead have a protected constructor and a public create() method. DerivedObject(GObject* gobject, int i) : Glib::Object(gobject), i_(i) @@ -56,32 +56,34 @@ public: static void test_object_move_constructor() { - GObject *gobject = G_OBJECT(g_object_new(TEST_TYPE_DERIVED, nullptr)); - g_object_ref(gobject); - + GObject* gobject = G_OBJECT(g_object_new(TEST_TYPE_DERIVED, nullptr)); DerivedObject derived(gobject, 5); std::cout << "debug: gobj(): " << derived.gobj() << std::endl; g_assert(derived.gobj() == gobject); + DerivedObject derived2(std::move(derived)); g_assert_cmpint(derived2.i_, ==, 5); std::cout << "debug: gobj(): " << derived2.gobj() << std::endl; g_assert(derived2.gobj() == gobject); + g_assert(derived.gobj() == nullptr); } static void test_object_move_assignment_operator() { - GObject *gobject = G_OBJECT(g_object_new(TEST_TYPE_DERIVED, nullptr)); - g_object_ref(gobject); - + GObject* gobject = G_OBJECT(g_object_new(TEST_TYPE_DERIVED, nullptr)); DerivedObject derived(gobject, 5); //std::cout << "debug: gobj(): " << derived.gobj() << std::endl; g_assert(derived.gobj() == gobject); - DerivedObject derived2 = std::move(derived); + + GObject* gobject2 = G_OBJECT(g_object_new(TEST_TYPE_DERIVED, nullptr)); + DerivedObject derived2(gobject2, 6); + derived2 = std::move(derived); g_assert_cmpint(derived2.i_, ==, 5); //std::cout << "debug: gobj(): " << derived2.gobj() << std::endl; g_assert(derived2.gobj() == gobject); + g_assert(derived.gobj() == nullptr); } diff --git a/tests/glibmm_objectbase_move/main.cc b/tests/glibmm_objectbase_move/main.cc index ed71fe17..e70ff3bb 100644 --- a/tests/glibmm_objectbase_move/main.cc +++ b/tests/glibmm_objectbase_move/main.cc @@ -28,7 +28,7 @@ class DerivedObjectBase : public Glib::ObjectBase { public: //A real application would never make the constructor public. - //It would instead have a protectd constructor and a public create() method. + //It would instead have a protected constructor and a public create() method. DerivedObjectBase(GObject* gobject, int i) : Glib::ObjectBase(nullptr), i_(i) @@ -42,7 +42,9 @@ public: DerivedObjectBase(DerivedObjectBase&& src) noexcept : Glib::ObjectBase(std::move(src)), i_(std::move(src.i_)) - {} + { + ObjectBase::initialize_move(src.gobject_, &src); + } DerivedObjectBase& operator=(DerivedObjectBase&& src) noexcept { @@ -58,31 +60,33 @@ public: static void test_objectbase_move_constructor() { - GObject *gobject = G_OBJECT(g_object_new(TEST_TYPE_DERIVED, nullptr)); - g_object_ref(gobject); - + GObject* gobject = G_OBJECT(g_object_new(TEST_TYPE_DERIVED, nullptr)); DerivedObjectBase derived(gobject, 5); //std::cout << "debug: gobj(): " << derived.gobj() << std::endl; g_assert(derived.gobj() == gobject); + DerivedObjectBase derived2(std::move(derived)); g_assert_cmpint(derived2.i_, ==, 5); //std::cout << "debug: gobj(): " << derived2.gobj() << std::endl; g_assert(derived2.gobj() == gobject); + g_assert(derived.gobj() == nullptr); } static void test_objectbase_move_assignment_operator() { - GObject *gobject = G_OBJECT(g_object_new(TEST_TYPE_DERIVED, nullptr)); - g_object_ref(gobject); - + GObject* gobject = G_OBJECT(g_object_new(TEST_TYPE_DERIVED, nullptr)); DerivedObjectBase derived(gobject, 5); //std::cout << "debug: gobj(): " << derived.gobj() << std::endl; g_assert(derived.gobj() == gobject); - DerivedObjectBase derived2 = std::move(derived); + + GObject* gobject2 = G_OBJECT(g_object_new(TEST_TYPE_DERIVED, nullptr)); + DerivedObjectBase derived2(gobject2, 6); + derived2 = std::move(derived); g_assert_cmpint(derived2.i_, ==, 5); //std::cout << "debug: gobj(): " << derived2.gobj() << std::endl; g_assert(derived2.gobj() == gobject); + g_assert(derived.gobj() == nullptr); } int main(int, char**) |