diff --git a/SDK/include/NDK/LuaAPI.inl b/SDK/include/NDK/LuaAPI.inl index 1652d5719..a0a180ff9 100644 --- a/SDK/include/NDK/LuaAPI.inl +++ b/SDK/include/NDK/LuaAPI.inl @@ -271,25 +271,25 @@ namespace Nz - inline int LuaImplReplyVal(const LuaInstance& instance, EulerAnglesd val, TypeTag) + inline int LuaImplReplyVal(const LuaInstance& instance, EulerAnglesd&& val, TypeTag) { instance.PushInstance("EulerAngles", val); return 1; } - inline int LuaImplReplyVal(const LuaInstance& instance, EulerAnglesf val, TypeTag) + inline int LuaImplReplyVal(const LuaInstance& instance, EulerAnglesf&& val, TypeTag) { instance.PushInstance("EulerAngles", val); return 1; } - inline int LuaImplReplyVal(const LuaInstance& instance, FontRef val, TypeTag) + inline int LuaImplReplyVal(const LuaInstance& instance, FontRef&& val, TypeTag) { instance.PushInstance("Font", val); return 1; } - inline int LuaImplReplyVal(const LuaInstance& instance, Font::SizeInfo val, TypeTag) + inline int LuaImplReplyVal(const LuaInstance& instance, Font::SizeInfo&& val, TypeTag) { instance.PushTable(); instance.PushField("LineHeight", val.lineHeight); @@ -300,55 +300,55 @@ namespace Nz return 1; } - inline int LuaImplReplyVal(const LuaInstance& instance, Quaterniond val, TypeTag) + inline int LuaImplReplyVal(const LuaInstance& instance, Quaterniond&& val, TypeTag) { instance.PushInstance("Quaternion", val); return 1; } - inline int LuaImplReplyVal(const LuaInstance& instance, Quaternionf val, TypeTag) + inline int LuaImplReplyVal(const LuaInstance& instance, Quaternionf&& val, TypeTag) { instance.PushInstance("Quaternion", val); return 1; } - inline int LuaImplReplyVal(const LuaInstance& instance, IpAddress val, TypeTag) + inline int LuaImplReplyVal(const LuaInstance& instance, IpAddress&& val, TypeTag) { instance.PushInstance("IpAddress", val); return 1; } - inline int LuaImplReplyVal(const LuaInstance& instance, Vector2d val, TypeTag) + inline int LuaImplReplyVal(const LuaInstance& instance, Vector2d&& val, TypeTag) { instance.PushInstance("Vector2", val); return 1; } - inline int LuaImplReplyVal(const LuaInstance& instance, Vector2f val, TypeTag) + inline int LuaImplReplyVal(const LuaInstance& instance, Vector2f&& val, TypeTag) { instance.PushInstance("Vector2", val); return 1; } - inline int LuaImplReplyVal(const LuaInstance& instance, Vector2ui val, TypeTag) + inline int LuaImplReplyVal(const LuaInstance& instance, Vector2ui&& val, TypeTag) { instance.PushInstance("Vector2", val); return 1; } - inline int LuaImplReplyVal(const LuaInstance& instance, Vector3d val, TypeTag) + inline int LuaImplReplyVal(const LuaInstance& instance, Vector3d&& val, TypeTag) { instance.PushInstance("Vector3", val); return 1; } - inline int LuaImplReplyVal(const LuaInstance& instance, Vector3f val, TypeTag) + inline int LuaImplReplyVal(const LuaInstance& instance, Vector3f&& val, TypeTag) { instance.PushInstance("Vector3", val); return 1; } - inline int LuaImplReplyVal(const LuaInstance& instance, Vector3ui val, TypeTag) + inline int LuaImplReplyVal(const LuaInstance& instance, Vector3ui&& val, TypeTag) { instance.PushInstance("Vector3", val); return 1; @@ -366,19 +366,19 @@ namespace Nz return 1; } - inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::EntityHandle handle, TypeTag) + inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::EntityHandle&& handle, TypeTag) { instance.PushInstance("Entity", handle); return 1; } - inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::NodeComponentHandle handle, TypeTag) + inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::NodeComponentHandle&& handle, TypeTag) { instance.PushInstance("NodeComponent", handle); return 1; } - inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::VelocityComponentHandle handle, TypeTag) + inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::VelocityComponentHandle&& handle, TypeTag) { instance.PushInstance("VelocityComponent", handle); return 1; @@ -390,20 +390,20 @@ namespace Nz return 1; } - inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::WorldHandle handle, TypeTag) + inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::WorldHandle&& handle, TypeTag) { instance.PushInstance("World", handle); return 1; } #ifndef NDK_SERVER - inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::ConsoleHandle handle, TypeTag) + inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::ConsoleHandle&& handle, TypeTag) { instance.PushInstance("Console", handle); return 1; } - inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::GraphicsComponentHandle handle, TypeTag) + inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::GraphicsComponentHandle&& handle, TypeTag) { instance.PushInstance("GraphicsComponent", handle); return 1; diff --git a/SDK/src/NDK/LuaBinding_Audio.cpp b/SDK/src/NDK/LuaBinding_Audio.cpp index 7c204b833..d75c8215e 100644 --- a/SDK/src/NDK/LuaBinding_Audio.cpp +++ b/SDK/src/NDK/LuaBinding_Audio.cpp @@ -1,6 +1,7 @@ // This file was automatically generated on 26 May 2014 at 01:05:31 #include +#include #include namespace Ndk @@ -10,10 +11,7 @@ namespace Ndk /*********************************** Nz::Music **********************************/ musicClass.Inherit(soundEmitter); - musicClass.SetConstructor([] (Nz::LuaInstance& lua) -> Nz::Music* - { - return new Nz::Music; - }); + musicClass.BindDefaultConstructor(); //musicClass.SetMethod("Create", &Nz::Music::Create); //musicClass.SetMethod("Destroy", &Nz::Music::Destroy); @@ -51,10 +49,7 @@ namespace Ndk /*********************************** Nz::Sound **********************************/ soundClass.Inherit(soundEmitter); - soundClass.SetConstructor([] (Nz::LuaInstance& lua) -> Nz::Sound* - { - return new Nz::Sound; - }); + soundClass.BindDefaultConstructor(); soundClass.BindMethod("GetBuffer", &Nz::Sound::GetBuffer); @@ -79,9 +74,10 @@ namespace Ndk }); /*********************************** Nz::SoundBuffer **********************************/ - soundBuffer.SetConstructor([] (Nz::LuaInstance& lua) -> Nz::SoundBufferRef* + soundBuffer.SetConstructor([] (Nz::LuaInstance& lua, Nz::SoundBufferRef* instance) { - return new Nz::SoundBufferRef(new Nz::SoundBuffer); + Nz::PlacementNew(instance, Nz::SoundBuffer::New()); + return true; }); soundBuffer.BindMethod("Destroy", &Nz::SoundBuffer::Destroy); diff --git a/SDK/src/NDK/LuaBinding_Core.cpp b/SDK/src/NDK/LuaBinding_Core.cpp index 16e8f66f6..09cbda604 100644 --- a/SDK/src/NDK/LuaBinding_Core.cpp +++ b/SDK/src/NDK/LuaBinding_Core.cpp @@ -1,6 +1,7 @@ // This file was automatically generated on 26 May 2014 at 01:05:31 #include +#include #include namespace Ndk @@ -8,10 +9,14 @@ namespace Ndk void LuaBinding::BindCore() { /*********************************** Nz::Clock **********************************/ - clockClass.SetConstructor([](Nz::LuaInstance& lua) -> Nz::Clock* + clockClass.SetConstructor([](Nz::LuaInstance& lua, Nz::Clock* clock) { int argIndex = 1; - return new Nz::Clock(lua.Check(&argIndex, 0), lua.Check(&argIndex, false)); + Nz::Int64 startingValue = lua.Check(&argIndex, 0); + bool paused = lua.Check(&argIndex, false); + + Nz::PlacementNew(clock, startingValue, paused); + return true; }); clockClass.BindMethod("GetMicroseconds", &Nz::Clock::GetMicroseconds); @@ -35,7 +40,7 @@ namespace Ndk }); /********************************* Nz::Directory ********************************/ - directoryClass.SetConstructor([](Nz::LuaInstance& lua) -> Nz::Directory* + directoryClass.SetConstructor([](Nz::LuaInstance& lua, Nz::Directory* directory) { unsigned int argCount = std::min(lua.GetStackTop(), 1U); @@ -43,13 +48,15 @@ namespace Ndk switch (argCount) { case 0: - return new Nz::Directory; + Nz::PlacementNew(directory); + return true; case 1: - return new Nz::Directory(lua.Check(&argIndex)); + Nz::PlacementNew(directory, lua.Check(&argIndex)); + return true; } - return nullptr; + return false; }); directoryClass.BindMethod("Close", &Nz::Directory::Close); @@ -127,7 +134,7 @@ namespace Ndk /*********************************** Nz::File ***********************************/ fileClass.Inherit(streamClass); - fileClass.SetConstructor([](Nz::LuaInstance& lua) -> Nz::File* + fileClass.SetConstructor([](Nz::LuaInstance& lua, Nz::File* file) { unsigned int argCount = std::min(lua.GetStackTop(), 2U); @@ -135,20 +142,29 @@ namespace Ndk switch (argCount) { case 0: - return new Nz::File; + Nz::PlacementNew(file); + return true; case 1: - return new Nz::File(lua.Check(&argIndex)); + { + Nz::String filePath = lua.Check(&argIndex); + + Nz::PlacementNew(file, filePath); + return true; + } case 2: { Nz::String filePath = lua.Check(&argIndex); Nz::UInt32 openMode = lua.Check(&argIndex); - return new Nz::File(filePath, openMode); + + Nz::PlacementNew(file, filePath, openMode); + return true; } } - return nullptr; + lua.Error("No matching overload for File constructor"); + return false; }); fileClass.BindMethod("Close", &Nz::File::Close); diff --git a/SDK/src/NDK/LuaBinding_Graphics.cpp b/SDK/src/NDK/LuaBinding_Graphics.cpp index 3d7597dd5..289002746 100644 --- a/SDK/src/NDK/LuaBinding_Graphics.cpp +++ b/SDK/src/NDK/LuaBinding_Graphics.cpp @@ -16,9 +16,10 @@ namespace Ndk return reinterpret_cast(model); //TODO: Make a ObjectRefCast }); - modelClass.SetConstructor([] (Nz::LuaInstance& lua) -> Nz::ModelRef* + modelClass.SetConstructor([] (Nz::LuaInstance& lua, Nz::ModelRef* model) { - return new Nz::ModelRef(new Nz::Model); + Nz::PlacementNew(model, Nz::Model::New()); + return true; }); //modelClass.SetMethod("GetMaterial", &Nz::Model::GetMaterial); diff --git a/SDK/src/NDK/LuaBinding_Math.cpp b/SDK/src/NDK/LuaBinding_Math.cpp index 808c93f86..001eb1c73 100644 --- a/SDK/src/NDK/LuaBinding_Math.cpp +++ b/SDK/src/NDK/LuaBinding_Math.cpp @@ -1,6 +1,7 @@ // This file was automatically generated on 26 May 2014 at 01:05:31 #include +#include #include #include @@ -9,23 +10,26 @@ namespace Ndk void LuaBinding::BindMath() { /*********************************** Nz::EulerAngles **********************************/ - eulerAnglesClass.SetConstructor([] (Nz::LuaInstance& lua) -> Nz::EulerAnglesd* + eulerAnglesClass.SetConstructor([] (Nz::LuaInstance& lua, Nz::EulerAnglesd* angles) { unsigned int argCount = std::min(lua.GetStackTop(), 3U); switch (argCount) { case 0: - return new Nz::EulerAnglesd(0.0, 0.0, 0.0); + Nz::PlacementNew(angles, Nz::EulerAnglesd::Zero()); + return true; case 1: - return new Nz::EulerAnglesd(*(*static_cast(lua.CheckUserdata(1, "EulerAngles")))); + Nz::PlacementNew(angles, *static_cast(lua.CheckUserdata(1, "EulerAngles"))); + return true; case 3: - return new Nz::EulerAnglesd(lua.CheckNumber(1), lua.CheckNumber(2), lua.CheckNumber(3)); + Nz::PlacementNew(angles, lua.CheckNumber(1), lua.CheckNumber(2), lua.CheckNumber(3)); + return true; } lua.Error("No matching overload for EulerAngles constructor"); - return nullptr; + return false; }); eulerAnglesClass.BindMethod("__tostring", &Nz::EulerAnglesd::ToString); @@ -146,31 +150,38 @@ namespace Ndk }); /*********************************** Nz::Quaternion **********************************/ - quaternionClass.SetConstructor([] (Nz::LuaInstance& lua) -> Nz::Quaterniond* + quaternionClass.SetConstructor([] (Nz::LuaInstance& lua, Nz::Quaterniond* quaternion) { unsigned int argCount = std::min(lua.GetStackTop(), 4U); switch (argCount) { case 0: - return new Nz::Quaterniond(1.0, 0.0, 0.0, 0.0); + Nz::PlacementNew(quaternion, Nz::Quaterniond::Zero()); + return true; case 1: { if (lua.IsOfType(1, "EulerAngles")) - return new Nz::Quaterniond(*(*static_cast(lua.ToUserdata(1)))); + Nz::PlacementNew(quaternion, *static_cast(lua.ToUserdata(1))); else if (lua.IsOfType(1, "Quaternion")) - return new Nz::Quaterniond(*(*static_cast(lua.ToUserdata(1)))); + Nz::PlacementNew(quaternion, *static_cast(lua.ToUserdata(1))); + else + break; + + return true; } case 2: - return new Nz::Quaterniond(lua.CheckNumber(1), *(*static_cast(lua.CheckUserdata(2, "Vector3")))); + Nz::PlacementNew(quaternion, lua.CheckNumber(1), *(*static_cast(lua.CheckUserdata(2, "Vector3")))); + return true; case 4: - return new Nz::Quaterniond(lua.CheckNumber(1), lua.CheckNumber(2), lua.CheckNumber(3), lua.CheckNumber(4)); + Nz::PlacementNew(quaternion, lua.CheckNumber(1), lua.CheckNumber(2), lua.CheckNumber(3), lua.CheckNumber(4)); + return true; } lua.Error("No matching overload for Quaternion constructor"); - return nullptr; + return false; }); quaternionClass.BindMethod("__tostring", &Nz::Quaterniond::ToString); @@ -238,28 +249,31 @@ namespace Ndk }); /*********************************** Nz::Vector2 **********************************/ - vector2dClass.SetConstructor([](Nz::LuaInstance& lua) -> Nz::Vector2d* + vector2dClass.SetConstructor([](Nz::LuaInstance& lua, Nz::Vector2d* vector) { unsigned int argCount = std::min(lua.GetStackTop(), 2U); switch (argCount) { case 0: case 2: - return new Nz::Vector2d(lua.CheckNumber(1, 0.0), lua.CheckNumber(2, 0.0)); + Nz::PlacementNew(vector, lua.CheckNumber(1, 0.0), lua.CheckNumber(2, 0.0)); + return true; case 1: { if (lua.IsOfType(1, Nz::LuaType_Number)) - return new Nz::Vector2d(lua.CheckNumber(1)); + Nz::PlacementNew(vector, lua.CheckNumber(1)); else if (lua.IsOfType(1, "Vector2")) - return new Nz::Vector2d(*(*static_cast(lua.ToUserdata(1)))); + Nz::PlacementNew(vector, *static_cast(lua.ToUserdata(1))); + else + break; - break; + return true; } } lua.Error("No matching overload for Vector2 constructor"); - return nullptr; + return false; }); vector2dClass.BindMethod("__tostring", &Nz::Vector2d::ToString); @@ -345,40 +359,44 @@ namespace Ndk }); /*********************************** Nz::Vector3 **********************************/ - vector3dClass.SetConstructor([] (Nz::LuaInstance& lua) -> Nz::Vector3d* + vector3dClass.SetConstructor([] (Nz::LuaInstance& lua, Nz::Vector3d* vector) { unsigned int argCount = std::min(lua.GetStackTop(), 3U); switch (argCount) { case 0: case 3: - return new Nz::Vector3d(lua.CheckNumber(1, 0.0), lua.CheckNumber(2, 0.0), lua.CheckNumber(3, 0.0)); + Nz::PlacementNew(vector, lua.CheckNumber(1, 0.0), lua.CheckNumber(2, 0.0), lua.CheckNumber(3, 0.0)); case 1: { if (lua.IsOfType(1, Nz::LuaType_Number)) - return new Nz::Vector3d(lua.CheckNumber(1), *(*static_cast(lua.ToUserdata(1)))); + Nz::PlacementNew(vector, lua.CheckNumber(1), *static_cast(lua.ToUserdata(1))); else if (lua.IsOfType(1, "Vector2")) - return new Nz::Vector3d(*(*static_cast(lua.ToUserdata(1)))); + Nz::PlacementNew(vector, *static_cast(lua.ToUserdata(1))); else if (lua.IsOfType(1, "Vector3")) - return new Nz::Vector3d(*(*static_cast(lua.ToUserdata(1)))); + Nz::PlacementNew(vector, *static_cast(lua.ToUserdata(1))); + else + break; - break; + return true; } case 2: { if (lua.IsOfType(1, Nz::LuaType_Number)) - return new Nz::Vector3d(lua.CheckNumber(1), *(*static_cast(lua.CheckUserdata(1, "Vector2")))); + Nz::PlacementNew(vector, lua.CheckNumber(1), *static_cast(lua.CheckUserdata(1, "Vector2"))); else if (lua.IsOfType(1, "Vector2")) - return new Nz::Vector3d(*(*static_cast(lua.ToUserdata(1))), lua.CheckNumber(2)); + Nz::PlacementNew(vector, *static_cast(lua.ToUserdata(1)), lua.CheckNumber(2)); + else + break; - break; + return true; } } lua.Error("No matching overload for constructor"); - return nullptr; + return false; }); vector3dClass.BindMethod("__tostring", &Nz::Vector3d::ToString); diff --git a/SDK/src/NDK/LuaBinding_Network.cpp b/SDK/src/NDK/LuaBinding_Network.cpp index e7673b86c..dc17c5d00 100644 --- a/SDK/src/NDK/LuaBinding_Network.cpp +++ b/SDK/src/NDK/LuaBinding_Network.cpp @@ -17,7 +17,7 @@ namespace Ndk abstractSocketClass.BindMethod("QueryAvailableBytes", &Nz::AbstractSocket::QueryAvailableBytes); /*********************************** Nz::IpAddress **********************************/ - ipAddressClass.SetConstructor([] (Nz::LuaInstance& lua) -> Nz::IpAddress* + ipAddressClass.SetConstructor([] (Nz::LuaInstance& lua, Nz::IpAddress* address) { unsigned int argCount = std::min(lua.GetStackTop(), 9U); @@ -25,30 +25,54 @@ namespace Ndk switch (argCount) { case 0: - return new Nz::IpAddress; + Nz::PlacementNew(address); + return true; case 1: - return new Nz::IpAddress(lua.CheckString(argIndex)); + Nz::PlacementNew(address, lua.CheckString(argIndex)); + return true; case 4: case 5: - return new Nz::IpAddress(lua.Check(&argIndex), lua.Check(&argIndex), lua.Check(&argIndex), lua.Check(&argIndex), lua.Check(&argIndex, 0)); + { + Nz::UInt8 a = lua.Check(&argIndex); + Nz::UInt8 b = lua.Check(&argIndex); + Nz::UInt8 c = lua.Check(&argIndex); + Nz::UInt8 d = lua.Check(&argIndex); + Nz::UInt16 port = lua.Check(&argIndex, 0); + + Nz::PlacementNew(address, a, b, c, d, port); + return true; + } case 8: case 9: - return new Nz::IpAddress(lua.Check(&argIndex), lua.Check(&argIndex), lua.Check(&argIndex), lua.Check(&argIndex), - lua.Check(&argIndex), lua.Check(&argIndex), lua.Check(&argIndex), lua.Check(&argIndex), lua.Check(&argIndex, 0)); + { + Nz::UInt16 a = lua.Check(&argIndex); + Nz::UInt16 b = lua.Check(&argIndex); + Nz::UInt16 c = lua.Check(&argIndex); + Nz::UInt16 d = lua.Check(&argIndex); + Nz::UInt16 e = lua.Check(&argIndex); + Nz::UInt16 f = lua.Check(&argIndex); + Nz::UInt16 g = lua.Check(&argIndex); + Nz::UInt16 h = lua.Check(&argIndex); + Nz::UInt16 port = lua.Check(&argIndex, 0); + + Nz::PlacementNew(address, a, b, c, d, e, f, g, h, port); + return true; + } } - return nullptr; + lua.Error("No matching overload for constructor"); + return false; }); - ipAddressClass.BindMethod("GetPort", &Nz::IpAddress::GetPort); + ipAddressClass.BindMethod("GetPort", &Nz::IpAddress::GetPort); ipAddressClass.BindMethod("GetProtocol", &Nz::IpAddress::GetProtocol); - ipAddressClass.BindMethod("IsLoopback", &Nz::IpAddress::IsLoopback); - ipAddressClass.BindMethod("IsValid", &Nz::IpAddress::IsValid); - ipAddressClass.BindMethod("ToUInt32", &Nz::IpAddress::ToUInt32); - ipAddressClass.BindMethod("__tostring", &Nz::IpAddress::ToString); + ipAddressClass.BindMethod("IsLoopback", &Nz::IpAddress::IsLoopback); + ipAddressClass.BindMethod("IsValid", &Nz::IpAddress::IsValid); + ipAddressClass.BindMethod("ToUInt32", &Nz::IpAddress::ToUInt32); + ipAddressClass.BindMethod("__tostring", &Nz::IpAddress::ToString); ipAddressClass.BindStaticMethod("ResolveAddress", [] (Nz::LuaInstance& instance) -> int { @@ -79,7 +103,7 @@ namespace Ndk int argIndex = 1; Nz::NetProtocol protocol = instance.Check(&argIndex); Nz::String hostname = instance.Check(&argIndex); - Nz::String service = instance.Check(&argIndex, "http"); + Nz::String service = instance.Check(&argIndex, "http"); std::vector addresses = Nz::IpAddress::ResolveHostname(protocol, hostname, service, &error); if (error == Nz::ResolveError_NoError) diff --git a/SDK/src/NDK/LuaBinding_Utility.cpp b/SDK/src/NDK/LuaBinding_Utility.cpp index 8ffa7824d..4ccb18fa6 100644 --- a/SDK/src/NDK/LuaBinding_Utility.cpp +++ b/SDK/src/NDK/LuaBinding_Utility.cpp @@ -89,9 +89,10 @@ namespace Ndk }); /*********************************** Nz::Font **********************************/ - fontClass.SetConstructor([] (Nz::LuaInstance& lua) -> Nz::FontRef* + fontClass.SetConstructor([] (Nz::LuaInstance& lua, Nz::FontRef* font) { - return new Nz::FontRef(new Nz::Font); + Nz::PlacementNew(font, Nz::Font::New()); + return true; }); fontClass.BindMethod("ClearGlyphCache", &Nz::Font::ClearGlyphCache); diff --git a/include/Nazara/Lua/LuaClass.hpp b/include/Nazara/Lua/LuaClass.hpp index 8f9990bef..b872ad2f7 100644 --- a/include/Nazara/Lua/LuaClass.hpp +++ b/include/Nazara/Lua/LuaClass.hpp @@ -28,7 +28,7 @@ namespace Nz public: using ClassFunc = std::function; using ClassIndexFunc = std::function; - using ConstructorFunc = std::function; + using ConstructorFunc = std::function; template using ConvertToParent = std::function; using FinalizerFunc = std::function; using StaticIndexFunc = std::function; @@ -36,6 +36,8 @@ namespace Nz LuaClass(const String& name); + void BindDefaultConstructor(); + void BindMethod(const String& name, ClassFunc method); template std::enable_if_t::value> BindMethod(const String& name, R(P::*func)(Args...), DefArgs&&... defArgs); template std::enable_if_t::value> BindMethod(const String& name, R(P::*func)(Args...) const, DefArgs&&... defArgs); diff --git a/include/Nazara/Lua/LuaClass.inl b/include/Nazara/Lua/LuaClass.inl index edb7103b6..710b50416 100644 --- a/include/Nazara/Lua/LuaClass.inl +++ b/include/Nazara/Lua/LuaClass.inl @@ -16,6 +16,16 @@ namespace Nz m_info->name = name; } + template + inline void LuaClass::BindDefaultConstructor() + { + SetConstructor([] (Nz::LuaInstance& lua, T* instance) + { + PlacementNew(instance); + return true; + }); + } + template template inline void LuaClass::Inherit(LuaClass

