Core/MemoryHelper: Improve PlacementNew interface

Make it possible to deduce type from arguments


Former-commit-id: ed25b667fcacefcc39fddcb941ea11c40e6ce22b
This commit is contained in:
Lynix 2016-04-24 19:48:12 +02:00
parent b5f237b58f
commit 6d66063b2c
6 changed files with 9 additions and 9 deletions

View File

@ -15,7 +15,7 @@ namespace Nz
void* OperatorNew(std::size_t size); void* OperatorNew(std::size_t size);
template<typename T, typename... Args> template<typename T, typename... Args>
T* PlacementNew(void* ptr, Args&&... args); T* PlacementNew(T* ptr, Args&&... args);
} }
#include <Nazara/Core/MemoryHelper.inl> #include <Nazara/Core/MemoryHelper.inl>

View File

@ -58,7 +58,7 @@ namespace Nz
* \param args Arguments for the constructor * \param args Arguments for the constructor
*/ */
template<typename T, typename... Args> template<typename T, typename... Args>
T* PlacementNew(void* ptr, Args&&... args) T* PlacementNew(T* ptr, Args&&... args)
{ {
return new (ptr) T(std::forward<Args>(args)...); return new (ptr) T(std::forward<Args>(args)...);
} }

View File

@ -191,7 +191,7 @@ namespace Nz
inline T* MemoryPool::New(Args&&... args) inline T* MemoryPool::New(Args&&... args)
{ {
T* object = static_cast<T*>(Allocate(sizeof(T))); T* object = static_cast<T*>(Allocate(sizeof(T)));
PlacementNew<T>(object, std::forward<Args>(args)...); PlacementNew(object, std::forward<Args>(args)...);
return object; return object;
} }

View File

@ -54,8 +54,8 @@ namespace Nz
// cette UserData disposera d'un finalizer qui libérera le ClassInfo // cette UserData disposera d'un finalizer qui libérera le ClassInfo
// Ainsi c'est Lua qui va s'occuper de la destruction pour nous :-) // 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 // 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<ClassInfo>)); std::shared_ptr<ClassInfo>* info = static_cast<std::shared_ptr<ClassInfo>*>(lua.PushUserdata(sizeof(std::shared_ptr<ClassInfo>)));
PlacementNew<std::shared_ptr<ClassInfo>>(info, m_info); PlacementNew(info, m_info);
// On créé la table qui contiendra une méthode (Le finalizer) pour libérer le ClassInfo // On créé la table qui contiendra une méthode (Le finalizer) pour libérer le ClassInfo
lua.PushTable(0, 1); lua.PushTable(0, 1);

View File

@ -449,7 +449,7 @@ namespace Nz
Parameter& parameter = CreateValue(name); Parameter& parameter = CreateValue(name);
parameter.type = ParameterType_String; parameter.type = ParameterType_String;
PlacementNew<String>(&parameter.value.stringVal, value); PlacementNew(&parameter.value.stringVal, value);
} }
/*! /*!
@ -464,7 +464,7 @@ namespace Nz
Parameter& parameter = CreateValue(name); Parameter& parameter = CreateValue(name);
parameter.type = ParameterType_String; parameter.type = ParameterType_String;
PlacementNew<String>(&parameter.value.stringVal, value); PlacementNew(&parameter.value.stringVal, value);
} }
/*! /*!
@ -565,7 +565,7 @@ namespace Nz
case ParameterType_String: case ParameterType_String:
parameter.type = ParameterType_String; parameter.type = ParameterType_String;
PlacementNew<String>(&parameter.value.stringVal, it->second.value.stringVal); PlacementNew(&parameter.value.stringVal, it->second.value.stringVal);
break; break;
case ParameterType_Userdata: case ParameterType_Userdata:

View File

@ -634,7 +634,7 @@ namespace Nz
void LuaInstance::PushFunction(LuaFunction func) const void LuaInstance::PushFunction(LuaFunction func) const
{ {
LuaFunction* luaFunc = static_cast<LuaFunction*>(lua_newuserdata(m_state, sizeof(LuaFunction))); LuaFunction* luaFunc = static_cast<LuaFunction*>(lua_newuserdata(m_state, sizeof(LuaFunction)));
PlacementNew<LuaFunction>(luaFunc, std::move(func)); PlacementNew(luaFunc, std::move(func));
lua_pushcclosure(m_state, ProxyFunc, 1); lua_pushcclosure(m_state, ProxyFunc, 1);
} }