2 #include <msp/io/print.h>
7 Enum::Enum(const string &n):
11 void Enum::define_type(IO::Base &out) const
13 IO::print(out, "enum class %s\n{\n", name);
14 for(auto i=values.begin();; )
16 IO::print(out, "\t%s", i->name);
18 IO::print(out, " = %d", i->value.value());
22 IO::print(out, ",\n");
24 IO::print(out, "\n};\n");
27 void Enum::declare_conversions(IO::Base &out) const
29 IO::print(out, "void operator>>(const Msp::LexicalConverter &, %s &);\n", name);
30 IO::print(out, "void operator<<(Msp::LexicalConverter &, %s);\n", name);
33 void Enum::define_conversions(IO::Base &out) const
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)
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);
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");
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");
55 Enum::Loader::Loader(Enum &e):
58 static ActionMap shared_actions;
59 set_actions(shared_actions);
62 void Enum::Loader::init_actions()
64 add("value", &Loader::value);
65 add("value", &Loader::value_auto);
68 void Enum::Loader::value(const DataFile::Symbol &n, int v)
70 obj.values.emplace_back(n.name, v);
73 void Enum::Loader::value_auto(const DataFile::Symbol &n)
75 obj.values.emplace_back(n.name);