From bd3fe0cac583739bc0d7c4b5c8f301bb350abca0 Mon Sep 17 00:00:00 2001 From: Andy Belle-Isle Date: Fri, 30 Aug 2019 00:19:31 -0400 Subject: Renamed lib to deps so github will ignore it for language stats --- .../sol2/examples/interop/LuaBridge/CMakeLists.txt | 69 ++++++++++++ .../interop/LuaBridge/source/LuaBridge.cpp | 116 +++++++++++++++++++++ 2 files changed, 185 insertions(+) create mode 100644 deps/sol2/examples/interop/LuaBridge/CMakeLists.txt create mode 100644 deps/sol2/examples/interop/LuaBridge/source/LuaBridge.cpp (limited to 'deps/sol2/examples/interop/LuaBridge') diff --git a/deps/sol2/examples/interop/LuaBridge/CMakeLists.txt b/deps/sol2/examples/interop/LuaBridge/CMakeLists.txt new file mode 100644 index 0000000..6417f76 --- /dev/null +++ b/deps/sol2/examples/interop/LuaBridge/CMakeLists.txt @@ -0,0 +1,69 @@ +# # # # sol3 +# The MIT License (MIT) +# +# Copyright (c) 2013-2019 Rapptz, ThePhD, and contributors +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +# the Software, and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +# # # sol3 interop Examples - luabridge + +find_package(LuaBridgeBuild) + +function (make_luabridge_interop_example target_library example_suffix) + set(example_name luabridge_interop_example) + set(example_name "${example_name}${example_suffix}") + + add_executable(${example_name} source/LuaBridge.cpp) + target_link_libraries(${example_name} + PRIVATE ${LUA_LIBRARIES} ${LUABRIDGE_LIBRARIES} + ${target_library} sol2::assert) + + if (MSVC) + target_compile_options(${example_name} + PRIVATE /std:c++latest /EHsc "$<$:/MDd>" + "$<$:/MD>" + "$<$:/MD>" + "$<$:/MD>") + target_compile_definitions(${example_name} + PRIVATE /W1 + UNICODE _UNICODE + _CRT_SECURE_NO_WARNINGS _CRT_SECURE_NO_DEPRECATE) + else() + target_compile_options(${example_name} + PRIVATE -std=c++1z -w + -Wno-unknown-warning -Wno-unknown-warning-option) + endif() + + if (CMAKE_DL_LIBS) + target_link_libraries(${example_name} PRIVATE ${CMAKE_DL_LIBS}) + endif() + + if (SOL2_TESTS_INTEROP_EXAMPLES) + add_test(NAME ${example_name} COMMAND ${example_name}) + endif() +endfunction() + +if (SOL2_INTEROP_EXAMPLES) + make_luabridge_interop_example(sol2::sol2 "") +endif() +if (SOL2_INTEROP_EXAMPLES_SINGLE) + make_luabridge_interop_example(sol2::sol2_single ".single") +endif() +if (SOL2_INTEROP_EXAMPLES_SINGLE_GENERATED) + make_luabridge_interop_example(sol2::sol2_single_generated ".single.generated") +endif() diff --git a/deps/sol2/examples/interop/LuaBridge/source/LuaBridge.cpp b/deps/sol2/examples/interop/LuaBridge/source/LuaBridge.cpp new file mode 100644 index 0000000..81a9199 --- /dev/null +++ b/deps/sol2/examples/interop/LuaBridge/source/LuaBridge.cpp @@ -0,0 +1,116 @@ +#define SOL_ALL_SAFETIES_ON 1 +#define SOL_ENABLE_INTEROP 1 // MUST be defined to use interop features +#include + +#include + +#include +#include + +// LuaBridge, +// no longer maintained, by VinnieFalco: +// https://github.com/vinniefalco/LuaBridge + +struct A { + + A(int v) + : v_(v) { + } + + void print() { + std::cout << "called A::print" << std::endl; + } + + int value() const { + return v_; + } + +private: + int v_ = 50; +}; + +template +inline bool sol_lua_interop_check(sol::types, lua_State* L, int relindex, sol::type index_type, Handler&& handler, sol::stack::record& tracking) { + // just marking unused parameters for no compiler warnings + (void)index_type; + (void)handler; + tracking.use(1); + int index = lua_absindex(L, relindex); + T* corrected = luabridge::Userdata::get(L, index, true); + return corrected != nullptr; +} + +template +inline std::pair sol_lua_interop_get(sol::types t, lua_State* L, int relindex, void* unadjusted_pointer, sol::stack::record& tracking) { + (void)unadjusted_pointer; + int index = lua_absindex(L, relindex); + if (!sol_lua_interop_check(t, L, index, sol::type::userdata, sol::no_panic, tracking)) { + return { false, nullptr }; + } + T* corrected = luabridge::Userdata::get(L, index, true); + return { true, corrected }; +} + +void register_sol_stuff(lua_State* L) { + // grab raw state and put into state_view + // state_view is cheap to construct + sol::state_view lua(L); + // bind and set up your things: everything is entirely self-contained + lua["f"] = sol::overload( + [](A& from_luabridge) { + std::cout << "calling 1-argument version with luabridge-created A { " << from_luabridge.value() << " }" << std::endl; + c_assert(from_luabridge.value() == 24); + }, + [](A& from_luabridge, int second_arg) { + std::cout << "calling 2-argument version with luabridge-created A { " << from_luabridge.value() << " } and integer argument of " << second_arg << std::endl; + c_assert(from_luabridge.value() == 24); + c_assert(second_arg == 5); + }); +} + +void check_with_sol(lua_State* L) { + sol::state_view lua(L); + A& obj = lua["obj"]; + (void)obj; + c_assert(obj.value() == 24); +} + +int main(int, char* []) { + + std::cout << "=== interop example (LuaBridge) ===" << std::endl; + std::cout << "code modified from LuaBridge's examples: https://github.com/vinniefalco/LuaBridge" << std::endl; + + struct closer { + void operator()(lua_State* L) { + lua_close(L); + } + }; + + std::unique_ptr state(luaL_newstate()); + lua_State* L = state.get(); + luaL_openlibs(L); + + luabridge::getGlobalNamespace(L) + .beginNamespace("test") + .beginClass("A") + .addConstructor() + .addFunction("print", &A::print) + .addFunction("value", &A::value) + .endClass() + .endNamespace(); + + register_sol_stuff(L); + + + if (luaL_dostring(L, R"( +obj = test.A(24) +f(obj) -- call 1 argument version +f(obj, 5) -- call 2 argument version +)")) { + lua_error(L); + } + + check_with_sol(L); + + return 0; +} \ No newline at end of file -- cgit v1.2.3