diff --git a/include/Nazara/Core/Algorithm.hpp b/include/Nazara/Core/Algorithm.hpp index cbbd8af04..408eb79cf 100644 --- a/include/Nazara/Core/Algorithm.hpp +++ b/include/Nazara/Core/Algorithm.hpp @@ -25,6 +25,12 @@ namespace Nz template ByteArray ComputeHash(AbstractHash* hash, const T& v); template void HashCombine(std::size_t& seed, const T& v); + template + struct PointedType + { + using type = void; //< FIXME: I can't make SFINAE work + }; + template struct TypeTag {}; diff --git a/include/Nazara/Core/Algorithm.inl b/include/Nazara/Core/Algorithm.inl index 7c117e626..a23fea4e1 100644 --- a/include/Nazara/Core/Algorithm.inl +++ b/include/Nazara/Core/Algorithm.inl @@ -79,6 +79,11 @@ namespace Nz seed = static_cast(b * kMul); } + template struct PointedType {typedef T type;}; + template struct PointedType {typedef T type;}; + template struct PointedType {typedef T type;}; + template struct PointedType {typedef T type;}; + inline bool Serialize(SerializationContext& context, bool value) { if (context.currentBitPos == 8) diff --git a/include/Nazara/Core/ObjectRef.hpp b/include/Nazara/Core/ObjectRef.hpp index 0c82b3abc..8debb7d91 100644 --- a/include/Nazara/Core/ObjectRef.hpp +++ b/include/Nazara/Core/ObjectRef.hpp @@ -8,6 +8,7 @@ #define NAZARA_RESOURCEREF_HPP #include +#include #include #include @@ -44,6 +45,9 @@ namespace Nz private: T* m_object; }; + + template struct PointedType> {typedef T type;}; + template struct PointedType const> {typedef T type;}; } #include diff --git a/include/Nazara/Lua/LuaClass.hpp b/include/Nazara/Lua/LuaClass.hpp index 16399fd3a..7494dbe83 100644 --- a/include/Nazara/Lua/LuaClass.hpp +++ b/include/Nazara/Lua/LuaClass.hpp @@ -8,6 +8,7 @@ #define NAZARA_LUACLASS_HPP #include +#include #include #include #include @@ -47,6 +48,8 @@ namespace Nz void SetMethod(const String& name, ClassFunc method); template std::enable_if_t::value> SetMethod(const String& name, R(P::*func)(Args...), DefArgs... defArgs); template std::enable_if_t::value> SetMethod(const String& name, R(P::*func)(Args...) const, DefArgs... defArgs); + template std::enable_if_t::type>::value> SetMethod(const String& name, R(P::*func)(Args...), DefArgs... defArgs); + template std::enable_if_t::type>::value> SetMethod(const String& name, R(P::*func)(Args...) const, DefArgs... defArgs); void SetSetter(ClassIndexFunc setter); void SetStaticGetter(StaticIndexFunc getter); void SetStaticMethod(const String& name, StaticFunc func); @@ -63,12 +66,12 @@ namespace Nz std::vector parentGetters; std::vector staticMethods; std::unordered_map instanceGetters; - ClassIndexFunc getter = nullptr; - ClassIndexFunc setter = nullptr; - ConstructorFunc constructor = nullptr; - FinalizerFunc finalizer = nullptr; - StaticIndexFunc staticGetter = nullptr; - StaticIndexFunc staticSetter = nullptr; + ClassIndexFunc getter; + ClassIndexFunc setter; + ConstructorFunc constructor; + FinalizerFunc finalizer; + StaticIndexFunc staticGetter; + StaticIndexFunc staticSetter; String name; int globalTableRef = -1; }; diff --git a/include/Nazara/Lua/LuaClass.inl b/include/Nazara/Lua/LuaClass.inl index 5ff49defe..5ca323a79 100644 --- a/include/Nazara/Lua/LuaClass.inl +++ b/include/Nazara/Lua/LuaClass.inl @@ -225,6 +225,32 @@ namespace Nz }); } + template + template + std::enable_if_t::type>::value> LuaClass::SetMethod(const String& name, R(P::*func)(Args...), DefArgs... defArgs) + { + SetMethod(name, [func, defArgs...](LuaInstance& instance, T& object) -> int + { + typename LuaImplMethodProxy::template Impl handler(instance, object, defArgs...); + handler.ProcessArgs(); + + return handler.Invoke(func); + }); + } + + template + template + std::enable_if_t::type>::value> LuaClass::SetMethod(const String& name, R(P::*func)(Args...) const, DefArgs... defArgs) + { + SetMethod(name, [func, defArgs...](LuaInstance& instance, T& object) -> int + { + typename LuaImplMethodProxy::template Impl handler(instance, object, defArgs...); + handler.ProcessArgs(); + + return handler.Invoke(func); + }); + } + template void LuaClass::SetSetter(ClassIndexFunc setter) { diff --git a/include/Nazara/Lua/LuaInstance.inl b/include/Nazara/Lua/LuaInstance.inl index bd57b2308..47712161c 100644 --- a/include/Nazara/Lua/LuaInstance.inl +++ b/include/Nazara/Lua/LuaInstance.inl @@ -344,6 +344,32 @@ namespace Nz return LuaImplReplyVal(m_instance, std::move(Apply(m_object, func, m_args)), TypeTag()); } + template + std::enable_if_t::type>::value, int> Invoke(void(P::*func)(Args...)) + { + Apply(*m_object, func, m_args); + return 0; + } + + template + std::enable_if_t::type>::value, int> Invoke(Ret(P::*func)(Args...)) + { + return LuaImplReplyVal(m_instance, std::move(Apply(*m_object, func, m_args)), TypeTag()); + } + + template + std::enable_if_t::type>::value, int> Invoke(void(P::*func)(Args...) const) + { + Apply(*m_object, func, m_args); + return 0; + } + + template + std::enable_if_t::type>::value, int> Invoke(Ret(P::*func)(Args...) const) + { + return LuaImplReplyVal(m_instance, std::move(Apply(*m_object, func, m_args)), TypeTag()); + } + private: using ArgContainer = std::tuple>...>; using DefArgContainer = std::tuple>...>;