1 // =================================
 2 // Copyright (c) 2021 Seppo Laakko
 3 // Distributed under the MIT license
 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& moduleFilePathstd::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::stringint> moduleMap;
42     std::vector<std::std::unique_ptr<Module>>modules;
43     std::unordered_map<boost::uuids::uuidModule*boost::boost::hash<boost::uuids::uuid>>moduleIdMap;
44     void CollectModuleIndices(Module* modulestd::std::unordered_set<int>&moduleIndeces);
45 };
46 
47 void PrepareModuleForCompilation(Module* rootModuleconst std::std::vector<std::string>&referencessngcm::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& moduleFilePathstd::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 } } // namespace cmajor::symbols
68 
69 #endif // CMAJOR_SYMBOLS_MODULE_CACHE_INCLUDED