]> git.tdb.fi Git - libs/game.git/blob - tools/setupgen/setupgen.h
1ff2b8d9800af80d626803e4a6907eec25230e14
[libs/game.git] / tools / setupgen / setupgen.h
1 #ifndef SETUPGEN_H_
2 #define SETUPGEN_H_
3
4 #include <list>
5 #include <map>
6 #include <memory>
7 #include <set>
8 #include <string>
9 #include <msp/core/application.h>
10 #include <msp/datafile/objectloader.h>
11 #include <msp/fs/path.h>
12 #include "enum.h"
13 #include "struct.h"
14 #include "type.h"
15
16 class SetupGen: public Msp::RegisteredApplication<SetupGen>
17 {
18 private:
19         struct Module
20         {
21                 std::string name_space;
22                 std::vector<std::unique_ptr<Enum>> enums;
23                 std::vector<std::unique_ptr<Struct>> structs;
24         };
25
26         class Loader: public Msp::DataFile::ObjectLoader<SetupGen>
27         {
28         private:
29                 Module &mod;
30
31         public:
32                 Loader(SetupGen &, Module &);
33
34         private:
35                 void init_actions() override;
36
37                 void enum_def(const Msp::DataFile::Symbol &);
38                 void import(const std::string &);
39                 void name_space(const std::string &);
40                 void struct_def(Struct::Kind, const Msp::DataFile::Symbol &);
41         };
42
43         std::string in_fn;
44         std::string out_fn;
45         std::vector<Msp::FS::Path> import_path;
46         std::list<Module> modules;
47         std::map<std::string, Type> types;
48         std::vector<std::unique_ptr<Enum>> enums;
49         std::vector<std::unique_ptr<Struct>> structs;
50         std::set<std::string> headers;
51
52 public:
53         SetupGen(int, char **);
54
55         int main() override;
56 private:
57         void create_standard_types();
58         Type &add_type(const std::string &, Type::Kind);
59 public:
60         const Type &get_type(const std::string &) const;
61
62 private:
63         void load(const Msp::FS::Path &);
64         void collect_headers(const Module &);
65         void generate_header(const Module &, Msp::IO::Base &) const;
66         void generate_code(const Module &, Msp::IO::Base &) const;
67 };
68
69 #endif