// Copyright (C) 2015 Jérôme Leclercq // This file is part of the "Nazara Engine - Lua scripting module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_LUACLASS_HPP #define NAZARA_LUACLASS_HPP #include #include #include #include #include #include //#include namespace Nz { template class LuaClass { //static_assert(std::is_same::value || std::is_base_of::value, "P must be a base of T"); public: using ClassFunc = std::function; using ClassIndexFunc = std::function; using ConstructorFunc = std::function; using FinalizerFunc = std::function; using StaticIndexFunc = std::function; using StaticFunc = std::function; LuaClass(const String& name); //void Inherit(LuaClass

& parent); void Register(LuaInstance& lua); void PushGlobalTable(LuaInstance& lua); void SetConstructor(ConstructorFunc constructor); void SetFinalizer(FinalizerFunc finalizer); void SetGetter(ClassIndexFunc getter); void SetMethod(const String& name, ClassFunc method); template std::enable_if_t::value> SetMethod(const String& name, R(P::*func)(Args...)); template std::enable_if_t::value> SetMethod(const String& name, R(P::*func)(Args...) const); void SetSetter(ClassIndexFunc setter); void SetStaticGetter(StaticIndexFunc getter); void SetStaticMethod(const String& name, StaticFunc func); template void SetStaticMethod(const String& name, R(*func)(Args...)); void SetStaticSetter(StaticIndexFunc getter); private: static int ConstructorProxy(lua_State* state); static int FinalizerProxy(lua_State* state); static int InfoDestructor(lua_State* state); static int GetterProxy(lua_State* state); static int MethodProxy(lua_State* state); static int SetterProxy(lua_State* state); static int StaticGetterProxy(lua_State* state); static int StaticMethodProxy(lua_State* state); static int StaticSetterProxy(lua_State* state); struct ClassInfo { std::vector methods; std::vector staticMethods; ClassIndexFunc getter = nullptr; ClassIndexFunc setter = nullptr; ConstructorFunc constructor = nullptr; FinalizerFunc finalizer = nullptr; StaticIndexFunc staticGetter = nullptr; StaticIndexFunc staticSetter = nullptr; String name; int globalTableRef = -1; }; std::map m_methods; std::map m_staticMethods; std::shared_ptr m_info; }; } #include #endif // NAZARA_LUACLASS_HPP