From 9531edfffc01363ee67dc0025919382498da3ddd Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 10 Mar 2017 17:07:40 +0100 Subject: [PATCH 1/2] Core/Signal: Fix move behaviour with GCC 4.9 .... --- include/Nazara/Core/Signal.inl | 38 ++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/include/Nazara/Core/Signal.inl b/include/Nazara/Core/Signal.inl index 65df55712..d71388c94 100644 --- a/include/Nazara/Core/Signal.inl +++ b/include/Nazara/Core/Signal.inl @@ -246,6 +246,18 @@ namespace Nz * \brief Core class that represents a connection attached to a signal */ + /*! + * \brief Constructs a Signal::Connection object with by move semantic + * + * \param connection Connection object to move + */ + template + Signal::Connection::Connection(Connection&& connection) noexcept : + m_ptr(std::move(connection.m_ptr)) + { + connection.m_ptr.reset(); //< Fuck you GCC 4.9 + } + /*! * \brief Constructs a Signal::Connection object with a slot * @@ -294,6 +306,18 @@ namespace Nz return !m_ptr.expired(); } + /*! + * \brief Constructs a Signal::ConnectionGuard object by move semantic + * + * \param connection Connection to move + */ + template + typename Signal::Connection& Signal::Connection::operator=(Connection&& connection) noexcept + { + m_ptr = std::move(connection.m_ptr); + connection.m_ptr.reset(); //< Fuck you GCC 4.9 + } + /*! * \class Nz::Signal::ConnectionGuard * \brief Core class that represents a RAII for a connection attached to a signal @@ -406,8 +430,11 @@ namespace Nz template typename Signal::ConnectionGuard& Signal::ConnectionGuard::operator=(Connection&& connection) { - m_connection.Disconnect(); - m_connection = std::move(connection); + if (&connection != this) + { + m_connection.Disconnect(); + m_connection = std::move(connection); + } return *this; } @@ -422,8 +449,11 @@ namespace Nz template typename Signal::ConnectionGuard& Signal::ConnectionGuard::operator=(ConnectionGuard&& connection) noexcept { - m_connection.Disconnect(); - m_connection = std::move(connection.m_connection); + if (&connection != this) + { + m_connection.Disconnect(); + m_connection = std::move(connection.m_connection); + } return *this; } From 82edb5c7cb55b4c520be1815ebd9992b4d819c35 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 10 Mar 2017 17:10:11 +0100 Subject: [PATCH 2/2] Core/Signal: Fix compilation --- include/Nazara/Core/Signal.hpp | 4 ++-- include/Nazara/Core/Signal.inl | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/include/Nazara/Core/Signal.hpp b/include/Nazara/Core/Signal.hpp index 0dfff4a1e..1569c5d0e 100644 --- a/include/Nazara/Core/Signal.hpp +++ b/include/Nazara/Core/Signal.hpp @@ -84,7 +84,7 @@ namespace Nz public: Connection() = default; Connection(const Connection& connection) = default; - Connection(Connection&& connection) noexcept = default; + Connection(Connection&& connection) noexcept; ~Connection() = default; template @@ -94,7 +94,7 @@ namespace Nz bool IsConnected() const; Connection& operator=(const Connection& connection) = default; - Connection& operator=(Connection&& connection) noexcept = default; + Connection& operator=(Connection&& connection) noexcept; private: Connection(const SlotPtr& slot); diff --git a/include/Nazara/Core/Signal.inl b/include/Nazara/Core/Signal.inl index d71388c94..c4e89bd40 100644 --- a/include/Nazara/Core/Signal.inl +++ b/include/Nazara/Core/Signal.inl @@ -316,6 +316,8 @@ namespace Nz { m_ptr = std::move(connection.m_ptr); connection.m_ptr.reset(); //< Fuck you GCC 4.9 + + return *this; } /*!