aboutsummaryrefslogtreecommitdiff
path: root/src/lua/luaopen_types.h
blob: be59157b6bfc2d041453f35dce4f497f9cb70be2 (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
#ifndef __JIN_M_TYPES_H
#define __JIN_M_TYPES_H

// graphics module
#define JIN_GRAPHICS_IMAGE     "jin.graphics.Image"
#define JIN_GRAPHICS_SHADER    "jin.graphics.Shader"
#define JIN_GRAPHICS_CANVAS    "jin.graphics.Canvas"
#define JIN_GRAPHICS_FONT      "jin.graphics.Font"

// audio module
#define JIN_AUDIO_SOURCE       "jin.Audio.Source"

// thread module 
#define JIN_THREAD_THREAD      "jin.thread.Thread"

// network module 
#define JIN_NETWORK_SOCKET     "jin.net.Socket"
#define JIN_NETWORK_BUFFER     "jin.net.Buffer"

namespace jin 
{
namespace lua 
{

	class Reference
	{
	public:

		Reference(void* obj)
			: count(1)
			, object(obj)
		{
		}
		void retain()
		{
			++count;
		}
		void release()
		{
			if (--count <= 0)
				delete this;
		}

	protected:
		Reference(const Reference&);
		virtual ~Reference()
		{
		}
		void* object;
		int count;

	};

	template<class T>
	class Ref : public Reference
	{
	public:
		Ref(T* obj)
			: Reference(obj)
		{
		}
		~Ref()
		{
			T* obj = (T*)object;
			delete obj;
		}
		T& operator *()
		{
			T* obj = (T*)object;
			return *obj;
		}
	private:
		Ref(const Ref<T>& ref);
	};

	class Proxy
	{
	public:
		void bind(Reference* ref, const char* t)
		{
            if (ref == nullptr)
                return;
			reference = ref; 
            type = t;
		}

        void release()
        {
            if (reference != nullptr)
            {
				reference->release();
				reference = nullptr;
                type = nullptr;
            }
        }

		template<class T>
		Ref<T>& getRef()
		{
			Ref<T>* ref = (Ref<T>*) reference;
			return *ref;
		}

		Reference* reference; // acctual object binded
		const char* type;   // type name and metatable name
	};

} // lua
} // jin

#endif