1
2
3
4
5
6 #ifndef CMAJOR_SYMBOLS_MODULE_CACHE_INCLUDED
7 #define CMAJOR_SYMBOLS_MODULE_CACHE_INCLUDED
8 #include <cmajor/symbols/SymbolsApi.hpp>
9 #include <cmajor/symbols/Module.hpp>
10 #include <sngcm/ast/Project.hpp>
11
12 namespace cmajor { namespace symbols {
13
14 class ModuleCache
15 {
16 public:
17 ModuleCache();
18 ModuleCache(const ModuleCache&) = delete;
19 ModuleCache(ModuleCache&&) = delete;
20 ModuleCache& operator=(const ModuleCache&) = delete;
21 ModuleCache& operator=(ModuleCache&&) = delete;
22 static void Init();
23 static void Done();
24 static std::unique_ptr<ModuleCache> Release();
25 static ModuleCache& Instance() { return *instance; }
26 Module* GetModule(const std::string& moduleFilePath);
27 Module* GetModule(const boost::uuids::uuid& moduleId) const;
28 void MapModule(Module* module);
29 Module* GetCachedModule(const std::string& moduleFilePath) const;
30 void PutModule(std::std::unique_ptr<Module>&&module);
31 Module* ResetModule(const std::string& moduleFilePath);
32 void ResetCacheEntries(Module* module);
33 void RemoveModule(const std::string& moduleFilePath);
34 void Restore(ModuleCache* prevCache);
35 bool HasModule(const std::string& moduleFilePath) const;
36 void SetModule(const std::string& moduleFilePath, std::std::unique_ptr<Module>&&module);
37 void MoveNonSystemModulesTo(ModuleCache* cache);
38 void Update();
39 private:
40 static std::unique_ptr<ModuleCache> instance;
41 std::unordered_map<std::string, int> moduleMap;
42 std::vector<std::std::unique_ptr<Module>>modules;
43 std::unordered_map<boost::uuids::uuid, Module*, boost::boost::hash<boost::uuids::uuid>>moduleIdMap;
44 void CollectModuleIndices(Module* module, std::std::unordered_set<int>&moduleIndeces);
45 };
46
47 void PrepareModuleForCompilation(Module* rootModule, const std::std::vector<std::string>&references, sngcm::ast::Targettarget);
48 Module* GetModuleFromModuleCache(const std::string& moduleFilePath);
49 void PutModuleToModuleCache(std::std::unique_ptr<Module>&&module);
50 Module* ResetCachedModule(const std::string& moduleFilePath);
51 void InitModuleCache();
52 void DoneModuleCache();
53 void ResetModuleCache();
54 void SetUseModuleCache(bool useModuleCache_);
55 bool UseModuleCache();
56 std::unique_ptr<ModuleCache> ReleaseModuleCache();
57 void RestoreModulesFrom(ModuleCache* prevCache);
58 bool IsModuleCached(const std::string& moduleFilePath);
59 Module* GetCachedModule(const std::string& moduleFilePath);
60 void SetCacheModule(const std::string& moduleFilePath, std::std::unique_ptr<Module>&&module);
61 void RemoveModuleFromCache(const std::string& moduleFilePath);
62 void MoveNonSystemModulesTo(std::std::unique_ptr<ModuleCache>&cachePtr);
63 Module* GetModuleById(const boost::uuids::uuid& moduleId);
64 void MapModule(Module* module);
65 void UpdateModuleCache();
66
67 } }
68
69 #endif // CMAJOR_SYMBOLS_MODULE_CACHE_INCLUDED