#include #include #include #include #include #include "LuaCustomTypes.hpp" #include "Example.hpp" static int Example_PrintMe(lua_State* L) { Example* ex = luaW_check(L, 1); std::cout << "Example=" << "{m_boolean=" << ex->m_boolean << ",m_integer=" << ex->m_integer << ",m_uinteger=" << ex->m_uinteger << ",m_string='" << ex->m_cstring << "'" << ",m_cppstring='" << ex->m_cppstring << "'" << ",m_number=" << ex->m_number << ",m_floatnumber=" << ex->m_floatnumber << ",m_vec={x=" << ex->m_vec.x << ",y=" << ex->m_vec.y <<"}}" << std::endl; return 0; } static luaL_Reg Example_metatable[] = { // This function is { "PrintMe", Example_PrintMe }, // In many cases, all you need are simple getter or setter functions This // was such a common pattern for me that I wrote a huge set of templates // that generate these getter and setter functions for me. This is an // example of how they can be used // // Because everything in the Example class is marked public, you can access // them directly with these templates. // // Class | data type | class member { "GetBoolean", luaU_get }, { "SetBoolean", luaU_set }, { "Boolean", luaU_getset }, { "GetInteger", luaU_get }, { "SetInteger", luaU_set }, { "Integer", luaU_getset }, { "GetUInteger", luaU_get }, { "SetUInteger", luaU_set }, { "UInteger", luaU_getset }, { "GetCString", luaU_get }, { "SetCString", luaU_set }, { "CString", luaU_getset }, { "GetCPPString", luaU_get }, { "SetCPPString", luaU_set }, { "CPPString", luaU_getset }, { "GetVec", luaU_get }, { "SetVec", luaU_set }, { "Vec", luaU_getset }, { "GetNumber", luaU_get }, { "SetNumber", luaU_set }, { "Number", luaU_getset }, { "GetFloatNumber", luaU_get }, { "SetFloatNumber", luaU_set }, { "FloatNumber", luaU_getset }, { "GetPtr", luaU_get }, { "SetPtr", luaU_set }, { "Ptr", luaU_getset }, // The getters and setters above work on member variables directly, but // sometimes all you have are getter and setter functions instead of // variables. You can still automate the creation of Getter and Setter Lua // function wrappers. // Normally it would be silly to have getter and setter functions for both // the member variable AND the getter/setter function, I've included both // here as an example of how it works // Example of member access through getters and setters // Class | data type | getter // Class | data type | setter // Class | data type | getter | setter { "GetBooleanFunc", luaU_get }, { "SetBooleanFunc", luaU_set }, { "BooleanFunc", luaU_getset }, { "GetIntegerFunc", luaU_get }, { "SetIntegerFunc", luaU_set }, { "IntegerFunc", luaU_getset }, { "GetUIntegerFunc", luaU_get }, { "SetUIntegerFunc", luaU_set }, { "UIntegerFunc", luaU_getset }, { "GetCStringFunc", luaU_get }, { "SetCStringFunc", luaU_set }, { "CStringFunc", luaU_getset }, { "GetNumberFunc", luaU_get }, { "SetNumberFunc", luaU_set }, { "NumberFunc", luaU_getset }, { "GetFloatNumberFunc", luaU_get }, { "SetFloatNumberFunc", luaU_set }, { "FloatNumberFunc", luaU_getset }, { "GetPtrFunc", luaU_get }, { "SetPtrFunc", luaU_set }, { "PtrFunc", luaU_getset }, // In order to use luaU_get and luaU_set on non-primitive types, you must define luaU_to // and luaU_check for that type. // See LuaCustomTypes.hpp for an example involving std::string and Vector2D { "GetCPPStringFunc", luaU_get }, { "SetCPPStringFunc", luaU_set }, { "CPPStringFunc", luaU_getset }, { "GetVecFunc", luaU_get }, { "SetSetFunc", luaU_set }, { "VecFunc", luaU_getset }, { "DoSomething", luaU_func(&Example::DoSomething) }, { "DoSomething2", luaU_func(&Example::DoSomething2) }, //{ "DoSomethingElse1", luaU_funcsig(int, Example, DoSomethingElse, int, int) }, //{ "DoSomethingElse2", luaU_funcsig(int, Example, DoSomethingElse, float) }, { NULL, NULL } }; int luaopen_Example(lua_State* L) { luaW_register(L, "Example", NULL, Example_metatable); return 1; }