& parent) @@ -36,7 +46,7 @@ namespace Nz parentInfo->instanceGetters[m_info->name] = [info = m_info, convertFunc] (LuaInstance& lua) -> P* { - return convertFunc(*static_cast(lua.CheckUserdata(1, info->name))); + return convertFunc(static_cast(lua.CheckUserdata(1, info->name))); }; m_info->parentGetters.emplace_back([parentInfo, convertFunc] (LuaInstance& lua, T* instance) @@ -124,7 +134,7 @@ namespace Nz m_info->instanceGetters[m_info->name] = [info = m_info] (LuaInstance& lua) { - return *static_cast(lua.CheckUserdata(1, info->name)); + return static_cast(lua.CheckUserdata(1, info->name)); }; } lua.Pop(); // On pop la metatable @@ -322,14 +332,15 @@ namespace Nz lua.Remove(1); // On enlève l'argument "table" du stack - T* instance = constructor(lua); - if (!instance) + T* instance = static_cast(lua.PushUserdata(sizeof(T))); + + if (!constructor(lua, instance)) { lua.Error("Constructor failed"); return 0; // Normalement jamais exécuté (l'erreur provoquant une exception) } - lua.PushInstance(info->name.GetConstBuffer(), instance); + lua.SetMetatable(info->name); return 1; } @@ -341,11 +352,11 @@ namespace Nz std::shared_ptr& info = *static_cast*>(lua.ToUserdata(lua.GetIndexOfUpValue(1))); const FinalizerFunc& finalizer = info->finalizer; - T* instance = *static_cast(lua.CheckUserdata(1, info->name)); + T* instance = static_cast(lua.CheckUserdata(1, info->name)); lua.Remove(1); //< Remove the instance from the Lua stack if (!finalizer || finalizer(lua, *instance)) - delete instance; + instance->~T(); return 0; } @@ -399,7 +410,7 @@ namespace Nz std::shared_ptr& info = *static_cast*>(lua.ToUserdata(lua.GetIndexOfUpValue(1))); - T* instance = *static_cast(lua.CheckUserdata(1, info->name)); + T* instance = static_cast(lua.CheckUserdata(1, info->name)); lua.Remove(1); //< Remove the instance from the Lua stack Get(info, lua, instance); @@ -448,7 +459,7 @@ namespace Nz std::shared_ptr& info = *static_cast*>(lua.ToUserdata(lua.GetIndexOfUpValue(1))); const ClassIndexFunc& setter = info->setter; - T& instance = *(*static_cast(lua.CheckUserdata(1, info->name))); + T& instance = *static_cast(lua.CheckUserdata(1, info->name)); lua.Remove(1); //< Remove the instance from the Lua stack if (!setter(lua, instance)) diff --git a/include/Nazara/Lua/LuaInstance.hpp b/include/Nazara/Lua/LuaInstance.hpp index e2d15958f..b924f6a05 100644 --- a/include/Nazara/Lua/LuaInstance.hpp +++ b/include/Nazara/Lua/LuaInstance.hpp @@ -131,7 +131,8 @@ namespace Nz template void PushFunction(R(*func)(Args...), DefArgs&&... defArgs) const; template void PushGlobal(const char* name, T&& arg); template void PushGlobal(const String& name, T&& arg); - template void PushInstance(const char* tname, T* instance) const; + template void PushInstance(const char* tname, const T& instance) const; + template void PushInstance(const char* tname, T&& instance) const; template void PushInstance(const char* tname, Args&&... args) const; void PushInteger(long long value) const; void PushLightUserdata(void* value) const; diff --git a/include/Nazara/Lua/LuaInstance.inl b/include/Nazara/Lua/LuaInstance.inl index 199efa38f..4c5685322 100644 --- a/include/Nazara/Lua/LuaInstance.inl +++ b/include/Nazara/Lua/LuaInstance.inl @@ -156,21 +156,21 @@ namespace Nz return LuaImplReplyVal(instance, val, TypeTag()); } - inline int LuaImplReplyVal(const LuaInstance& instance, std::string val, TypeTag) + inline int LuaImplReplyVal(const LuaInstance& instance, std::string&& val, TypeTag) { instance.PushString(val.c_str(), val.size()); return 1; } template - inline int LuaImplReplyVal(const LuaInstance& instance, std::vector valContainer, TypeTag>) + inline int LuaImplReplyVal(const LuaInstance& instance, std::vector&& valContainer, TypeTag>) { std::size_t index = 1; instance.PushTable(valContainer.size()); - for (const T& val : valContainer) + for (T& val : valContainer) { instance.PushInteger(index++); - if (LuaImplReplyVal(instance, val, TypeTag()) != 1) + if (LuaImplReplyVal(instance, std::move(val), TypeTag()) != 1) { instance.Error("Couldn't create table: type need more than one place to store"); return 0; @@ -181,20 +181,20 @@ namespace Nz return 1; } - inline int LuaImplReplyVal(const LuaInstance& instance, ByteArray val, TypeTag) + inline int LuaImplReplyVal(const LuaInstance& instance, ByteArray&& val, TypeTag) { instance.PushString(reinterpret_cast(val.GetConstBuffer()), val.GetSize()); return 1; } - inline int LuaImplReplyVal(const LuaInstance& instance, String val, TypeTag) + inline int LuaImplReplyVal(const LuaInstance& instance, String&& val, TypeTag) { instance.PushString(std::move(val)); return 1; } template - int LuaImplReplyVal(const LuaInstance& instance, std::pair val, TypeTag>) + int LuaImplReplyVal(const LuaInstance& instance, std::pair&& val, TypeTag>) { int retVal = 0; @@ -593,17 +593,30 @@ namespace Nz } template - void LuaInstance::PushInstance(const char* tname, T* instance) const + void LuaInstance::PushInstance(const char* tname, const T& instance) const { - T** userdata = static_cast(PushUserdata(sizeof(T*))); - *userdata = instance; + T* userdata = static_cast(PushUserdata(sizeof(T*))); + PlacementNew(userdata, instance); + + SetMetatable(tname); + } + + template + void LuaInstance::PushInstance(const char* tname, T&& instance) const + { + T* userdata = static_cast(PushUserdata(sizeof(T*))); + PlacementNew(userdata, std::move(instance)); + SetMetatable(tname); } template void LuaInstance::PushInstance(const char* tname, Args&&... args) const { - PushInstance(tname, new T(std::forward(args)...)); + T* userdata = static_cast(PushUserdata(sizeof(T*))); + PlacementNew(userdata, std::forward(args)...); + + SetMetatable(tname); } template