diff --git a/include/Nazara/Core/MemoryHelper.hpp b/include/Nazara/Core/MemoryHelper.hpp new file mode 100644 index 000000000..472f10f9d --- /dev/null +++ b/include/Nazara/Core/MemoryHelper.hpp @@ -0,0 +1,20 @@ +// Copyright (C) 2014 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 + +#pragma once + +#ifndef NAZARA_MEMORYHELPER_HPP +#define NAZARA_MEMORYHELPER_HPP + +#include + +void NzOperatorDelete(void* ptr); +void* NzOperatorNew(std::size_t size); + +template +T* NzPlacementNew(void* ptr, Args... args); + +#include + +#endif // NAZARA_MEMORYHELPER_HPP diff --git a/include/Nazara/Core/MemoryHelper.inl b/include/Nazara/Core/MemoryHelper.inl new file mode 100644 index 000000000..0e27c5462 --- /dev/null +++ b/include/Nazara/Core/MemoryHelper.inl @@ -0,0 +1,45 @@ +// Copyright (C) 2014 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 + +// Je ne suis pas fier des cinq lignes qui suivent mais difficile de faire autrement pour le moment... +#ifdef NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION + #define NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION_DEFINED +#else + #define NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION +#endif + +#include +#include +#include + +inline void NzOperatorDelete(void* ptr) +{ + #if NAZARA_CORE_MANAGE_MEMORY + NzMemoryManager::Free(ptr); + #else + operator delete(ptr); + #endif +} + +inline void* NzOperatorNew(std::size_t size) +{ + #if NAZARA_CORE_MANAGE_MEMORY + return NzMemoryManager::Allocate(size); + #else + return operator new(size); + #endif +} + +template +T* NzPlacementNew(void* ptr, Args... args) +{ + return new (ptr) T(args...); +} + +#include + +// Si c'est nous qui avons défini la constante, alors il nous faut l'enlever (Pour éviter que le moteur entier n'en souffre) +#ifndef NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION_DEFINED + #undef NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION +#endif diff --git a/include/Nazara/Core/MemoryPool.inl b/include/Nazara/Core/MemoryPool.inl index 5521e790d..8e8034814 100644 --- a/include/Nazara/Core/MemoryPool.inl +++ b/include/Nazara/Core/MemoryPool.inl @@ -2,14 +2,7 @@ // This file is part of the "Nazara Engine - Core module" // For conditions of distribution and use, see copyright notice in Config.hpp -// Je ne suis pas fier des cinq lignes qui suivent mais difficile de faire autrement pour le moment... -#ifdef NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION - #define NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION_DEFINED -#else - #define NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION -#endif - -#include +#include #include template @@ -58,7 +51,7 @@ void* NzMemoryPool::Allocate(unsigned int size) } } - return operator new(size); + return NzOperatorNew(size); } template @@ -93,7 +86,7 @@ void NzMemoryPool::Free(void* ptr) if (m_next) m_next->Free(ptr); else - operator delete(ptr); + NzOperatorDelete(ptr); } } } @@ -111,8 +104,3 @@ unsigned int NzMemoryPool::GetSize() const } #include - -// Si c'est nous qui avons défini la constante, alors il nous faut l'enlever (Pour éviter que le moteur entier n'en souffre) -#ifndef NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION_DEFINED - #undef NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION -#endif diff --git a/include/Nazara/Lua/LuaClass.inl b/include/Nazara/Lua/LuaClass.inl index ac79d2468..a63adc081 100644 --- a/include/Nazara/Lua/LuaClass.inl +++ b/include/Nazara/Lua/LuaClass.inl @@ -4,6 +4,7 @@ #include #include +#include #include template @@ -31,7 +32,7 @@ void NzLuaClass::Register(NzLuaInstance& lua) // Ainsi c'est Lua qui va s'occuper de la destruction pour nous :-) // De même, l'utilisation d'un shared_ptr permet de garder la structure en vie même si l'instance est libérée avant le LuaClass void* info = lua.PushUserdata(sizeof(std::shared_ptr)); - new (info) std::shared_ptr(m_info); + NzPlacementNew>(info, m_info); // On créé la table qui contiendra une méthode (Le finalizer) pour libérer le ClassInfo lua.PushTable(0, 1); diff --git a/src/Nazara/Core/Debug/NewRedefinition.cpp b/src/Nazara/Core/Debug/NewRedefinition.cpp index b4c06b816..b5707192e 100644 --- a/src/Nazara/Core/Debug/NewRedefinition.cpp +++ b/src/Nazara/Core/Debug/NewRedefinition.cpp @@ -5,12 +5,12 @@ #include #if NAZARA_CORE_MANAGE_MEMORY -#define NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION - -#include #include #include // Nécessaire ? +#define NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION +#include + void* operator new(std::size_t size, const char* file, unsigned int line) { return NzMemoryManager::Allocate(size, false, file, line); diff --git a/src/Nazara/Core/ParameterList.cpp b/src/Nazara/Core/ParameterList.cpp index ba0e7322e..6ac8e9c54 100644 --- a/src/Nazara/Core/ParameterList.cpp +++ b/src/Nazara/Core/ParameterList.cpp @@ -2,11 +2,9 @@ // This file is part of the "Nazara Engine - Core module" // For conditions of distribution and use, see copyright notice in Config.hpp -// Notre utilisation du placement new n'est pas (encore ?) compatible avec les définitions du MLT -#define NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION - #include #include +#include #include #include #include @@ -309,7 +307,7 @@ void NzParameterList::SetParameter(const NzString& name, const NzString& value) parameter.type = nzParameterType_String; - new (¶meter.value.stringVal) NzString(value); + NzPlacementNew(¶meter.value.stringVal, value); } void NzParameterList::SetParameter(const NzString& name, const char* value) @@ -322,7 +320,7 @@ void NzParameterList::SetParameter(const NzString& name, const char* value) parameter.type = nzParameterType_String; - new (¶meter.value.stringVal) NzString(value); + NzPlacementNew(¶meter.value.stringVal, value); } void NzParameterList::SetParameter(const NzString& name, void* value) @@ -405,7 +403,7 @@ NzParameterList& NzParameterList::operator=(const NzParameterList& list) case nzParameterType_String: parameter.type = nzParameterType_String; - new (¶meter.value.stringVal) NzString(it->second.value.stringVal); + NzPlacementNew(¶meter.value.stringVal, it->second.value.stringVal); break; case nzParameterType_Userdata: diff --git a/src/Nazara/Lua/LuaInstance.cpp b/src/Nazara/Lua/LuaInstance.cpp index 2db6aeb80..f6436138b 100644 --- a/src/Nazara/Lua/LuaInstance.cpp +++ b/src/Nazara/Lua/LuaInstance.cpp @@ -2,8 +2,6 @@ // This file is part of the "Nazara Engine - Lua scripting module" // For conditions of distribution and use, see copyright notice in Config.hpp -#define NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION - #include #include #include @@ -11,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -621,7 +620,7 @@ void NzLuaInstance::PushCFunction(NzLuaCFunction func, int upvalueCount) void NzLuaInstance::PushFunction(NzLuaFunction func) { NzLuaFunction* luaFunc = reinterpret_cast(lua_newuserdata(m_state, sizeof(NzLuaFunction))); - new (luaFunc) NzLuaFunction(std::move(func)); + NzPlacementNew(luaFunc, std::move(func)); lua_pushcclosure(m_state, ProxyFunc, 1); }