#pragma once #include "CodegenConfig.hpp" #include "CodegenDecl.hpp" #include "CodegenModel.hpp" #include "CodegenUtils.hpp" #include #include #include #include #include using namespace std::literals; class CodegenRuntimeModel { private: class Private; Private* m; public: CodegenRuntimeModel(); ~CodegenRuntimeModel(); // Implementation detail helper, don't use outside Private& GetPimpl() const { return *m; } DeclEnum* AddEnum(std::string fullname, DeclEnum decl); DeclStruct* AddStruct(std::string fullname, DeclStruct decl); const DeclEnum* FindEnum(std::string_view name) const; const DeclStruct* FindStruct(std::string_view name) const; DeclNamespace* AddNamespace(DeclNamespace ns); const DeclNamespace* FindNamespace(std::string_view fullname) const; DeclNamespace* FindNamespace(std::string_view name); }; class CodegenArchiveModel { private: class Private; Private* m; public: CodegenArchiveModel(std::string_view dbPath); ~CodegenArchiveModel(); // Implementation detail helper, don't use outside Private& GetPimpl() const { return *m; } void DeleteDeclsRelatedToFile(std::string_view filename); void Store(const CodegenRuntimeModel& model); void LoadInto(CodegenRuntimeModel& model) const; CodegenRuntimeModel Load() const; void StoreStruct(const DeclStruct& decl); void StoreFunction(const DeclFunction& decl); void StoreEnum(const DeclEnum& decl); };