summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/sol2/examples/any_return.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/sol2/examples/any_return.cpp')
-rw-r--r--3rdparty/sol2/examples/any_return.cpp46
1 files changed, 46 insertions, 0 deletions
diff --git a/3rdparty/sol2/examples/any_return.cpp b/3rdparty/sol2/examples/any_return.cpp
new file mode 100644
index 00000000000..f286071b8d8
--- /dev/null
+++ b/3rdparty/sol2/examples/any_return.cpp
@@ -0,0 +1,46 @@
+#include <sol.hpp>
+
+#include <iostream>
+#include <cassert>
+
+// Uses some of the fancier bits of sol2, including the "transparent argument",
+// sol::this_state, which gets the current state and does not increment
+// function arguments
+sol::object fancy_func(sol::object a, sol::object b, sol::this_state s) {
+ sol::state_view lua(s);
+ if (a.is<int>() && b.is<int>()) {
+ return sol::object(lua, sol::in_place, a.as<int>() + b.as<int>());
+ }
+ else if (a.is<bool>()) {
+ bool do_triple = a.as<bool>();
+ return sol::object(lua, sol::in_place<double>, b.as<double>() * (do_triple ? 3 : 1));
+ }
+ // Can also use make_object
+ return sol::make_object(lua, sol::nil);
+}
+
+int main() {
+ sol::state lua;
+
+ lua["f"] = fancy_func;
+
+ int result = lua["f"](1, 2);
+ // result == 3
+ assert(result == 3);
+ double result2 = lua["f"](false, 2.5);
+ // result2 == 2.5
+ assert(result2 == 2.5);
+
+ // call in Lua, get result
+ // notice we only need 2 arguments here, not 3 (sol::this_state is transparent)
+ lua.script("result3 = f(true, 5.5)");
+ double result3 = lua["result3"];
+ // result3 == 16.5
+ assert(result3 == 16.5);
+
+ std::cout << "=== any_return example ===" << std::endl;
+ std::cout << "result : " << result << std::endl;
+ std::cout << "result2: " << result2 << std::endl;
+ std::cout << "result3: " << result3 << std::endl;
+ std::cout << std::endl;
+} \ No newline at end of file