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 --- deps/sol2/examples/source/functions.cpp | 82 +++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 deps/sol2/examples/source/functions.cpp (limited to 'deps/sol2/examples/source/functions.cpp') diff --git a/deps/sol2/examples/source/functions.cpp b/deps/sol2/examples/source/functions.cpp new file mode 100644 index 0000000..007dff3 --- /dev/null +++ b/deps/sol2/examples/source/functions.cpp @@ -0,0 +1,82 @@ +#define SOL_ALL_SAFETIES_ON 1 +#include + +#include "assert.hpp" +#include + +inline int my_add(int x, int y) { + return x + y; +} + +struct multiplier { + int operator()(int x) { + return x * 10; + } + + static int by_five(int x) { + return x * 5; + } +}; + +int main() { + std::cout << "=== functions ===" << std::endl; + + sol::state lua; + lua.open_libraries(sol::lib::base); + + // setting a function is simple + lua.set_function("my_add", my_add); + + // you could even use a lambda + lua.set_function("my_mul", [](double x, double y) { return x * y; }); + + // member function pointers and functors as well + lua.set_function("mult_by_ten", multiplier{}); + lua.set_function("mult_by_five", &multiplier::by_five); + + // assert that the functions work + lua.script("assert(my_add(10, 11) == 21)"); + lua.script("assert(my_mul(4.5, 10) == 45)"); + lua.script("assert(mult_by_ten(50) == 500)"); + lua.script("assert(mult_by_five(10) == 50)"); + + // using lambdas, functions can have state. + int x = 0; + lua.set_function("inc", [&x]() { x += 10; }); + + // calling a stateful lambda modifies the value + lua.script("inc()"); + c_assert(x == 10); + if (x == 10) { + // Do something based on this information + std::cout << "Yahoo! x is " << x << std::endl; + } + + // this can be done as many times as you want + lua.script(R"( +inc() +inc() +inc() +)"); + c_assert(x == 40); + if (x == 40) { + // Do something based on this information + std::cout << "Yahoo! x is " << x << std::endl; + } + + // retrieval of a function is done similarly + // to other variables, using sol::function + sol::function add = lua["my_add"]; + int value = add(10, 11); + // second way to call the function + int value2 = add.call(10, 11); + c_assert(value == 21); + c_assert(value2 == 21); + if (value == 21 && value2 == 21) { + std::cout << "Woo, value is 21!" << std::endl; + } + + std::cout << std::endl; + + return 0; +} \ No newline at end of file -- cgit v1.2.3