Phasor  01.00.10.059
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Lua.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <list>
4 #include <string>
5 #include <deque>
6 #include <memory>
7 #include "..\lua\lua.hpp"
8 #include "Manager.h"
9 #include "Common/noncopyable.h"
10 
11 namespace Lua
12 {
18 
19  class State;
20 
21  enum LuaType
22  {
23  Type_Nil = LUA_TNIL,
24  Type_Boolean = LUA_TBOOLEAN,
25  Type_LightUserData = LUA_TLIGHTUSERDATA,
26  Type_Number = LUA_TNUMBER,
27  Type_String = LUA_TSTRING,
28  Type_Table = LUA_TTABLE,
29  Type_Function = LUA_TFUNCTION,
30  Type_UserData = LUA_TUSERDATA,
31  Type_Thread = LUA_TTHREAD,
32  };
33 
35  {
36  private:
37  std::unique_ptr<MObject> object;
38 
39  protected:
41 
42  explicit LuaObject(LuaType type);
43  public:
44  explicit LuaObject(); // nil
45  explicit LuaObject(bool value);
46  explicit LuaObject(double value);
47  explicit LuaObject(const std::string& value);
48  explicit LuaObject(const char* value);
49  explicit LuaObject(int index, bool); // use for unknown types
50  explicit LuaObject(std::unique_ptr<MObjTable> table);
51  virtual ~LuaObject();
52 
53  LuaType get_type() { return type;}
54 
55  virtual void push(State& state);
56  std::unique_ptr<MObject> release_object();
57  };
58 
59  class UnhandledObject : public LuaObject
60  {
61  private:
62  int ref;
63  State& state;
64 
65  public:
66  explicit UnhandledObject(State& state, int ref, LuaType actual_type);
68  virtual void push(State& state);
69  };
70 
71  // Class: CFunction
72  // used to represent a c function which is callable from Lua. The same
73  // CFunction cannot be bound to multiple states.
74  class CFunction : public LuaObject
75  {
76  private:
77 
78  State& state;
79  const Manager::ScriptCallback* cb;
80 
81  public:
82  CFunction(State& state, const Manager::ScriptCallback* cb);
83  // inherited from LuaObject
84  virtual void push(State&) override;
85 
86  static int LuaCall(lua_State* L);
87  };
88 
89  //-----------------------------------------------------------------------------------------
90  // Class: State
91  // This class is analogous to lua_State
92  //
93  class State : public Manager::ScriptState
94  {
95  private:
96  // Underlying Lua state
97  lua_State* L;
98  std::list<std::unique_ptr<CFunction>> registeredFunctions;
99 
100  public:
101 
102  State();
103  virtual ~State();
104 
105  lua_State* GetState() { return L; }
106 
107  void DoFile(const char* file) override;
108 
109  // Loads and runs a string
110  void DoString(const char* str);
111 
112  // Push handled types to the stack (those that MObject can use)
113  void push(const MObject& object);
114  std::unique_ptr<LuaObject> peek(int indx=-1);
115  std::unique_ptr<LuaObject> pop();
116  std::unique_ptr<MObjTable> peek_table(int indx=-1);
117 
118  std::unique_ptr<LuaObject> get_global(const char* name);
119  void set_global(const char* name, LuaObject& obj);
120 
121  // inherited from Manager::ScriptState
123  bool HasFunction(const char* name);
124  MObject::unique_deque Call(const char* name,
125  const MObject::unique_list& args);
126  MObject::unique_deque Call(const char* name);
127  };
128 }