summaryrefslogtreecommitdiff
path: root/Source/3rdParty/Luax/luax_state.h
blob: 52b8f3830a0f37cb5ef4e085aa3f408635cf8dc8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#ifndef __LUAX_STATE_H__
#define __LUAX_STATE_H__

#include <string>

#include "lua.hpp"
#include "luax_config.h"

namespace Luax 
{

	class LuaxClass;

	///
	/// lua_StateĴ˱һlua_Stateòݡһʵmetatable£
	///   interface table
	///   member table
	///   ref table
	///   userdata
	/// userdataͨgetmetatableȡϼmetatable֮⻹һclass tableעڶӦƿռ
	///
	LUAX_API class LuaxState 
	{
	public:

		LuaxState(lua_State* state);
		~LuaxState();

		operator lua_State*();
		operator bool();
		lua_State* operator ->();
		lua_State& operator *();
		
		//------------------------------------------------------------------------------------------------------------

		void OpenLibs();

		//------------------------------------------------------------------------------------------------------------
		// ƿռƿռһ_Gı

		void PushNamespace(cc8* name);
		void PopNamespace();

		//------------------------------------------------------------------------------------------------------------

		int GetTop();
		bool CheckParams(int idx, cc8* format);
		int AbsIndex(int idx);
		int Call(int nArgs, int nResults);

		//------------------------------------------------------------------------------------------------------------

		///
		/// עCעһ{0 0}
		///
		void Register(const luaL_Reg *l);
		
		void GetField(int idx, cc8* name);
		void GetField(int idx, int key);
		std::string	GetField(int idx, cc8* key, cc8* value);
		std::string GetField(int idx, int key, cc8* value);
		std::string	GetField(int idx, cc8* key, const std::string& value);
		std::string GetField(int idx, int key, const std::string& value);
		bool GetFieldWithType(int idx, cc8* name, int type);
		bool GetFieldWithType(int idx, int key, int type);
		bool GetSubfieldWithType(int idx, cc8* format, int type, ...);
		static cc8* GetLuaTypeName(int type);

		void SetField(int idx, cc8* key);

		bool IsNil(int idx);
		bool IsNilOrNone(int idx);
		bool IsTableOrUserdata(int idx);
		bool IsTrueOrNotNil(int idx);
		bool IsType(int idx, int type);
		bool IsType(int idx, cc8* name, int type);
		bool IsValid();

		bool HasField(int idx, cc8* name);
		bool HasField(int idx, int key);
		bool HasField(int idx, cc8* name, int type);
		bool HasField(int idx, int name, int type);
		bool HasKeys(int idx);

		void Push();
		void Push(bool value);
		void Push(cc8* value);
		void Push(double value);
		void Push(float value);
		void Push(int value);
		void Push(u16 value);
		void Push(u32 value);
		void Push(u64 value);
		void Push(uintptr value);
		void Push(lua_CFunction value);
		void Push(void* data, size_t size);
		void Push(const void* value);
		
		///
		/// void** ʽuserdataֵΪptr
		///
		void PushPtrUserData(void* ptr);

		void Pop(int n = 1);

		//------------------------------------------------------------------------------------------------------------

		template<typename T> T GetValue(int idx, T default_value);
		template<typename T> T GetField(int idx, int key, T value);
		template<typename T> T GetField(int idx, cc8* key, T value);
		template<typename T> void SetField(int idx, cc8* key, T value);
		template<typename T> void SetFieldByIndex(int idx, int key, T value);

		//------------------------------------------------------------------------------------------------------------

		void DoString(const std::string& code);
		void DoFile(const std::string& file);

		//------------------------------------------------------------------------------------------------------------

		///
		/// עṤͨ࣬New
		/// 
		template<typename T>
		void RegisterFactory();

		///
		/// עᵥûNew
		///
		template<typename T>
		void RegisterSingleton();

	private:

		///
		/// ζLuaxStateĵַز
		///
		void* operator &();
		void* operator new(size_t size);

		lua_State* const mState;

	};

#include "luax_state.inl"

	//--------------------------------------------------------------------------------------------------------------
	// GetValue()ģػ

	template <> bool LuaxState::GetValue < bool >(int idx, const bool value);
	template <> cc8* LuaxState::GetValue < cc8* >(int idx, const cc8* value);
	template <> double LuaxState::GetValue < double >(int idx, const double value);
	template <> float LuaxState::GetValue < float >(int idx, const float value);
	template <> s8 LuaxState::GetValue < s8 >(int idx, const s8 value);
	template <> s16 LuaxState::GetValue < s16 >(int idx, const s16 value);
	template <> s32 LuaxState::GetValue < s32 >(int idx, const s32 value);
	template <> s64 LuaxState::GetValue < s64 >(int idx, const s64 value);
	template <> u8 LuaxState::GetValue < u8 >(int idx, const u8 value);
	template <> u16 LuaxState::GetValue < u16 >(int idx, const u16 value);
	template <> u32 LuaxState::GetValue < u32 >(int idx, const u32 value);
	template <> u64	 LuaxState::GetValue < u64 >(int idx, const u64 value);
	template <> std::string LuaxState::GetValue < std::string >(int idx, const std::string value);
	template <> const void* LuaxState::GetValue < const void* >(int idx, const void* value);

}

#endif