From e9608366cdc87b110b1f13af5579b2f974df5b2b Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 9 May 2016 09:03:11 +0200 Subject: [PATCH] Core/ObjectHandle: Add noexcept move constructor/assignment Former-commit-id: d726fab8750fe02fbed0e605bbf9a757c7f035de --- SDK/include/NDK/EntityOwner.hpp | 4 ++-- SDK/include/NDK/EntityOwner.inl | 12 ----------- include/Nazara/Core/HandledObject.hpp | 3 ++- include/Nazara/Core/HandledObject.inl | 16 +++++++++++--- include/Nazara/Core/ObjectHandle.hpp | 3 +++ include/Nazara/Core/ObjectHandle.inl | 30 ++++++++++++++++++++++++++- 6 files changed, 49 insertions(+), 19 deletions(-) diff --git a/SDK/include/NDK/EntityOwner.hpp b/SDK/include/NDK/EntityOwner.hpp index c7cab901f..d0a4a4f59 100644 --- a/SDK/include/NDK/EntityOwner.hpp +++ b/SDK/include/NDK/EntityOwner.hpp @@ -17,7 +17,7 @@ namespace Ndk EntityOwner() = default; explicit EntityOwner(Entity* entity); EntityOwner(const EntityOwner& handle) = delete; - EntityOwner(EntityOwner&& handle); + EntityOwner(EntityOwner&& handle) noexcept = default; ~EntityOwner(); void Reset(Entity* entity = nullptr); @@ -25,7 +25,7 @@ namespace Ndk EntityOwner& operator=(Entity* entity); EntityOwner& operator=(const EntityOwner& handle) = delete; - EntityOwner& operator=(EntityOwner&& handle); + EntityOwner& operator=(EntityOwner&& handle) noexcept = default; }; } diff --git a/SDK/include/NDK/EntityOwner.inl b/SDK/include/NDK/EntityOwner.inl index 607f3229d..6efc2b30e 100644 --- a/SDK/include/NDK/EntityOwner.inl +++ b/SDK/include/NDK/EntityOwner.inl @@ -14,11 +14,6 @@ namespace Ndk Reset(entity); } - inline EntityOwner::EntityOwner(EntityOwner&& handle) : - EntityHandle(std::move(handle)) - { - } - inline EntityOwner::~EntityOwner() { Reset(nullptr); @@ -44,13 +39,6 @@ namespace Ndk return *this; } - - inline EntityOwner& EntityOwner::operator=(EntityOwner&& handle) - { - Reset(std::move(handle)); - - return *this; - } } namespace std diff --git a/include/Nazara/Core/HandledObject.hpp b/include/Nazara/Core/HandledObject.hpp index f1e096748..eeb9c4bfa 100644 --- a/include/Nazara/Core/HandledObject.hpp +++ b/include/Nazara/Core/HandledObject.hpp @@ -36,7 +36,8 @@ namespace Nz private: void RegisterHandle(ObjectHandle* handle); - void UnregisterHandle(ObjectHandle* handle); + void UnregisterHandle(ObjectHandle* handle) noexcept; + void UpdateHandle(ObjectHandle* oldHandle, ObjectHandle* newHandle) noexcept; std::vector*> m_handles; }; diff --git a/include/Nazara/Core/HandledObject.inl b/include/Nazara/Core/HandledObject.inl index 53a5065f4..738a5f7a5 100644 --- a/include/Nazara/Core/HandledObject.inl +++ b/include/Nazara/Core/HandledObject.inl @@ -71,14 +71,24 @@ namespace Nz } template - void HandledObject::UnregisterHandle(ObjectHandle* handle) + void HandledObject::UnregisterHandle(ObjectHandle* handle) noexcept { ///DOC: Un handle ne doit être libéré qu'une fois, et doit faire partie de la liste, sous peine de crash auto it = std::find(m_handles.begin(), m_handles.end(), handle); - NazaraAssert(it != m_handles.end(), "Handle not registred"); + NazaraAssert(it != m_handles.end(), "Handle not registered"); - // On échange cet élément avec le dernier, et on diminue la taille du vector de 1 + // Swap and pop idiom, more efficient than vector::erase std::swap(*it, m_handles.back()); m_handles.pop_back(); } + + template + void HandledObject::UpdateHandle(ObjectHandle* oldHandle, ObjectHandle* newHandle) noexcept + { + auto it = std::find(m_handles.begin(), m_handles.end(), oldHandle); + NazaraAssert(it != m_handles.end(), "Handle not registered"); + + // Simply update the handle + *it = newHandle; + } } diff --git a/include/Nazara/Core/ObjectHandle.hpp b/include/Nazara/Core/ObjectHandle.hpp index d7a53e281..b3cc080dd 100644 --- a/include/Nazara/Core/ObjectHandle.hpp +++ b/include/Nazara/Core/ObjectHandle.hpp @@ -23,6 +23,7 @@ namespace Nz ObjectHandle(); explicit ObjectHandle(T* object); ObjectHandle(const ObjectHandle& handle); + ObjectHandle(ObjectHandle&& handle) noexcept; ~ObjectHandle(); T* GetObject() const; @@ -31,6 +32,7 @@ namespace Nz void Reset(T* object = nullptr); void Reset(const ObjectHandle& handle); + void Reset(ObjectHandle&& handle) noexcept; ObjectHandle& Swap(ObjectHandle& handle); @@ -42,6 +44,7 @@ namespace Nz ObjectHandle& operator=(T* object); ObjectHandle& operator=(const ObjectHandle& handle); + ObjectHandle& operator=(ObjectHandle&& handle) noexcept; static const ObjectHandle InvalidHandle; diff --git a/include/Nazara/Core/ObjectHandle.inl b/include/Nazara/Core/ObjectHandle.inl index 752cb96c0..ef89828e3 100644 --- a/include/Nazara/Core/ObjectHandle.inl +++ b/include/Nazara/Core/ObjectHandle.inl @@ -24,11 +24,18 @@ namespace Nz template ObjectHandle::ObjectHandle(const ObjectHandle& handle) : - ObjectHandle() + ObjectHandle() { Reset(handle); } + template + ObjectHandle::ObjectHandle(ObjectHandle&& handle) noexcept : + ObjectHandle() + { + Reset(std::move(handle)); + } + template ObjectHandle::~ObjectHandle() { @@ -66,6 +73,19 @@ namespace Nz Reset(handle.GetObject()); } + template + void ObjectHandle::Reset(ObjectHandle&& handle) noexcept + { + if (m_object) + m_object->UnregisterHandle(this); + + if (T* object = handle.GetObject()) + { + object->UpdateHandle(&handle, this); + handle.m_object = nullptr; + } + } + template ObjectHandle& ObjectHandle::Swap(ObjectHandle& handle) { @@ -138,6 +158,14 @@ namespace Nz return *this; } + template + ObjectHandle& ObjectHandle::operator=(ObjectHandle&& handle) noexcept + { + Reset(std::move(handle)); + + return *this; + } + template void ObjectHandle::OnObjectDestroyed() {