Libsaki
Core library of Pancake Mahjong
lua_var_scope.h
1 #ifndef SAKI_APP_LUA_VAR_SCOPE_H
2 #define SAKI_APP_LUA_VAR_SCOPE_H
3 
4 #include "../3rd/sol.hpp"
5 
6 #include <functional>
7 
8 
9 namespace saki
10 {
11 
12 
13 
14 template<typename... Args>
16 {
17 public:
18  explicit LuaVarScope(sol::environment girl, Args ... args)
19  : mGirl(girl)
20  , mArgs(std::make_tuple(std::move(args) ...))
21  {
22  setup(std::make_index_sequence<sizeof...(args) / 2>());
23  }
24 
25  ~LuaVarScope()
26  {
27  clear(std::make_index_sequence<std::tuple_size<decltype(mArgs)>() / 2>());
28  }
29 
30  template<size_t... Is>
31  void setup(std::index_sequence<Is...>)
32  {
33  // safe to move the lvalue tuple, because the moved value won't be used anymore
34  (mGirl.raw_set(std::get<2 * Is>(mArgs), std::get<2 * Is + 1>(std::move(mArgs))), ...);
35  }
36 
37  template<size_t... Is>
38  void clear(std::index_sequence<Is...>)
39  {
40  (mGirl.raw_set(std::get<2 * Is>(mArgs), nullptr), ...);
41  }
42 
43 private:
44  sol::environment mGirl;
45  std::tuple<Args ...> mArgs;
46 };
47 
48 
49 
50 
51 } // namespace saki
52 
53 
54 
55 #endif // SAKI_APP_LUA_VAR_SCOPE_H
Definition: sol.hpp:1174
Definition: ai.cpp:18
Definition: lua_var_scope.h:15