Core/MemoryHelper: Improve PlacementNew interface
Make it possible to deduce type from arguments Former-commit-id: ed25b667fcacefcc39fddcb941ea11c40e6ce22b
This commit is contained in:
parent
b5f237b58f
commit
6d66063b2c
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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)...);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -449,7 +449,7 @@ namespace Nz
|
||||||
Parameter& parameter = CreateValue(name);
|
Parameter& parameter = CreateValue(name);
|
||||||
parameter.type = ParameterType_String;
|
parameter.type = ParameterType_String;
|
||||||
|
|
||||||
PlacementNew<String>(¶meter.value.stringVal, value);
|
PlacementNew(¶meter.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>(¶meter.value.stringVal, value);
|
PlacementNew(¶meter.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>(¶meter.value.stringVal, it->second.value.stringVal);
|
PlacementNew(¶meter.value.stringVal, it->second.value.stringVal);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ParameterType_Userdata:
|
case ParameterType_Userdata:
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue