[glibmm] Glib::ObjectBase, Object, Interface: Add move operators.



commit 3261c1dea29cad27e4303b7a4d212b5351762f39
Author: Murray Cumming <murrayc murrayc com>
Date:   Fri Aug 21 21:19:45 2015 +0200

    Glib::ObjectBase, Object, Interface: Add move operators.
    
    Add move constructors and move assignment operators so that derived
    classes can have these too.

 glib/glibmm/interface.cc  |   10 ++++++++++
 glib/glibmm/interface.h   |    3 +++
 glib/glibmm/object.cc     |   10 ++++++++++
 glib/glibmm/object.h      |    3 +++
 glib/glibmm/objectbase.cc |   18 ++++++++++++++++++
 glib/glibmm/objectbase.h  |    3 +++
 6 files changed, 47 insertions(+), 0 deletions(-)
---
diff --git a/glib/glibmm/interface.cc b/glib/glibmm/interface.cc
index 8ed14d3..609afe7 100644
--- a/glib/glibmm/interface.cc
+++ b/glib/glibmm/interface.cc
@@ -117,6 +117,16 @@ Interface::Interface(GObject* castitem)
 Interface::Interface()
 {}
 
+Interface::Interface(Interface&& src)
+: ObjectBase(std::move(src))
+{}
+
+Interface& Interface::operator=(Interface&& src)
+{
+  ObjectBase::operator=(std::move(src));
+  return *this;
+}
+
 Interface::~Interface()
 {}
 
diff --git a/glib/glibmm/interface.h b/glib/glibmm/interface.h
index 0fc9ba6..4ebf1f6 100644
--- a/glib/glibmm/interface.h
+++ b/glib/glibmm/interface.h
@@ -45,6 +45,9 @@ public:
    */
   Interface();
 
+  Interface(Interface&& src);
+  Interface& operator=(Interface&& src);
+
   /** Called by constructors of derived classes. Provide the result of
    * the Class object's init() function to ensure that it is properly
    * initialized.
diff --git a/glib/glibmm/object.cc b/glib/glibmm/object.cc
index ddaa47b..ce3b3e9 100644
--- a/glib/glibmm/object.cc
+++ b/glib/glibmm/object.cc
@@ -285,6 +285,16 @@ Object::Object(GObject* castitem)
   ObjectBase::initialize(castitem);
 }
 
+Object::Object(Object&& src) noexcept
+: ObjectBase(std::move(src))
+{}
+
+Object& Object::operator=(Object&& src) noexcept
+{
+  ObjectBase::operator=(std::move(src));
+  return *this;
+}
+
 Object::~Object()
 {
   cpp_destruction_in_progress_ = true;
diff --git a/glib/glibmm/object.h b/glib/glibmm/object.h
index 202b28e..0b275fd 100644
--- a/glib/glibmm/object.h
+++ b/glib/glibmm/object.h
@@ -107,6 +107,9 @@ public:
   Object(const Object&) = delete;
   Object& operator=(const Object&) = delete;
 
+  Object(Object&& src) noexcept;
+  Object& operator=(Object&& src) noexcept;
+
 protected:
   Object(); //For use by C++-only sub-types.
   explicit Object(const Glib::ConstructParams& construct_params);
diff --git a/glib/glibmm/objectbase.cc b/glib/glibmm/objectbase.cc
index c1efb13..c3fddeb 100644
--- a/glib/glibmm/objectbase.cc
+++ b/glib/glibmm/objectbase.cc
@@ -90,6 +90,24 @@ void ObjectBase::initialize(GObject* castitem)
   _set_current_wrapper(castitem);
 }
 
+ObjectBase::ObjectBase(ObjectBase&& src) noexcept
+: gobject_(std::move(src.gobject_)),
+  custom_type_name_(std::move(src.custom_type_name_)),
+  cpp_destruction_in_progress_(std::move(src.custom_type_name_))
+{}
+
+ObjectBase& ObjectBase::operator=(ObjectBase&& src) noexcept
+{
+  if(gobject_)
+    unreference();
+
+  gobject_ = std::move(src.gobject_);
+  custom_type_name_ = std::move(src.custom_type_name_);
+  cpp_destruction_in_progress_ = std::move(src.custom_type_name_);
+
+  return *this;
+}
+
 ObjectBase::~ObjectBase()
 {
   // Normally, gobject_ should always be 0 at this point, because:
diff --git a/glib/glibmm/objectbase.h b/glib/glibmm/objectbase.h
index 44fb7ad..e5407ab 100644
--- a/glib/glibmm/objectbase.h
+++ b/glib/glibmm/objectbase.h
@@ -95,6 +95,9 @@ protected:
    */
   explicit ObjectBase(const std::type_info& custom_type_info);
 
+  ObjectBase(ObjectBase&& src) noexcept;
+  ObjectBase& operator=(ObjectBase&& src) noexcept;
+
   virtual ~ObjectBase() = 0;
 
   // Called by Glib::Object and Glib::Interface constructors. See comments there.


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