diff --git a/include/Nazara/Core/ConditionVariable.hpp b/include/Nazara/Core/ConditionVariable.hpp index 4096e00b4..f6aeafe9b 100644 --- a/include/Nazara/Core/ConditionVariable.hpp +++ b/include/Nazara/Core/ConditionVariable.hpp @@ -19,7 +19,7 @@ namespace Nz public: ConditionVariable(); ConditionVariable(const ConditionVariable&) = delete; - ConditionVariable(ConditionVariable&&) = delete; ///TODO + inline ConditionVariable(ConditionVariable&& condition) noexcept; ~ConditionVariable(); void Signal(); @@ -29,11 +29,13 @@ namespace Nz bool Wait(Mutex* mutex, UInt32 timeout); ConditionVariable& operator=(const ConditionVariable&) = delete; - ConditionVariable& operator=(ConditionVariable&&) = delete; ///TODO + inline ConditionVariable& operator=(ConditionVariable&& condition) noexcept; private: ConditionVariableImpl* m_impl; }; } +#include + #endif // NAZARA_CONDITIONVARIABLE_HPP diff --git a/include/Nazara/Core/ConditionVariable.inl b/include/Nazara/Core/ConditionVariable.inl new file mode 100644 index 000000000..636c98493 --- /dev/null +++ b/include/Nazara/Core/ConditionVariable.inl @@ -0,0 +1,25 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include + +namespace Nz +{ + /*! + * \class Nz::ConditionVariable + */ + + /*! + * \brief Constructs a ConditionVariable object by moving another one + */ + inline ConditionVariable::ConditionVariable(ConditionVariable&& condition) noexcept : + m_impl(condition.m_impl) + { + condition.m_impl = nullptr; + } +} + +#include diff --git a/include/Nazara/Core/Mutex.hpp b/include/Nazara/Core/Mutex.hpp index e49de7512..14de9d282 100644 --- a/include/Nazara/Core/Mutex.hpp +++ b/include/Nazara/Core/Mutex.hpp @@ -20,7 +20,7 @@ namespace Nz public: Mutex(); Mutex(const Mutex&) = delete; - Mutex(Mutex&&) = delete; ///TODO + inline Mutex(Mutex&& mutex) noexcept; ~Mutex(); void Lock(); @@ -28,11 +28,13 @@ namespace Nz void Unlock(); Mutex& operator=(const Mutex&) = delete; - Mutex& operator=(Mutex&&) = delete; ///TODO + Mutex& operator=(Mutex&& mutex) noexcept; private: MutexImpl* m_impl; }; } +#include + #endif // NAZARA_MUTEX_HPP diff --git a/include/Nazara/Core/Mutex.inl b/include/Nazara/Core/Mutex.inl new file mode 100644 index 000000000..7d0618071 --- /dev/null +++ b/include/Nazara/Core/Mutex.inl @@ -0,0 +1,25 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include + +namespace Nz +{ + /*! + * \class Nz::Mutex + */ + + /*! + * \brief Constructs a Mutex object by moving another one + */ + inline Mutex::Mutex(Mutex&& mutex) noexcept : + m_impl(mutex.m_impl) + { + mutex.m_impl = nullptr; + } +} + +#include diff --git a/src/Nazara/Core/ConditionVariable.cpp b/src/Nazara/Core/ConditionVariable.cpp index c660c6464..c01b47722 100644 --- a/src/Nazara/Core/ConditionVariable.cpp +++ b/src/Nazara/Core/ConditionVariable.cpp @@ -101,4 +101,18 @@ namespace Nz NazaraAssert(mutex != nullptr, "Mutex must be valid"); return m_impl->Wait(mutex->m_impl, timeout); } + + /*! + * \brief Moves a condition to another ConditionVariable object + * \return A reference to the object + */ + ConditionVariable& ConditionVariable::operator=(ConditionVariable&& condition) noexcept + { + delete m_impl; + + m_impl = condition.m_impl; + condition.m_impl = nullptr; + + return *this; + } } diff --git a/src/Nazara/Core/Mutex.cpp b/src/Nazara/Core/Mutex.cpp index 647fffc12..2d17276f1 100644 --- a/src/Nazara/Core/Mutex.cpp +++ b/src/Nazara/Core/Mutex.cpp @@ -3,6 +3,7 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include +#include #if defined(NAZARA_PLATFORM_WINDOWS) #include @@ -49,6 +50,7 @@ namespace Nz void Mutex::Lock() { + NazaraAssert(m_impl, "Cannot lock a moved mutex"); m_impl->Lock(); } @@ -59,6 +61,7 @@ namespace Nz bool Mutex::TryLock() { + NazaraAssert(m_impl, "Cannot lock a moved mutex"); return m_impl->TryLock(); } @@ -70,6 +73,21 @@ namespace Nz void Mutex::Unlock() { + NazaraAssert(m_impl, "Cannot unlock a moved mutex"); m_impl->Unlock(); } + + /*! + * \brief Moves a mutex to another mutex object + * \return A reference to the object + */ + Mutex& Mutex::operator=(Mutex&& mutex) noexcept + { + delete m_impl; + + m_impl = mutex.m_impl; + mutex.m_impl = nullptr; + + return *this; + } }