summaryrefslogtreecommitdiff
path: root/Source/3rdParty/Luax/luax_class.h
blob: d241030ea08be11b0ac4917040c6706f8b0d1ac6 (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
#ifndef __LUAX_CLASS_H__
#define __LUAX_CLASS_H__

#include <vector>

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

namespace Luax
{

#define LUAX_DECL_METHOD(mtd) static int mtd(lua_State*)

	///
	/// RegisterLuaxClass עķͳԱö١ȵclass table
	/// LuaxRegisterInterface עӿڷinterface table
	/// LuaxGetFactoryName ùͬʱעʱעΪsingletonͨʱ
	///
#define LUAX_DECL_FACTORY(type) \
	static void RegisterLuaxClass(LuaxState&);\
	static void RegisterLuaxInterface(LuaxState&);\
	static const char* GetLuaxFactoryName() { return #type; };\
	static const char* GetLuaxClassName() { return #type; };\
	static bool IsLuaxClassSingleton() { return false; };


	///
	/// RegisterLuaxClass עķͳԱö١ȵclass table
	/// LuaxGetSingletonName õ
	///
#define LUAX_DECL_SINGLETON(type) \
	static void RegisterLuaxClass(LuaxState&);  \
	static const char* GetLuaxSingletonName() { return #type; }; \
	static const char* GetLuaxClassName() { return #type; }; \
	static bool IsLuaxClassSingleton() { return true; };


	///
	/// Ҫ¶luaclassҪ̳дࡣͨluaʵҪȷüȷԣڶ߳Ҫȷͷš
	///
	class LuaxClass
	{
	public:

		void Retain();
		void Release();

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

		template<class T>
		static void RegisterLuaxClass(LuaxState& state);

		template<class T> 
		LUAX_DECL_METHOD(l_GetClassName);

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

		template<class T>
		static void RegisterLuaxFactoryClass(LuaxState& state);

		template<class T>
		static void RegisterLuaxInterface(LuaxState& state);

		LUAX_DECL_METHOD(l_GC);

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

		template<class T>
		static void RegisterLuaxSingletonClass(LuaxState& state);

	protected:

		LuaxClass();
		~LuaxClass();

		///
		/// userdata pushջûгʼmUserdataʼúԪѳʼõuserdataջ
		///
		bool PushLuaUserdata(LuaxState& state);

	private:

		///
		/// ȡַҪַֻͨڶϴʵõջϺ;̬ıȡַ֤ü׼ȷ
		/// ҪãʹôݶǴݵַ
		///
		void* operator &();

		void BindToLua(LuaxState& state);

		int mRefCount;

		void* mUserdata;
		
	};

	///
	/// ڳԱﴴLuaxStateԲм顣
	///
#define LUAX_SETUP(L, params) \
		LuaxState state(L);\
		if(!state.CheckParams(1, params)) return 0;

#include "luax_class.inl"

}

#endif