]> git.tdb.fi Git - libs/game.git/blob - tools/setupgen/enum.cpp
Add a tool for generating setup structs and loaders for them
[libs/game.git] / tools / setupgen / enum.cpp
1 #include "enum.h"
2 #include <msp/io/print.h>
3
4 using namespace std;
5 using namespace Msp;
6
7 Enum::Enum(const string &n):
8         name(n)
9 { }
10
11 void Enum::define_type(IO::Base &out) const
12 {
13         IO::print(out, "enum class %s\n{\n", name);
14         for(auto i=values.begin();; )
15         {
16                 IO::print(out, "\t%s", i->name);
17                 if(i->value)
18                         IO::print(out, " = %d", i->value.value());
19                 ++i;
20                 if(i==values.end())
21                         break;
22                 IO::print(out, ",\n");
23         }
24         IO::print(out, "\n};\n");
25 }
26
27 void Enum::declare_conversions(IO::Base &out) const
28 {
29         IO::print(out, "void operator>>(const Msp::LexicalConverter &, %s &);\n", name);
30         IO::print(out, "void operator<<(Msp::LexicalConverter &, %s);\n", name);
31 }
32
33 void Enum::define_conversions(IO::Base &out) const
34 {
35         IO::print(out, "void operator>>(const Msp::LexicalConverter &conv, %s &_e)\n{\n", name);
36         IO::print(out, "\tconst std::string &str = conv.get();\n\t");
37         for(auto i=values.begin(); i!=values.end(); ++i)
38         {
39                 if(i!=values.begin())
40                         IO::print(out, "else ");
41                 IO::print(out, "if(str==\"%s\")\n\t\t_e = %s::%s;\n\t", i->name, name, i->name);
42         }
43         IO::print(out, "else\n\t\tthrow Msp::lexical_error(Msp::format(\"conversion of '%%s' to %s\", str));\n", name);
44         IO::print(out, "}\n");
45
46         IO::print(out, "\nvoid operator<<(Msp::LexicalConverter &conv, %s _e)\n{\n", name);
47         IO::print(out, "\tswitch(_e)\n\t{\n");
48         for(const Value &v: values)
49                 IO::print(out, "\tcase %s::%s: conv.result(\"%s\"); break;\n", name, v.name, v.name);
50         IO::print(out, "\tdefault: conv.result(Msp::format(\"%s(%%#x)\", static_cast<int>(_e)));\n", name);
51         IO::print(out, "\t}\n}\n");
52 }
53
54
55 Enum::Loader::Loader(Enum &e):
56         ObjectLoader<Enum>(e)
57 {
58         static ActionMap shared_actions;
59         set_actions(shared_actions);
60 }
61
62 void Enum::Loader::init_actions()
63 {
64         add("value", &Loader::value);
65         add("value", &Loader::value_auto);
66 }
67
68 void Enum::Loader::value(const DataFile::Symbol &n, int v)
69 {
70         obj.values.emplace_back(n.name, v);
71 }
72
73 void Enum::Loader::value_auto(const DataFile::Symbol &n)
74 {
75         obj.values.emplace_back(n.name);
76 }