Fix compilation on Mac OS X with Qt in custom directory
[lqt/mk.git] / generator / class_types.lua
blob699913ee6cbb9b152fe3c157126bcfae1cb9db54
1 #!/usr/bin/lua
3 lqt = lqt or {}
4 lqt.classes = lqt.classes or {}
6 -- Field explanation:
7 -- * push - push the instance of a class onto Lua stack
8 -- * get - retrieve the instance from Lua stack
9 -- * raw_test - true if the stack index is an instance
10 -- * test - true if the stack index is an instance, or if it is convertible to the type
11 -- * bound - true for generated classes (false for native types)
12 -- * foreign - comes from other module (like QtCore)
14 local pointer_t = function(fn, foreign)
15 local cn = string.gsub(fn, '::', '.')
16 return {
17 -- the argument is a pointer to class
18 push = function(n)
19 return 'lqtL_pushudata(L, '..n..', "'..cn..'*")', 1
20 end,
21 get = function(n)
22 return 'static_cast<'..fn..'*>'
23 ..'(lqtL_toudata(L, '..n..', "'..cn..'*"))', 1
24 end,
25 test = function(n)
26 return 'lqtL_isudata(L, '..n..', "'..cn..'*")', 1
27 end,
28 raw_test = function(n) return 'lqtL_isudata(L, '..n..', "'..cn..'*")', 1 end,
29 onstack = cn..'*,',
30 bound = true,
31 foreign = foreign,
33 end
34 local pointer_const_t = function(fn, foreign)
35 local cn = string.gsub(fn, '::', '.')
36 return {
37 -- the argument is a pointer to constant class instance
38 push = function(n)
39 return 'lqtL_pushudata(L, '..n..', "'..cn..'*")', 1
40 end,
41 get = function(n)
42 local val
43 if typesystem.can_convert[cn] then
44 val = 'lqtL_convert(L, '..n..', "'..cn..'*")'
45 else
46 val = 'lqtL_toudata(L, '..n..', "'..cn..'*")'
47 end
48 return 'static_cast<'..fn..'*>('..val..')', 1
49 end,
50 test = function(n)
51 if typesystem.can_convert[cn] then
52 return 'lqtL_canconvert(L, '..n..', "'..cn..'*")', 1
53 else
54 return 'lqtL_isudata(L, '..n..', "'..cn..'*")', 1
55 end
56 end,
57 raw_test = function(n) return 'lqtL_isudata(L, '..n..', "'..cn..'*")', 1 end,
58 onstack = cn..'*,',
59 bound = true,
60 foreign = foreign,
62 end
63 local ref_t = function(fn, foreign)
64 local cn = string.gsub(fn, '::', '.')
65 return {
66 -- the argument is a reference to class
67 push = function(n)
68 return 'lqtL_pushudata(L, &'..n..', "'..cn..'*")', 1
69 end,
70 get = function(n)
71 return '*static_cast<'..fn..'*>'
72 ..'(lqtL_toudata(L, '..n..', "'..cn..'*"))', 1
73 end,
74 test = function(n)
75 return 'lqtL_isudata(L, '..n..', "'..cn..'*")', 1
76 end,
77 onstack = cn..'*,',
78 bound = true,
79 foreign = foreign,
81 end
82 local instance_t = function(fn, foreign)
83 local cn = string.gsub(fn, '::', '.')
84 return {
85 -- the argument is the class itself
86 push = function(n)
87 return 'lqtL_copyudata(L, &'..n..', "'..cn..'*")', 1
88 end,
89 get = function(n)
90 return '*static_cast<'..fn..'*>'
91 ..'(lqtL_toudata(L, '..n..', "'..cn..'*"))', 1
92 end,
93 test = function(n)
94 return 'lqtL_isudata(L, '..n..', "'..cn..'*")', 1
95 end,
96 onstack = cn..'*,',
97 bound = true,
98 foreign = foreign,
101 local const_ref_t = function(fn, foreign)
102 local cn = string.gsub(fn, '::', '.')
103 return {
104 -- the argument is a pointer to class
105 push = function(n)
106 return 'lqtL_copyudata(L, &'..n..', "'..cn..'*")', 1, string.gsub(fn, ' const&$', '')
107 end,
108 get = function(n)
109 local val
110 if typesystem.can_convert[cn] then
111 val = 'lqtL_convert(L, '..n..', "'..cn..'*")'
112 else
113 val = 'lqtL_toudata(L, '..n..', "'..cn..'*")'
115 return '*static_cast<'..fn..'*>('..val..')', 1
116 end,
117 test = function(n)
118 if typesystem.can_convert[cn] then
119 return 'lqtL_canconvert(L, '..n..', "'..cn..'*")', 1
120 else
121 return 'lqtL_isudata(L, '..n..', "'..cn..'*")', 1
123 end,
124 raw_test = function(n) return 'lqtL_isudata(L, '..n..', "'..cn..'*")', 1 end,
125 onstack = cn..'*,',
126 bound = true,
127 foreign = foreign,
131 local const_ptr_ref_t = pointer_const_t
133 lqt.classes.insert = function(cname, foreign)
134 if typesystem[cname]==nil then
135 typesystem[cname..'*'] = pointer_t(cname, foreign)
136 typesystem[cname..' const*'] = pointer_const_t(cname, foreign)
137 typesystem[cname..'&'] = ref_t(cname, foreign)
139 typesystem[cname] = instance_t(cname, foreign)
140 typesystem[cname..' const'] = instance_t(cname, foreign)
141 typesystem[cname..' const&'] = const_ref_t(cname, foreign)
142 typesystem[cname..'* const&'] = const_ptr_ref_t(cname, foreign)
144 return true
145 else
146 return nil