1 module("enums", package
.seeall
)
3 local print_enum
= fprint(assert(io
.open(module_name
.._src
..module_name
..'_enum.cpp', 'w')))
5 local function filter(enum
)
6 local n
= enum
.xarg
.name
7 if n
~=string.lower(n
) and not string.match(n
, '_') then
15 local function copy_enums(index
)
16 for e
in pairs(index
) do
18 and not string.match(e
.xarg
.fullname
, '%b<>') then
19 if e
.xarg
.access
=='public' and not filter(e
) then
20 enum_list
[e
.xarg
.fullname
] = e
21 elseif e
.xarg
.access
== 'protected' then
23 enum_list
[e
.xarg
.fullname
] = e
24 local c
= fullnames
[e
.xarg
.context
]
25 assert(type(c
) == "table" and c
.label
== "Class", "cannot find parent of enum "..e
.xarg
.fullname
)
26 if not c
.protected_enums
then c
.protected_enums
= {} end
27 table.insert(c
.protected_enums
, e
)
33 local function fill_enum_values()
34 for _
,e
in pairs(enum_list
) do
36 for _
, v
in ipairs(e
) do
37 if v
.label
=='Enumerator' then
38 table.insert(values
, v
)
45 function fill_enum_tables()
46 for _
,e
in pairs(enum_list
) do
47 local table = 'lqt_Enum lqt_enum'..e
.xarg
.id
..'[] = {\n'
48 for _
,v
in pairs(e
.values
) do
49 table = table .. ' { "' .. v
.xarg
.name
50 .. '", static_cast<int>('..v
.xarg
.fullname
..') },\n'
52 table = table .. ' { 0, 0 }\n'
53 table = table .. '};\n'
58 function fill_typesystem(types
)
59 local etype
= function(en
)
62 return 'lqtL_pushenum(L, '..n
..', "'..string.gsub(en
, '::', '.')..'")', 1
65 return 'static_cast<'..en
..'>'
66 ..'(lqtL_toenum(L, '..n
..', "'..string.gsub(en
, '::', '.')..'"))', 1
69 return 'lqtL_isenum(L, '..n
..', "'..string.gsub(en
, '::', '.')..'")', 1
71 onstack
= string.gsub(en
, '::', '.')..',',
72 defect
= 10, -- check these last
75 for _
,e
in pairs(enum_list
) do
76 if not types
[e
.xarg
.fullname
] then
77 types
[e
.xarg
.fullname
] = etype(e
.xarg
.fullname
)
79 --io.stderr:write(e.xarg.fullname, ': already present\n')
85 function print_enum_tables()
86 for _
,e
in pairs(enum_list
) do
87 if e
.xarg
.access
== 'public' then print_enum('static ' .. e
.enum_table
) end
92 function print_enum_creator(mod)
93 local out
= 'static lqt_Enumlist lqt_enum_list[] = {\n'
94 for _
,e
in pairs(enum_list
) do
95 if e
.xarg
.access
== 'public' then
96 out
= out
..' { lqt_enum'..e
.xarg
.id
..', "'..string.gsub(e
.xarg
.fullname
, "::", ".")..'" },\n'
99 out
= out
..' { 0, 0 },\n};\n'
100 out
= out
.. 'void lqt_create_enums_'..mod..' (lua_State *L) {\n'
101 out
= out
.. ' lqtL_createenumlist(L, lqt_enum_list); return;\n}\n'
105 ---------------------------------------------------------------------
107 function preprocess(index
)
111 function process(index
, types
)
114 fill_typesystem(types
)
118 print_enum(output_includes
)
120 print_enum_creator(module_name
)