summaryrefslogtreecommitdiff
path: root/examples/resources/lib/reference.lua
blob: ccab7f50fa429245b1be54ab94550834bd440ae0 (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
local Reference = {}
local metatable = {
	__index = Reference,
	__tostring = function( r )
		return tostring( r.t[ r.k ] )
	end,
	__add = function( r, v )
		return r.t[ r.k ] + v
	end,
	__sub = function( r, v )
		return r.t[ r.k ] - v
	end,
	__mul = function( r, v )
		return r.t[ r.k ] * v
	end,
	__div = function( r, v )
		return r.t[ r.k ] / v
	end,
	__mod = function( r, v )
		return math.fmod( r.t[ r.k ], v )
	end,
	__pow = function( r, v )
		return r.t[ r.k ] ^ v
	end,
	__unm = function( r )
		return -r.t[ r.k ]
	end,
	__eq = function( r, v )
		return r.t[ r.k ] == v
	end,
	__len = function( r )
		return #r.t[ r.k ]
	end,
	__lt = function( r, v )
		return r.t[ r.k ] < v
	end,
	__le = function( r, v )
		return r.t[ r.k ] <= v
	end,
	__concat = function( a, b )
		return tostring( a )..tostring( b )
	end,
	__call = function( r, ... )
		return r.t[ r.k ]( ... )
	end,
}

-- Table and key. Note that k should be name of the variable so the type must be string.
function Reference:new( t, k )
	local object = setmetatable( {}, metatable )

	object.t = t
	object.k = k

	return object
end

-- Set new reference. Table and key. Note that k should be name of the variable so the type must be string.
function Reference:ref( t, k )
	self.t = t
	self.k = k
end

function Reference:set( v )
	self.t[ self.k ] = v
end

function Reference:get()
	return self.t[ self.k ]
end

function Reference:unpack()
	return self.t, self.k
end

function Reference:clone()
	return Reference:new( self.t, self.k )
end

function Reference:addEq( v )
	self.t[ self.k ] = self.t[ self.k ] + v
end

function Reference:subEq( v )
	self.t[ self.k ] = self.t[ self.k ] - v
end

function Reference:mulEq( v )
	self.t[ self.k ] = self.t[ self.k ] * v
end

function Reference:divEq( v )
	self.t[ self.k ] = self.t[ self.k ] / v
end

return Reference