aboutsummaryrefslogtreecommitdiffstats
path: root/deps/sol2/examples/source/customization_multiple.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'deps/sol2/examples/source/customization_multiple.cpp')
-rw-r--r--deps/sol2/examples/source/customization_multiple.cpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/deps/sol2/examples/source/customization_multiple.cpp b/deps/sol2/examples/source/customization_multiple.cpp
new file mode 100644
index 0000000..2d5ae0f
--- /dev/null
+++ b/deps/sol2/examples/source/customization_multiple.cpp
@@ -0,0 +1,70 @@
+#define SOL_ALL_SAFETIES_ON 1
+#include <sol/sol.hpp>
+
+#include <iostream>
+#include "assert.hpp"
+
+struct two_things {
+ int a;
+ bool b;
+};
+
+template <typename Handler>
+bool sol_lua_check(sol::types<two_things>, lua_State* L, int index, Handler&& handler, sol::stack::record& tracking) {
+ // indices can be negative to count backwards from the top of the stack,
+ // rather than the bottom up
+ // to deal with this, we adjust the index to
+ // its absolute position using the lua_absindex function
+ int absolute_index = lua_absindex(L, index);
+ // Check first and second second index for being the proper types
+ bool success = sol::stack::check<int>(L, absolute_index, handler) && sol::stack::check<bool>(L, absolute_index + 1, handler);
+ tracking.use(2);
+ return success;
+}
+
+two_things sol_lua_get(sol::types<two_things>, lua_State* L, int index, sol::stack::record& tracking) {
+ int absolute_index = lua_absindex(L, index);
+ // Get the first element
+ int a = sol::stack::get<int>(L, absolute_index);
+ // Get the second element,
+ // in the +1 position from the first
+ bool b = sol::stack::get<bool>(L, absolute_index + 1);
+ // we use 2 slots, each of the previous takes 1
+ tracking.use(2);
+ return two_things{ a, b };
+}
+
+int sol_lua_push(sol::types<two_things>, lua_State* L, const two_things& things) {
+ int amount = sol::stack::push(L, things.a);
+ // amount will be 1: int pushes 1 item
+ amount += sol::stack::push(L, things.b);
+ // amount 2 now, since bool pushes a single item
+ // Return 2 things
+ return amount;
+}
+
+int main() {
+ std::cout << "=== customization ===" << std::endl;
+ std::cout << std::boolalpha;
+
+ sol::state lua;
+ lua.open_libraries(sol::lib::base);
+
+ // Create a pass-through style of function
+ lua.script("function f ( a, b ) print(a, b) return a, b end");
+
+ // get the function out of Lua
+ sol::function f = lua["f"];
+
+ two_things things = f(two_things{ 24, false });
+ c_assert(things.a == 24);
+ c_assert(things.b == false);
+ // things.a == 24
+ // things.b == true
+
+ std::cout << "things.a: " << things.a << std::endl;
+ std::cout << "things.b: " << things.b << std::endl;
+ std::cout << std::endl;
+
+ return 0;
+}