var

For hooking up static / global variables to Lua usertypes

The sole purpose of this tagging type is to work with usertypes to provide my_class.my_static_var access, and to also provide reference-based access as well.

 1#define SOL_ALL_SAFETIES_ON 1
 2#include <sol/sol.hpp>
 3
 4#include <iostream>
 5
 6struct test {
 7	static int number;
 8};
 9int test::number = 25;
10
11
12int main() {
13	sol::state lua;
14	lua.open_libraries();
15	lua.new_usertype<test>("test",
16	     "direct",
17	     sol::var(2),
18	     "number",
19	     sol::var(test::number),
20	     "ref_number",
21	     sol::var(std::ref(test::number)));
22
23	int direct_value = lua["test"]["direct"];
24	SOL_ASSERT(direct_value == 2);
25
26	int number = lua["test"]["number"];
27	SOL_ASSERT(number == 25);
28	int ref_number = lua["test"]["ref_number"];
29	SOL_ASSERT(ref_number == 25);
30
31	test::number = 542;
32
33	// number is its own memory: was passed by value
34	// So does not change
35	int number_again = lua["test"]["number"];
36	SOL_ASSERT(number_again == 25);
37
38	// ref_number is just test::number
39	// passed through std::ref
40	// so, it holds a reference
41	// which can be updated
42	int ref_number_again = lua["test"]["ref_number"];
43	SOL_ASSERT(ref_number_again == 542);
44	// be careful about referencing local variables,
45	// if they go out of scope but are still reference
46	// you'll suffer dangling reference bugs!
47
48	return 0;
49}