|
18 | 18 |
|
19 | 19 | #include "message.h"
|
20 | 20 | #include "symbol_table.h"
|
| 21 | +#include "language.h" |
21 | 22 |
|
22 | 23 | class language_filet;
|
23 |
| -class languaget; |
24 | 24 |
|
25 | 25 | class language_modulet final
|
26 | 26 | {
|
@@ -51,29 +51,52 @@ class language_filet final
|
51 | 51 | const irep_idt &id,
|
52 | 52 | symbol_tablet &symbol_table);
|
53 | 53 |
|
54 |
| - language_filet(); |
| 54 | + explicit language_filet(const std::string &filename); |
55 | 55 | language_filet(const language_filet &rhs);
|
56 | 56 |
|
57 | 57 | ~language_filet();
|
58 | 58 | };
|
59 | 59 |
|
60 | 60 | class language_filest:public messaget
|
61 | 61 | {
|
62 |
| -public: |
| 62 | +private: |
63 | 63 | typedef std::map<std::string, language_filet> file_mapt;
|
64 | 64 | file_mapt file_map;
|
65 | 65 |
|
66 |
| - // Contains pointers into file_mapt! |
67 | 66 | typedef std::map<std::string, language_modulet> module_mapt;
|
68 | 67 | module_mapt module_map;
|
69 | 68 |
|
70 |
| - // Contains pointers into filemapt! |
| 69 | + // Contains pointers into file_map! |
71 | 70 | // This is safe-ish as long as this is std::map.
|
72 | 71 | typedef std::map<irep_idt, language_filet *> lazy_method_mapt;
|
73 | 72 | lazy_method_mapt lazy_method_map;
|
74 | 73 |
|
| 74 | +public: |
| 75 | + language_filet &add_file(const std::string &filename) |
| 76 | + { |
| 77 | + language_filet language_file(filename); |
| 78 | + return file_map.emplace(filename, std::move(language_file)).first->second; |
| 79 | + } |
| 80 | + |
| 81 | + void remove_file(const std::string &filename) |
| 82 | + { |
| 83 | + // Clear relevant entries from lazy_method_map |
| 84 | + language_filet *language_file = &file_map.at(filename); |
| 85 | + id_sett files_methods; |
| 86 | + for(const std::pair<irep_idt, language_filet *> &method : lazy_method_map) |
| 87 | + { |
| 88 | + if(method.second == language_file) |
| 89 | + files_methods.insert(method.first); |
| 90 | + } |
| 91 | + for(const irep_idt &method_name : files_methods) |
| 92 | + lazy_method_map.erase(method_name); |
| 93 | + |
| 94 | + file_map.erase(filename); |
| 95 | + } |
| 96 | + |
75 | 97 | void clear_files()
|
76 | 98 | {
|
| 99 | + lazy_method_map.clear(); |
77 | 100 | file_map.clear();
|
78 | 101 | }
|
79 | 102 |
|
|
0 commit comments