aboutsummaryrefslogtreecommitdiff
path: root/src/libjin-lua/common/l_shared.hpp
blob: 11f28b341e1e212bda18595fc41f5ac594a6aabc (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
#ifndef __JE_LUA_SHARED_H__
#define __JE_LUA_SHARED_H__

#include <map>
#include <vector>
#include <functional>

#include "libjin/jin.h"

namespace JinEngine
{
	namespace Lua
	{

		class LuaObject;

		///
		/// Thread shared object wrapper.
		///
		class Shared
		{
		public:
			Shared(Object* obj)
				: mCount(0)
				, mObject(obj)
			{
			}

			inline Object* operator->()
			{
				return static_cast<Object*>(mObject);
			}

			inline Object* getObject()
			{
				return static_cast<Object*>(mObject);
			}

			template<class T>
			inline T* getObject()
			{
				return static_cast<T*>(mObject);
			}

		private:
			friend class LuaObject;

			// Disable copy.
			Shared(const Shared& shared);

			///
			/// Sharedֻڶ
			///
			~Shared()
			{
				delete mObject;
			}

			///
			/// ͬһ̵߳lua_StateУLuaObjectEngineObjectӦһһӦLuaObject(lua runtime)ü
			/// ͻաEngine-sideüΪά̵ͬ߳lua_StateͬһEngineObjectÿLuaObjectһ
			/// Sharedʱһüͬһ߳УһEngineObjectֻһLuaObject󶨣new 
			/// instanceУômCountͱEngineObjectĹ߳
			///
			inline void Shared::retain()
			{
				++mCount;
			}

			inline void Shared::release()
			{
				if (--mCount <= 0)
					delete this;
			}

			Object* mObject;
			int mCount;

		};
		
	} // namespace Lua
} // namespace JinEngine

#endif