From 7d8bca09b3c4bf1418e758bd3bd0d6f85672153e Mon Sep 17 00:00:00 2001 From: rtk0c Date: Mon, 30 May 2022 15:52:19 -0700 Subject: Changeset: 52 Add support for namespaced enums --- buildtools/codegen/CodegenInput.inl | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) (limited to 'buildtools/codegen/CodegenInput.inl') diff --git a/buildtools/codegen/CodegenInput.inl b/buildtools/codegen/CodegenInput.inl index 80a39d0..0809e7f 100644 --- a/buildtools/codegen/CodegenInput.inl +++ b/buildtools/codegen/CodegenInput.inl @@ -3,20 +3,26 @@ #include "CodegenConfig.hpp" #include "CodegenDecl.hpp" +#include "CodegenUtils.inl" + #include #include #include #include +#include #include +using namespace std::literals; + class CodegenInput { private: std::vector mEnums; - robin_hood::unordered_map mDeclByName; + robin_hood::unordered_flat_map mDeclByName; + robin_hood::unordered_node_map mNamespaces; public: - void AddEnum(DeclEnum decl) { + void AddEnum(std::string fullname, DeclEnum decl) { #if CODEGEN_DEBUG_PRINT printf("Committed enum '%s'\n", decl.name.c_str()); for (auto& elm : decl.elements) { @@ -24,10 +30,20 @@ public: } #endif - mDeclByName.try_emplace(std::string(decl.name), mEnums.size()); + mDeclByName.try_emplace(std::move(fullname), mEnums.size()); mEnums.push_back(std::move(decl)); } + DeclNamespace* AddNamespace(DeclNamespace ns) { + auto path = Utils::MakeFullName(""sv, &ns); + auto [iter, success] = mNamespaces.try_emplace(std::move(path), std::move(ns)); + auto& nsRef = iter->second; + if (success) { + nsRef.fullname = iter->first; + } + return &nsRef; + } + const DeclEnum* FindEnumByName(std::string_view name) const { // TODO handle multiple kinds of decl auto iter = mDeclByName.find(name); @@ -37,4 +53,17 @@ public: return nullptr; } } + + const DeclNamespace* FindNamespace(std::string_view fullname) const { + auto iter = mNamespaces.find(fullname); + if (iter != mNamespaces.end()) { + return &iter->second; + } else { + return nullptr; + } + } + + DeclNamespace* FindNamespace(std::string_view name) { + return const_cast(const_cast(this)->FindNamespace(name)); + } }; -- cgit v1.2.3-70-g09d2